aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/c-ares/src/lib
diff options
context:
space:
mode:
authorthegeorg <thegeorg@yandex-team.com>2024-07-30 09:57:24 +0300
committerthegeorg <thegeorg@yandex-team.com>2024-07-30 10:08:52 +0300
commit5b405616d0467647cb365e71237976a9f3810b42 (patch)
treec35e742877f95ba2b9357f178197c755f121cb1a /contrib/libs/c-ares/src/lib
parent997c68115bc1c9dd2fce5a6a6f8eae92ad628df7 (diff)
downloadydb-5b405616d0467647cb365e71237976a9f3810b42.tar.gz
Update contrib/libs/c-ares to 1.28.1
db71d0a3bd9ec3cf1e1ccb5a9cfac8abfd43fdb7
Diffstat (limited to 'contrib/libs/c-ares/src/lib')
-rw-r--r--contrib/libs/c-ares/src/lib/ares__addrinfo2hostent.c317
-rw-r--r--contrib/libs/c-ares/src/lib/ares__addrinfo_localhost.c250
-rw-r--r--contrib/libs/c-ares/src/lib/ares__buf.c1013
-rw-r--r--contrib/libs/c-ares/src/lib/ares__buf.h401
-rw-r--r--contrib/libs/c-ares/src/lib/ares__close_sockets.c63
-rw-r--r--contrib/libs/c-ares/src/lib/ares__get_hostent.c271
-rw-r--r--contrib/libs/c-ares/src/lib/ares__hosts_file.c1030
-rw-r--r--contrib/libs/c-ares/src/lib/ares__htable.c340
-rw-r--r--contrib/libs/c-ares/src/lib/ares__htable.h72
-rw-r--r--contrib/libs/c-ares/src/lib/ares__htable_asvp.c133
-rw-r--r--contrib/libs/c-ares/src/lib/ares__htable_asvp.h54
-rw-r--r--contrib/libs/c-ares/src/lib/ares__htable_strvp.c198
-rw-r--r--contrib/libs/c-ares/src/lib/ares__htable_strvp.h118
-rw-r--r--contrib/libs/c-ares/src/lib/ares__htable_szvp.c (renamed from contrib/libs/c-ares/src/lib/ares__htable_stvp.c)122
-rw-r--r--contrib/libs/c-ares/src/lib/ares__htable_szvp.h (renamed from contrib/libs/c-ares/src/lib/ares__htable_stvp.h)54
-rw-r--r--contrib/libs/c-ares/src/lib/ares__iface_ips.c592
-rw-r--r--contrib/libs/c-ares/src/lib/ares__iface_ips.h139
-rw-r--r--contrib/libs/c-ares/src/lib/ares__llist.c188
-rw-r--r--contrib/libs/c-ares/src/lib/ares__llist.h79
-rw-r--r--contrib/libs/c-ares/src/lib/ares__parse_into_addrinfo.c302
-rw-r--r--contrib/libs/c-ares/src/lib/ares__read_line.c84
-rw-r--r--contrib/libs/c-ares/src/lib/ares__readaddrinfo.c265
-rw-r--r--contrib/libs/c-ares/src/lib/ares__slist.c362
-rw-r--r--contrib/libs/c-ares/src/lib/ares__slist.h75
-rw-r--r--contrib/libs/c-ares/src/lib/ares__socket.c480
-rw-r--r--contrib/libs/c-ares/src/lib/ares__sortaddrinfo.c521
-rw-r--r--contrib/libs/c-ares/src/lib/ares__threads.c607
-rw-r--r--contrib/libs/c-ares/src/lib/ares__threads.h60
-rw-r--r--contrib/libs/c-ares/src/lib/ares__timeval.c41
-rw-r--r--contrib/libs/c-ares/src/lib/ares_android.c325
-rw-r--r--contrib/libs/c-ares/src/lib/ares_android.h4
-rw-r--r--contrib/libs/c-ares/src/lib/ares_cancel.c38
-rw-r--r--contrib/libs/c-ares/src/lib/ares_config-linux.h125
-rw-r--r--contrib/libs/c-ares/src/lib/ares_create_query.c206
-rw-r--r--contrib/libs/c-ares/src/lib/ares_data.c230
-rw-r--r--contrib/libs/c-ares/src/lib/ares_data.h48
-rw-r--r--contrib/libs/c-ares/src/lib/ares_destroy.c108
-rw-r--r--contrib/libs/c-ares/src/lib/ares_dns_mapping.c919
-rw-r--r--contrib/libs/c-ares/src/lib/ares_dns_name.c676
-rw-r--r--contrib/libs/c-ares/src/lib/ares_dns_parse.c1255
-rw-r--r--contrib/libs/c-ares/src/lib/ares_dns_private.h263
-rw-r--r--contrib/libs/c-ares/src/lib/ares_dns_record.c1449
-rw-r--r--contrib/libs/c-ares/src/lib/ares_dns_write.c1054
-rw-r--r--contrib/libs/c-ares/src/lib/ares_event.h174
-rw-r--r--contrib/libs/c-ares/src/lib/ares_event_epoll.c198
-rw-r--r--contrib/libs/c-ares/src/lib/ares_event_kqueue.c249
-rw-r--r--contrib/libs/c-ares/src/lib/ares_event_poll.c141
-rw-r--r--contrib/libs/c-ares/src/lib/ares_event_select.c151
-rw-r--r--contrib/libs/c-ares/src/lib/ares_event_thread.c452
-rw-r--r--contrib/libs/c-ares/src/lib/ares_event_wake_pipe.c166
-rw-r--r--contrib/libs/c-ares/src/lib/ares_event_win32.c601
-rw-r--r--contrib/libs/c-ares/src/lib/ares_event_win32.h119
-rw-r--r--contrib/libs/c-ares/src/lib/ares_expand_name.c308
-rw-r--r--contrib/libs/c-ares/src/lib/ares_expand_string.c81
-rw-r--r--contrib/libs/c-ares/src/lib/ares_fds.c54
-rw-r--r--contrib/libs/c-ares/src/lib/ares_free_hostent.c15
-rw-r--r--contrib/libs/c-ares/src/lib/ares_freeaddrinfo.c32
-rw-r--r--contrib/libs/c-ares/src/lib/ares_getaddrinfo.c1071
-rw-r--r--contrib/libs/c-ares/src/lib/ares_gethostbyaddr.c333
-rw-r--r--contrib/libs/c-ares/src/lib/ares_gethostbyname.c392
-rw-r--r--contrib/libs/c-ares/src/lib/ares_getnameinfo.c627
-rw-r--r--contrib/libs/c-ares/src/lib/ares_getsock.c45
-rw-r--r--contrib/libs/c-ares/src/lib/ares_inet_net_pton.h2
-rw-r--r--contrib/libs/c-ares/src/lib/ares_init.c2489
-rw-r--r--contrib/libs/c-ares/src/lib/ares_ipv6.h41
-rw-r--r--contrib/libs/c-ares/src/lib/ares_library_init.c132
-rw-r--r--contrib/libs/c-ares/src/lib/ares_math.c145
-rw-r--r--contrib/libs/c-ares/src/lib/ares_mkquery.c35
-rw-r--r--contrib/libs/c-ares/src/lib/ares_nowarn.c269
-rw-r--r--contrib/libs/c-ares/src/lib/ares_nowarn.h70
-rw-r--r--contrib/libs/c-ares/src/lib/ares_options.c709
-rw-r--r--contrib/libs/c-ares/src/lib/ares_parse_a_reply.c66
-rw-r--r--contrib/libs/c-ares/src/lib/ares_parse_aaaa_reply.c67
-rw-r--r--contrib/libs/c-ares/src/lib/ares_parse_caa_reply.c278
-rw-r--r--contrib/libs/c-ares/src/lib/ares_parse_mx_reply.c180
-rw-r--r--contrib/libs/c-ares/src/lib/ares_parse_naptr_reply.c222
-rw-r--r--contrib/libs/c-ares/src/lib/ares_parse_ns_reply.c226
-rw-r--r--contrib/libs/c-ares/src/lib/ares_parse_ptr_reply.c344
-rw-r--r--contrib/libs/c-ares/src/lib/ares_parse_soa_reply.c206
-rw-r--r--contrib/libs/c-ares/src/lib/ares_parse_srv_reply.c200
-rw-r--r--contrib/libs/c-ares/src/lib/ares_parse_txt_reply.c257
-rw-r--r--contrib/libs/c-ares/src/lib/ares_parse_uri_reply.c206
-rw-r--r--contrib/libs/c-ares/src/lib/ares_platform.c21909
-rw-r--r--contrib/libs/c-ares/src/lib/ares_private.h699
-rw-r--r--contrib/libs/c-ares/src/lib/ares_process.c1630
-rw-r--r--contrib/libs/c-ares/src/lib/ares_qcache.c444
-rw-r--r--contrib/libs/c-ares/src/lib/ares_query.c187
-rw-r--r--contrib/libs/c-ares/src/lib/ares_rand.c181
-rw-r--r--contrib/libs/c-ares/src/lib/ares_search.c755
-rw-r--r--contrib/libs/c-ares/src/lib/ares_send.c212
-rw-r--r--contrib/libs/c-ares/src/lib/ares_setup.h77
-rw-r--r--contrib/libs/c-ares/src/lib/ares_str.c269
-rw-r--r--contrib/libs/c-ares/src/lib/ares_str.h (renamed from contrib/libs/c-ares/src/lib/ares_strdup.c)60
-rw-r--r--contrib/libs/c-ares/src/lib/ares_strcasecmp.c33
-rw-r--r--contrib/libs/c-ares/src/lib/ares_strdup.h34
-rw-r--r--contrib/libs/c-ares/src/lib/ares_strerror.c90
-rw-r--r--contrib/libs/c-ares/src/lib/ares_strsplit.c131
-rw-r--r--contrib/libs/c-ares/src/lib/ares_strsplit.h13
-rw-r--r--contrib/libs/c-ares/src/lib/ares_sysconfig.c1111
-rw-r--r--contrib/libs/c-ares/src/lib/ares_sysconfig_files.c811
-rw-r--r--contrib/libs/c-ares/src/lib/ares_timeout.c50
-rw-r--r--contrib/libs/c-ares/src/lib/ares_update_servers.c1195
-rw-r--r--contrib/libs/c-ares/src/lib/ares_version.c3
-rw-r--r--contrib/libs/c-ares/src/lib/bitncmp.c60
-rw-r--r--contrib/libs/c-ares/src/lib/bitncmp.h35
-rw-r--r--contrib/libs/c-ares/src/lib/config-win32.h130
-rw-r--r--contrib/libs/c-ares/src/lib/inet_net_pton.c318
-rw-r--r--contrib/libs/c-ares/src/lib/inet_ntop.c103
-rw-r--r--contrib/libs/c-ares/src/lib/setup_once.h474
-rw-r--r--contrib/libs/c-ares/src/lib/windows_port.c13
110 files changed, 34900 insertions, 22411 deletions
diff --git a/contrib/libs/c-ares/src/lib/ares__addrinfo2hostent.c b/contrib/libs/c-ares/src/lib/ares__addrinfo2hostent.c
index 1798fc69fa..95717890c2 100644
--- a/contrib/libs/c-ares/src/lib/ares__addrinfo2hostent.c
+++ b/contrib/libs/c-ares/src/lib/ares__addrinfo2hostent.c
@@ -54,147 +54,143 @@
#include "ares_inet_net_pton.h"
#include "ares_private.h"
-int ares__addrinfo2hostent(const struct ares_addrinfo *ai, int family,
- struct hostent **host)
+ares_status_t ares__addrinfo2hostent(const struct ares_addrinfo *ai, int family,
+ struct hostent **host)
{
- struct ares_addrinfo_node *next;
+ struct ares_addrinfo_node *next;
struct ares_addrinfo_cname *next_cname;
- char **aliases = NULL;
- char *addrs = NULL;
- int naliases = 0, naddrs = 0, alias = 0, i;
-
- if (ai == NULL || host == NULL)
+ char **aliases = NULL;
+ char *addrs = NULL;
+ size_t naliases = 0;
+ size_t naddrs = 0;
+ size_t alias = 0;
+ size_t i;
+
+ if (ai == NULL || host == NULL) {
return ARES_EBADQUERY;
-
- *host = ares_malloc(sizeof(**host));
- if (!(*host))
- {
- goto enomem;
- }
- memset(*host, 0, sizeof(**host));
+ }
/* Use the first node of the response as the family, since hostent can only
* represent one family. We assume getaddrinfo() returned a sorted list if
* the user requested AF_UNSPEC. */
- if (family == AF_UNSPEC && ai->nodes)
+ if (family == AF_UNSPEC && ai->nodes) {
family = ai->nodes->ai_family;
+ }
+
+ if (family != AF_INET && family != AF_INET6) {
+ return ARES_EBADQUERY;
+ }
+
+ *host = ares_malloc(sizeof(**host));
+ if (!(*host)) {
+ goto enomem;
+ }
+ memset(*host, 0, sizeof(**host));
next = ai->nodes;
- while (next)
- {
- if(next->ai_family == family)
- {
- ++naddrs;
- }
- next = next->ai_next;
+ while (next) {
+ if (next->ai_family == family) {
+ ++naddrs;
}
+ next = next->ai_next;
+ }
next_cname = ai->cnames;
- while (next_cname)
- {
- if(next_cname->alias)
- ++naliases;
- next_cname = next_cname->next;
+ while (next_cname) {
+ if (next_cname->alias) {
+ ++naliases;
}
+ next_cname = next_cname->next;
+ }
aliases = ares_malloc((naliases + 1) * sizeof(char *));
- if (!aliases)
- {
- goto enomem;
- }
+ if (!aliases) {
+ goto enomem;
+ }
(*host)->h_aliases = aliases;
memset(aliases, 0, (naliases + 1) * sizeof(char *));
- if (naliases)
- {
- next_cname = ai->cnames;
- while (next_cname)
- {
- if(next_cname->alias) {
- aliases[alias] = ares_strdup(next_cname->alias);
- if (!aliases[alias]) {
- goto enomem;
- }
- alias++;
- }
- next_cname = next_cname->next;
- }
+ if (naliases) {
+ for (next_cname = ai->cnames; next_cname != NULL;
+ next_cname = next_cname->next) {
+ if (next_cname->alias == NULL) {
+ continue;
+ }
+ aliases[alias] = ares_strdup(next_cname->alias);
+ if (!aliases[alias]) {
+ goto enomem;
+ }
+ alias++;
}
+ }
(*host)->h_addr_list = ares_malloc((naddrs + 1) * sizeof(char *));
- if (!(*host)->h_addr_list)
- {
- goto enomem;
- }
+ if (!(*host)->h_addr_list) {
+ goto enomem;
+ }
memset((*host)->h_addr_list, 0, (naddrs + 1) * sizeof(char *));
- if (ai->cnames)
- {
- (*host)->h_name = ares_strdup(ai->cnames->name);
- if ((*host)->h_name == NULL && ai->cnames->name)
- {
- goto enomem;
- }
+ if (ai->cnames) {
+ (*host)->h_name = ares_strdup(ai->cnames->name);
+ if ((*host)->h_name == NULL && ai->cnames->name) {
+ goto enomem;
}
- else
- {
- (*host)->h_name = ares_strdup(ai->name);
- if ((*host)->h_name == NULL && ai->name)
- {
- goto enomem;
- }
+ } else {
+ (*host)->h_name = ares_strdup(ai->name);
+ if ((*host)->h_name == NULL && ai->name) {
+ goto enomem;
+ }
+ }
+
+ (*host)->h_addrtype = (HOSTENT_ADDRTYPE_TYPE)family;
+
+ if (family == AF_INET) {
+ (*host)->h_length = sizeof(struct in_addr);
+ }
+
+ if (family == AF_INET6) {
+ (*host)->h_length = sizeof(struct ares_in6_addr);
+ }
+
+ if (naddrs) {
+ addrs = ares_malloc(naddrs * (size_t)(*host)->h_length);
+ if (!addrs) {
+ goto enomem;
}
- (*host)->h_addrtype = family;
- (*host)->h_length = (family == AF_INET)?
- sizeof(struct in_addr):sizeof(struct ares_in6_addr);
-
- if (naddrs)
- {
- addrs = ares_malloc(naddrs * (*host)->h_length);
- if (!addrs)
- {
- goto enomem;
- }
-
- i = 0;
- next = ai->nodes;
- while (next)
- {
- if(next->ai_family == family)
- {
- (*host)->h_addr_list[i] = addrs + (i * (*host)->h_length);
- if (family == AF_INET6)
- {
- memcpy((*host)->h_addr_list[i],
- &(CARES_INADDR_CAST(struct sockaddr_in6 *, next->ai_addr)->sin6_addr),
- (*host)->h_length);
- }
- else
- {
- memcpy((*host)->h_addr_list[i],
- &(CARES_INADDR_CAST(struct sockaddr_in *, next->ai_addr)->sin_addr),
- (*host)->h_length);
- }
- ++i;
- }
- next = next->ai_next;
- }
-
- if (i == 0)
- {
- ares_free(addrs);
- }
+ i = 0;
+ for (next = ai->nodes; next != NULL; next = next->ai_next) {
+ if (next->ai_family != family) {
+ continue;
+ }
+ (*host)->h_addr_list[i] = addrs + (i * (size_t)(*host)->h_length);
+ if (family == AF_INET6) {
+ memcpy(
+ (*host)->h_addr_list[i],
+ &(CARES_INADDR_CAST(struct sockaddr_in6 *, next->ai_addr)->sin6_addr),
+ (size_t)(*host)->h_length);
+ }
+ if (family == AF_INET) {
+ memcpy(
+ (*host)->h_addr_list[i],
+ &(CARES_INADDR_CAST(struct sockaddr_in *, next->ai_addr)->sin_addr),
+ (size_t)(*host)->h_length);
+ }
+ ++i;
}
- if (naddrs == 0 && naliases == 0)
- {
- ares_free_hostent(*host);
- *host = NULL;
- return ARES_ENODATA;
+ if (i == 0) {
+ ares_free(addrs);
}
+ }
+
+ if (naddrs == 0 && naliases == 0) {
+ ares_free_hostent(*host);
+ *host = NULL;
+ return ARES_ENODATA;
+ }
return ARES_SUCCESS;
@@ -204,74 +200,79 @@ enomem:
return ARES_ENOMEM;
}
-
-int ares__addrinfo2addrttl(const struct ares_addrinfo *ai, int family,
- int req_naddrttls, struct ares_addrttl *addrttls,
- struct ares_addr6ttl *addr6ttls, int *naddrttls)
+ares_status_t ares__addrinfo2addrttl(const struct ares_addrinfo *ai, int family,
+ size_t req_naddrttls,
+ struct ares_addrttl *addrttls,
+ struct ares_addr6ttl *addr6ttls,
+ size_t *naddrttls)
{
- struct ares_addrinfo_node *next;
+ struct ares_addrinfo_node *next;
struct ares_addrinfo_cname *next_cname;
- int cname_ttl = INT_MAX;
+ int cname_ttl = INT_MAX;
- if (family != AF_INET && family != AF_INET6)
+ if (family != AF_INET && family != AF_INET6) {
return ARES_EBADQUERY;
+ }
- if (ai == NULL || naddrttls == NULL)
+ if (ai == NULL || naddrttls == NULL) {
return ARES_EBADQUERY;
+ }
- if (family == AF_INET && addrttls == NULL)
+ if (family == AF_INET && addrttls == NULL) {
return ARES_EBADQUERY;
+ }
- if (family == AF_INET6 && addr6ttls == NULL)
+ if (family == AF_INET6 && addr6ttls == NULL) {
return ARES_EBADQUERY;
+ }
- if (req_naddrttls == 0)
+ if (req_naddrttls == 0) {
return ARES_EBADQUERY;
+ }
*naddrttls = 0;
next_cname = ai->cnames;
- while (next_cname)
- {
- if(next_cname->ttl < cname_ttl)
- cname_ttl = next_cname->ttl;
- next_cname = next_cname->next;
+ while (next_cname) {
+ if (next_cname->ttl < cname_ttl) {
+ cname_ttl = next_cname->ttl;
}
+ next_cname = next_cname->next;
+ }
- next = ai->nodes;
- while (next)
- {
- if(next->ai_family == family)
- {
- if (*naddrttls < req_naddrttls)
- {
- if (family == AF_INET6)
- {
- if(next->ai_ttl > cname_ttl)
- addr6ttls[*naddrttls].ttl = cname_ttl;
- else
- addr6ttls[*naddrttls].ttl = next->ai_ttl;
-
- memcpy(&addr6ttls[*naddrttls].ip6addr,
- &(CARES_INADDR_CAST(struct sockaddr_in6 *, next->ai_addr)->sin6_addr),
- sizeof(struct ares_in6_addr));
- }
- else
- {
- if(next->ai_ttl > cname_ttl)
- addrttls[*naddrttls].ttl = cname_ttl;
- else
- addrttls[*naddrttls].ttl = next->ai_ttl;
- memcpy(&addrttls[*naddrttls].ipaddr,
- &(CARES_INADDR_CAST(struct sockaddr_in *, next->ai_addr)->sin_addr),
- sizeof(struct in_addr));
- }
- (*naddrttls)++;
- }
- }
- next = next->ai_next;
+ for (next = ai->nodes; next != NULL; next = next->ai_next) {
+ if (next->ai_family != family) {
+ continue;
+ }
+
+ if (*naddrttls >= req_naddrttls) {
+ break;
}
+ if (family == AF_INET6) {
+ if (next->ai_ttl > cname_ttl) {
+ addr6ttls[*naddrttls].ttl = cname_ttl;
+ } else {
+ addr6ttls[*naddrttls].ttl = next->ai_ttl;
+ }
+
+ memcpy(
+ &addr6ttls[*naddrttls].ip6addr,
+ &(CARES_INADDR_CAST(struct sockaddr_in6 *, next->ai_addr)->sin6_addr),
+ sizeof(struct ares_in6_addr));
+ } else {
+ if (next->ai_ttl > cname_ttl) {
+ addrttls[*naddrttls].ttl = cname_ttl;
+ } else {
+ addrttls[*naddrttls].ttl = next->ai_ttl;
+ }
+ memcpy(
+ &addrttls[*naddrttls].ipaddr,
+ &(CARES_INADDR_CAST(struct sockaddr_in *, next->ai_addr)->sin_addr),
+ sizeof(struct in_addr));
+ }
+ (*naddrttls)++;
+ }
+
return ARES_SUCCESS;
}
-
diff --git a/contrib/libs/c-ares/src/lib/ares__addrinfo_localhost.c b/contrib/libs/c-ares/src/lib/ares__addrinfo_localhost.c
index a086d3f12f..baa9b37212 100644
--- a/contrib/libs/c-ares/src/lib/ares__addrinfo_localhost.c
+++ b/contrib/libs/c-ares/src/lib/ares__addrinfo_localhost.c
@@ -38,164 +38,152 @@
#endif
#if defined(_WIN32) && defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0600
-#include <ws2ipdef.h>
-#include <iphlpapi.h>
+# include <ws2ipdef.h>
+#endif
+
+#if defined(USE_WINSOCK)
+# if defined(HAVE_IPHLPAPI_H)
+# include <iphlpapi.h>
+# endif
+# if defined(HAVE_NETIOAPI_H)
+# include <netioapi.h>
+# endif
#endif
#include "ares.h"
#include "ares_inet_net_pton.h"
-#include "ares_nowarn.h"
#include "ares_private.h"
-int ares_append_ai_node(int aftype,
- unsigned short port,
- int ttl,
- const void *adata,
- struct ares_addrinfo_node **nodes)
+ares_status_t ares_append_ai_node(int aftype, unsigned short port,
+ unsigned int ttl, const void *adata,
+ struct ares_addrinfo_node **nodes)
{
struct ares_addrinfo_node *node;
node = ares__append_addrinfo_node(nodes);
- if (!node)
- {
- return ARES_ENOMEM;
- }
+ if (!node) {
+ return ARES_ENOMEM;
+ }
memset(node, 0, sizeof(*node));
- if (aftype == AF_INET)
- {
- struct sockaddr_in *sin = ares_malloc(sizeof(*sin));
- if (!sin)
- {
- return ARES_ENOMEM;
- }
-
- memset(sin, 0, sizeof(*sin));
- memcpy(&sin->sin_addr.s_addr, adata, sizeof(sin->sin_addr.s_addr));
- sin->sin_family = AF_INET;
- sin->sin_port = htons(port);
-
- node->ai_addr = (struct sockaddr *)sin;
- node->ai_family = AF_INET;
- node->ai_addrlen = sizeof(*sin);
- node->ai_addr = (struct sockaddr *)sin;
- node->ai_ttl = ttl;
+ if (aftype == AF_INET) {
+ struct sockaddr_in *sin = ares_malloc(sizeof(*sin));
+ if (!sin) {
+ return ARES_ENOMEM;
}
- if (aftype == AF_INET6)
- {
- struct sockaddr_in6 *sin6 = ares_malloc(sizeof(*sin6));
- if (!sin6)
- {
- return ARES_ENOMEM;
- }
-
- memset(sin6, 0, sizeof(*sin6));
- memcpy(&sin6->sin6_addr.s6_addr, adata, sizeof(sin6->sin6_addr.s6_addr));
- sin6->sin6_family = AF_INET6;
- sin6->sin6_port = htons(port);
-
- node->ai_addr = (struct sockaddr *)sin6;
- node->ai_family = AF_INET6;
- node->ai_addrlen = sizeof(*sin6);
- node->ai_addr = (struct sockaddr *)sin6;
- node->ai_ttl = ttl;
+ memset(sin, 0, sizeof(*sin));
+ memcpy(&sin->sin_addr.s_addr, adata, sizeof(sin->sin_addr.s_addr));
+ sin->sin_family = AF_INET;
+ sin->sin_port = htons(port);
+
+ node->ai_addr = (struct sockaddr *)sin;
+ node->ai_family = AF_INET;
+ node->ai_addrlen = sizeof(*sin);
+ node->ai_addr = (struct sockaddr *)sin;
+ node->ai_ttl = (int)ttl;
+ }
+
+ if (aftype == AF_INET6) {
+ struct sockaddr_in6 *sin6 = ares_malloc(sizeof(*sin6));
+ if (!sin6) {
+ return ARES_ENOMEM;
}
+ memset(sin6, 0, sizeof(*sin6));
+ memcpy(&sin6->sin6_addr.s6_addr, adata, sizeof(sin6->sin6_addr.s6_addr));
+ sin6->sin6_family = AF_INET6;
+ sin6->sin6_port = htons(port);
+
+ node->ai_addr = (struct sockaddr *)sin6;
+ node->ai_family = AF_INET6;
+ node->ai_addrlen = sizeof(*sin6);
+ node->ai_addr = (struct sockaddr *)sin6;
+ node->ai_ttl = (int)ttl;
+ }
+
return ARES_SUCCESS;
}
-
-static int ares__default_loopback_addrs(int aftype,
- unsigned short port,
- struct ares_addrinfo_node **nodes)
+static ares_status_t
+ ares__default_loopback_addrs(int aftype, unsigned short port,
+ struct ares_addrinfo_node **nodes)
{
- int status = ARES_SUCCESS;
-
- if (aftype == AF_UNSPEC || aftype == AF_INET6)
- {
- struct ares_in6_addr addr6;
- ares_inet_pton(AF_INET6, "::1", &addr6);
- status = ares_append_ai_node(AF_INET6, port, 0, &addr6, nodes);
- if (status != ARES_SUCCESS)
- {
- return status;
- }
+ ares_status_t status = ARES_SUCCESS;
+
+ if (aftype == AF_UNSPEC || aftype == AF_INET6) {
+ struct ares_in6_addr addr6;
+ ares_inet_pton(AF_INET6, "::1", &addr6);
+ status = ares_append_ai_node(AF_INET6, port, 0, &addr6, nodes);
+ if (status != ARES_SUCCESS) {
+ return status;
}
+ }
- if (aftype == AF_UNSPEC || aftype == AF_INET)
- {
- struct in_addr addr4;
- ares_inet_pton(AF_INET, "127.0.0.1", &addr4);
- status = ares_append_ai_node(AF_INET, port, 0, &addr4, nodes);
- if (status != ARES_SUCCESS)
- {
- return status;
- }
+ if (aftype == AF_UNSPEC || aftype == AF_INET) {
+ struct in_addr addr4;
+ ares_inet_pton(AF_INET, "127.0.0.1", &addr4);
+ status = ares_append_ai_node(AF_INET, port, 0, &addr4, nodes);
+ if (status != ARES_SUCCESS) {
+ return status;
}
+ }
return status;
}
-
-static int ares__system_loopback_addrs(int aftype,
- unsigned short port,
- struct ares_addrinfo_node **nodes)
+static ares_status_t
+ ares__system_loopback_addrs(int aftype, unsigned short port,
+ struct ares_addrinfo_node **nodes)
{
-#if defined(_WIN32) && defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0600 && !defined(__WATCOMC__)
+#if defined(_WIN32) && defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0600 && \
+ !defined(__WATCOMC__)
PMIB_UNICASTIPADDRESS_TABLE table;
- unsigned int i;
- int status;
+ unsigned int i;
+ ares_status_t status;
*nodes = NULL;
- if (GetUnicastIpAddressTable(aftype, &table) != NO_ERROR)
+ if (GetUnicastIpAddressTable((ADDRESS_FAMILY)aftype, &table) != NO_ERROR) {
return ARES_ENOTFOUND;
+ }
+
+ for (i = 0; i < table->NumEntries; i++) {
+ if (table->Table[i].InterfaceLuid.Info.IfType !=
+ IF_TYPE_SOFTWARE_LOOPBACK) {
+ continue;
+ }
- for (i=0; i<table->NumEntries; i++)
- {
- if (table->Table[i].InterfaceLuid.Info.IfType !=
- IF_TYPE_SOFTWARE_LOOPBACK)
- {
- continue;
- }
-
- if (table->Table[i].Address.si_family == AF_INET)
- {
- status = ares_append_ai_node(table->Table[i].Address.si_family, port, 0,
- &table->Table[i].Address.Ipv4.sin_addr,
- nodes);
- }
- else if (table->Table[i].Address.si_family == AF_INET6)
- {
- status = ares_append_ai_node(table->Table[i].Address.si_family, port, 0,
- &table->Table[i].Address.Ipv6.sin6_addr,
- nodes);
- }
- else
- {
- /* Ignore any others */
- continue;
- }
-
- if (status != ARES_SUCCESS)
- {
- goto fail;
- }
+ if (table->Table[i].Address.si_family == AF_INET) {
+ status =
+ ares_append_ai_node(table->Table[i].Address.si_family, port, 0,
+ &table->Table[i].Address.Ipv4.sin_addr, nodes);
+ } else if (table->Table[i].Address.si_family == AF_INET6) {
+ status =
+ ares_append_ai_node(table->Table[i].Address.si_family, port, 0,
+ &table->Table[i].Address.Ipv6.sin6_addr, nodes);
+ } else {
+ /* Ignore any others */
+ continue;
}
- if (*nodes == NULL)
- status = ARES_ENOTFOUND;
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+ }
+
+ if (*nodes == NULL) {
+ status = ARES_ENOTFOUND;
+ }
fail:
FreeMibTable(table);
- if (status != ARES_SUCCESS)
- {
- ares__freeaddrinfo_nodes(*nodes);
- *nodes = NULL;
- }
+ if (status != ARES_SUCCESS) {
+ ares__freeaddrinfo_nodes(*nodes);
+ *nodes = NULL;
+ }
return status;
@@ -208,14 +196,12 @@ fail:
#endif
}
-
-int ares__addrinfo_localhost(const char *name,
- unsigned short port,
- const struct ares_addrinfo_hints *hints,
- struct ares_addrinfo *ai)
+ares_status_t ares__addrinfo_localhost(const char *name, unsigned short port,
+ const struct ares_addrinfo_hints *hints,
+ struct ares_addrinfo *ai)
{
struct ares_addrinfo_node *nodes = NULL;
- int result;
+ ares_status_t status;
/* Validate family */
switch (hints->ai_family) {
@@ -228,21 +214,19 @@ int ares__addrinfo_localhost(const char *name,
}
ai->name = ares_strdup(name);
- if(!ai->name)
- {
- goto enomem;
- }
+ if (!ai->name) {
+ goto enomem;
+ }
- result = ares__system_loopback_addrs(hints->ai_family, port, &nodes);
+ status = ares__system_loopback_addrs(hints->ai_family, port, &nodes);
- if (result == ARES_ENOTFOUND)
- {
- result = ares__default_loopback_addrs(hints->ai_family, port, &nodes);
- }
+ if (status == ARES_ENOTFOUND) {
+ status = ares__default_loopback_addrs(hints->ai_family, port, &nodes);
+ }
ares__addrinfo_cat_nodes(&ai->nodes, nodes);
- return result;
+ return status;
enomem:
ares__freeaddrinfo_nodes(nodes);
diff --git a/contrib/libs/c-ares/src/lib/ares__buf.c b/contrib/libs/c-ares/src/lib/ares__buf.c
index 777a5300c9..0663383df9 100644
--- a/contrib/libs/c-ares/src/lib/ares__buf.c
+++ b/contrib/libs/c-ares/src/lib/ares__buf.c
@@ -33,40 +33,41 @@
#endif
struct ares__buf {
- const unsigned char *data; /*!< pointer to start of data buffer */
- size_t data_len; /*!< total size of data in buffer */
+ const unsigned char *data; /*!< pointer to start of data buffer */
+ size_t data_len; /*!< total size of data in buffer */
- unsigned char *alloc_buf; /*!< Pointer to allocated data buffer,
- * not used for const buffers */
- size_t alloc_buf_len; /*!< Size of allocated data buffer */
+ unsigned char *alloc_buf; /*!< Pointer to allocated data buffer,
+ * not used for const buffers */
+ size_t alloc_buf_len; /*!< Size of allocated data buffer */
- size_t offset; /*!< Current working offset in buffer */
- size_t tag_offset; /*!< Tagged offset in buffer. Uses
- * SIZE_MAX if not set. */
+ size_t offset; /*!< Current working offset in buffer */
+ size_t tag_offset; /*!< Tagged offset in buffer. Uses
+ * SIZE_MAX if not set. */
};
ares__buf_t *ares__buf_create(void)
{
- ares__buf_t *buf = ares_malloc(sizeof(*buf));
- if (buf == NULL)
+ ares__buf_t *buf = ares_malloc_zero(sizeof(*buf));
+ if (buf == NULL) {
return NULL;
+ }
- memset(buf, 0, sizeof(*buf));
buf->tag_offset = SIZE_MAX;
return buf;
}
-
ares__buf_t *ares__buf_create_const(const unsigned char *data, size_t data_len)
{
ares__buf_t *buf;
- if (data == NULL || data_len == 0)
+ if (data == NULL || data_len == 0) {
return NULL;
+ }
buf = ares__buf_create();
- if (buf == NULL)
+ if (buf == NULL) {
return NULL;
+ }
buf->data = data;
buf->data_len = data_len;
@@ -74,72 +75,84 @@ ares__buf_t *ares__buf_create_const(const unsigned char *data, size_t data_len)
return buf;
}
-
void ares__buf_destroy(ares__buf_t *buf)
{
- if (buf == NULL)
+ if (buf == NULL) {
return;
+ }
ares_free(buf->alloc_buf);
ares_free(buf);
}
-
-static int ares__buf_is_const(const ares__buf_t *buf)
+static ares_bool_t ares__buf_is_const(const ares__buf_t *buf)
{
- if (buf == NULL)
- return 0;
+ if (buf == NULL) {
+ return ARES_FALSE;
+ }
- if (buf->data != NULL && buf->alloc_buf == NULL)
- return 1;
+ if (buf->data != NULL && buf->alloc_buf == NULL) {
+ return ARES_TRUE;
+ }
- return 0;
+ return ARES_FALSE;
}
-
-static void ares__buf_reclaim(ares__buf_t *buf)
+void ares__buf_reclaim(ares__buf_t *buf)
{
size_t prefix_size;
size_t data_size;
- if (buf == NULL)
+ if (buf == NULL) {
+ return;
+ }
+
+ if (ares__buf_is_const(buf)) {
return;
+ }
- if (ares__buf_is_const(buf))
+ /* Silence coverity. All lengths are zero so would bail out later but
+ * coverity doesn't know this */
+ if (buf->alloc_buf == NULL) {
return;
+ }
- if (buf->tag_offset != SIZE_MAX) {
+ if (buf->tag_offset != SIZE_MAX && buf->tag_offset < buf->offset) {
prefix_size = buf->tag_offset;
} else {
prefix_size = buf->offset;
}
- if (prefix_size == 0)
+ if (prefix_size == 0) {
return;
+ }
data_size = buf->data_len - prefix_size;
memmove(buf->alloc_buf, buf->alloc_buf + prefix_size, data_size);
- buf->data = buf->alloc_buf;
- buf->data_len = data_size;
- buf->offset -= prefix_size;
- if (buf->tag_offset != SIZE_MAX)
+ buf->data = buf->alloc_buf;
+ buf->data_len = data_size;
+ buf->offset -= prefix_size;
+ if (buf->tag_offset != SIZE_MAX) {
buf->tag_offset -= prefix_size;
+ }
return;
}
-
-static int ares__buf_ensure_space(ares__buf_t *buf, size_t needed_size)
+static ares_status_t ares__buf_ensure_space(ares__buf_t *buf,
+ size_t needed_size)
{
size_t remaining_size;
size_t alloc_size;
unsigned char *ptr;
- if (buf == NULL)
+ if (buf == NULL) {
return ARES_EFORMERR;
+ }
- if (ares__buf_is_const(buf))
+ if (ares__buf_is_const(buf)) {
return ARES_EFORMERR;
+ }
/* When calling ares__buf_finish_str() we end up adding a null terminator,
* so we want to ensure the size is always sufficient for this as we don't
@@ -148,31 +161,35 @@ static int ares__buf_ensure_space(ares__buf_t *buf, size_t needed_size)
/* No need to do an expensive move operation, we have enough to just append */
remaining_size = buf->alloc_buf_len - buf->data_len;
- if (remaining_size >= needed_size)
+ if (remaining_size >= needed_size) {
return ARES_SUCCESS;
+ }
/* See if just moving consumed data frees up enough space */
ares__buf_reclaim(buf);
remaining_size = buf->alloc_buf_len - buf->data_len;
- if (remaining_size >= needed_size)
+ if (remaining_size >= needed_size) {
return ARES_SUCCESS;
+ }
alloc_size = buf->alloc_buf_len;
/* Not yet started */
- if (alloc_size == 0)
+ if (alloc_size == 0) {
alloc_size = 16; /* Always shifts 1, so ends up being 32 minimum */
+ }
/* Increase allocation by powers of 2 */
do {
- alloc_size <<= 1;
- remaining_size = alloc_size - buf->data_len;
+ alloc_size <<= 1;
+ remaining_size = alloc_size - buf->data_len;
} while (remaining_size < needed_size);
ptr = ares_realloc(buf->alloc_buf, alloc_size);
- if (ptr == NULL)
+ if (ptr == NULL) {
return ARES_ENOMEM;
+ }
buf->alloc_buf = ptr;
buf->alloc_buf_len = alloc_size;
@@ -181,75 +198,148 @@ static int ares__buf_ensure_space(ares__buf_t *buf, size_t needed_size)
return ARES_SUCCESS;
}
+ares_status_t ares__buf_set_length(ares__buf_t *buf, size_t len)
+{
+ if (buf == NULL || ares__buf_is_const(buf)) {
+ return ARES_EFORMERR;
+ }
+
+ if (len >= buf->alloc_buf_len - buf->offset) {
+ return ARES_EFORMERR;
+ }
-int ares__buf_append(ares__buf_t *buf, const unsigned char *data,
- size_t data_len)
+ buf->data_len = len;
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares__buf_append(ares__buf_t *buf, const unsigned char *data,
+ size_t data_len)
{
- int status;
+ ares_status_t status;
- if (data == NULL || data_len == 0)
+ if (data == NULL || data_len == 0) {
return ARES_EFORMERR;
+ }
status = ares__buf_ensure_space(buf, data_len);
- if (status != ARES_SUCCESS)
+ if (status != ARES_SUCCESS) {
return status;
+ }
memcpy(buf->alloc_buf + buf->data_len, data, data_len);
buf->data_len += data_len;
return ARES_SUCCESS;
}
+ares_status_t ares__buf_append_byte(ares__buf_t *buf, unsigned char byte)
+{
+ return ares__buf_append(buf, &byte, 1);
+}
+
+ares_status_t ares__buf_append_be16(ares__buf_t *buf, unsigned short u16)
+{
+ ares_status_t status;
+
+ status = ares__buf_append_byte(buf, (unsigned char)((u16 >> 8) & 0xff));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ status = ares__buf_append_byte(buf, (unsigned char)(u16 & 0xff));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares__buf_append_be32(ares__buf_t *buf, unsigned int u32)
+{
+ ares_status_t status;
+
+ status = ares__buf_append_byte(buf, ((unsigned char)(u32 >> 24) & 0xff));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ status = ares__buf_append_byte(buf, ((unsigned char)(u32 >> 16) & 0xff));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ status = ares__buf_append_byte(buf, ((unsigned char)(u32 >> 8) & 0xff));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ status = ares__buf_append_byte(buf, ((unsigned char)u32 & 0xff));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ return ARES_SUCCESS;
+}
unsigned char *ares__buf_append_start(ares__buf_t *buf, size_t *len)
{
- int status;
+ ares_status_t status;
- if (len == NULL || *len == 0)
+ if (len == NULL || *len == 0) {
return NULL;
+ }
status = ares__buf_ensure_space(buf, *len);
- if (status != ARES_SUCCESS)
+ if (status != ARES_SUCCESS) {
return NULL;
+ }
- *len = buf->alloc_buf_len - buf->data_len;
+ /* -1 for possible null terminator for ares__buf_finish_str() */
+ *len = buf->alloc_buf_len - buf->data_len - 1;
return buf->alloc_buf + buf->data_len;
}
-
void ares__buf_append_finish(ares__buf_t *buf, size_t len)
{
- if (buf == NULL)
+ if (buf == NULL) {
return;
+ }
buf->data_len += len;
}
-
unsigned char *ares__buf_finish_bin(ares__buf_t *buf, size_t *len)
{
unsigned char *ptr = NULL;
- if (buf == NULL || len == NULL || ares__buf_is_const(buf))
+ if (buf == NULL || len == NULL || ares__buf_is_const(buf)) {
return NULL;
+ }
ares__buf_reclaim(buf);
+
+ /* We don't want to return NULL except on failure, may be zero-length */
+ if (buf->alloc_buf == NULL &&
+ ares__buf_ensure_space(buf, 1) != ARES_SUCCESS) {
+ return NULL;
+ }
ptr = buf->alloc_buf;
*len = buf->data_len;
ares_free(buf);
return ptr;
}
-
char *ares__buf_finish_str(ares__buf_t *buf, size_t *len)
{
char *ptr;
size_t mylen;
ptr = (char *)ares__buf_finish_bin(buf, &mylen);
- if (ptr == NULL)
+ if (ptr == NULL) {
return NULL;
+ }
- if (len != NULL)
+ if (len != NULL) {
*len = mylen;
+ }
/* NOTE: ensured via ares__buf_ensure_space() that there is always at least
* 1 extra byte available for this specific use-case */
@@ -258,131 +348,285 @@ char *ares__buf_finish_str(ares__buf_t *buf, size_t *len)
return ptr;
}
-
void ares__buf_tag(ares__buf_t *buf)
{
- if (buf == NULL)
+ if (buf == NULL) {
return;
+ }
buf->tag_offset = buf->offset;
}
-
-int ares__buf_tag_rollback(ares__buf_t *buf)
+ares_status_t ares__buf_tag_rollback(ares__buf_t *buf)
{
- if (buf == NULL || buf->tag_offset == SIZE_MAX)
+ if (buf == NULL || buf->tag_offset == SIZE_MAX) {
return ARES_EFORMERR;
+ }
buf->offset = buf->tag_offset;
buf->tag_offset = SIZE_MAX;
return ARES_SUCCESS;
}
-
-int ares__buf_tag_clear(ares__buf_t *buf)
+ares_status_t ares__buf_tag_clear(ares__buf_t *buf)
{
- if (buf == NULL || buf->tag_offset == SIZE_MAX)
+ if (buf == NULL || buf->tag_offset == SIZE_MAX) {
return ARES_EFORMERR;
+ }
buf->tag_offset = SIZE_MAX;
return ARES_SUCCESS;
}
-
const unsigned char *ares__buf_tag_fetch(const ares__buf_t *buf, size_t *len)
{
- if (buf == NULL || buf->tag_offset == SIZE_MAX || len == NULL)
+ if (buf == NULL || buf->tag_offset == SIZE_MAX || len == NULL) {
return NULL;
+ }
*len = buf->offset - buf->tag_offset;
return buf->data + buf->tag_offset;
}
+size_t ares__buf_tag_length(const ares__buf_t *buf)
+{
+ if (buf == NULL || buf->tag_offset == SIZE_MAX) {
+ return 0;
+ }
+ return buf->offset - buf->tag_offset;
+}
+
+ares_status_t ares__buf_tag_fetch_bytes(const ares__buf_t *buf,
+ unsigned char *bytes, size_t *len)
+{
+ size_t ptr_len = 0;
+ const unsigned char *ptr = ares__buf_tag_fetch(buf, &ptr_len);
+
+ if (ptr == NULL || bytes == NULL || len == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ if (*len < ptr_len) {
+ return ARES_EFORMERR;
+ }
+
+ *len = ptr_len;
+
+ if (ptr_len > 0) {
+ memcpy(bytes, ptr, ptr_len);
+ }
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares__buf_tag_fetch_string(const ares__buf_t *buf, char *str,
+ size_t len)
+{
+ size_t out_len;
+ ares_status_t status;
+ size_t i;
+
+ if (str == NULL || len == 0) {
+ return ARES_EFORMERR;
+ }
+
+ /* Space for NULL terminator */
+ out_len = len - 1;
+
+ status = ares__buf_tag_fetch_bytes(buf, (unsigned char *)str, &out_len);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* NULL terminate */
+ str[out_len] = 0;
+
+ /* Validate string is printable */
+ for (i = 0; i < out_len; i++) {
+ if (!ares__isprint(str[i])) {
+ return ARES_EBADSTR;
+ }
+ }
+
+ return ARES_SUCCESS;
+}
static const unsigned char *ares__buf_fetch(const ares__buf_t *buf, size_t *len)
{
- if (len != NULL)
+ if (len != NULL) {
*len = 0;
+ }
- if (buf == NULL || len == NULL || buf->data == NULL)
+ if (buf == NULL || len == NULL || buf->data == NULL) {
return NULL;
+ }
*len = buf->data_len - buf->offset;
+ if (*len == 0) {
+ return NULL;
+ }
+
return buf->data + buf->offset;
}
-
-int ares__buf_consume(ares__buf_t *buf, size_t len)
+ares_status_t ares__buf_consume(ares__buf_t *buf, size_t len)
{
- size_t remaining_len;
+ size_t remaining_len = ares__buf_len(buf);
- ares__buf_fetch(buf, &remaining_len);
-
- if (remaining_len < len)
+ if (remaining_len < len) {
return ARES_EBADRESP;
+ }
buf->offset += len;
return ARES_SUCCESS;
}
-
-int ares__buf_fetch_be16(ares__buf_t *buf, unsigned short *u16)
+ares_status_t ares__buf_fetch_be16(ares__buf_t *buf, unsigned short *u16)
{
size_t remaining_len;
const unsigned char *ptr = ares__buf_fetch(buf, &remaining_len);
+ unsigned int u32;
- if (buf == NULL || u16 == NULL || remaining_len < sizeof(*u16))
+ if (buf == NULL || u16 == NULL || remaining_len < sizeof(*u16)) {
return ARES_EBADRESP;
+ }
- *u16 = (unsigned short)((unsigned short)(ptr[0]) << 8 | (unsigned short)ptr[1]);
+ /* Do math in an unsigned int in order to prevent warnings due to automatic
+ * conversion by the compiler from short to int during shifts */
+ u32 = ((unsigned int)(ptr[0]) << 8 | (unsigned int)ptr[1]);
+ *u16 = (unsigned short)(u32 & 0xFFFF);
return ares__buf_consume(buf, sizeof(*u16));
}
+ares_status_t ares__buf_fetch_be32(ares__buf_t *buf, unsigned int *u32)
+{
+ size_t remaining_len;
+ const unsigned char *ptr = ares__buf_fetch(buf, &remaining_len);
+
+ if (buf == NULL || u32 == NULL || remaining_len < sizeof(*u32)) {
+ return ARES_EBADRESP;
+ }
-int ares__buf_fetch_bytes(ares__buf_t *buf, unsigned char *bytes,
- size_t len)
+ *u32 = ((unsigned int)(ptr[0]) << 24 | (unsigned int)(ptr[1]) << 16 |
+ (unsigned int)(ptr[2]) << 8 | (unsigned int)(ptr[3]));
+
+ return ares__buf_consume(buf, sizeof(*u32));
+}
+
+ares_status_t ares__buf_fetch_bytes(ares__buf_t *buf, unsigned char *bytes,
+ size_t len)
{
size_t remaining_len;
const unsigned char *ptr = ares__buf_fetch(buf, &remaining_len);
- if (buf == NULL || bytes == NULL || len == 0 || remaining_len < len)
+ if (buf == NULL || bytes == NULL || len == 0 || remaining_len < len) {
return ARES_EBADRESP;
+ }
memcpy(bytes, ptr, len);
return ares__buf_consume(buf, len);
}
+ares_status_t ares__buf_fetch_bytes_dup(ares__buf_t *buf, size_t len,
+ ares_bool_t null_term,
+ unsigned char **bytes)
+{
+ size_t remaining_len;
+ const unsigned char *ptr = ares__buf_fetch(buf, &remaining_len);
+
+ if (buf == NULL || bytes == NULL || len == 0 || remaining_len < len) {
+ return ARES_EBADRESP;
+ }
+
+ *bytes = ares_malloc(null_term ? len + 1 : len);
+ if (*bytes == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ memcpy(*bytes, ptr, len);
+ if (null_term) {
+ (*bytes)[len] = 0;
+ }
+ return ares__buf_consume(buf, len);
+}
+
+ares_status_t ares__buf_fetch_str_dup(ares__buf_t *buf, size_t len, char **str)
+{
+ size_t remaining_len;
+ const unsigned char *ptr = ares__buf_fetch(buf, &remaining_len);
+
+ if (buf == NULL || str == NULL || len == 0 || remaining_len < len) {
+ return ARES_EBADRESP;
+ }
+
+ *str = ares_malloc(len + 1);
+ if (*str == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ memcpy(*str, ptr, len);
+ (*str)[len] = 0;
+
+ return ares__buf_consume(buf, len);
+}
+
+ares_status_t ares__buf_fetch_bytes_into_buf(ares__buf_t *buf,
+ ares__buf_t *dest, size_t len)
+{
+ size_t remaining_len;
+ const unsigned char *ptr = ares__buf_fetch(buf, &remaining_len);
+ ares_status_t status;
+
+ if (buf == NULL || dest == NULL || len == 0 || remaining_len < len) {
+ return ARES_EBADRESP;
+ }
+
+ status = ares__buf_append(dest, ptr, len);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ return ares__buf_consume(buf, len);
+}
+
+static ares_bool_t ares__is_whitespace(unsigned char c,
+ ares_bool_t include_linefeed)
+{
+ switch (c) {
+ case '\r':
+ case '\t':
+ case ' ':
+ case '\v':
+ case '\f':
+ return ARES_TRUE;
+ case '\n':
+ return include_linefeed;
+ default:
+ break;
+ }
+ return ARES_FALSE;
+}
-size_t ares__buf_consume_whitespace(ares__buf_t *buf, int include_linefeed)
+size_t ares__buf_consume_whitespace(ares__buf_t *buf,
+ ares_bool_t include_linefeed)
{
size_t remaining_len = 0;
const unsigned char *ptr = ares__buf_fetch(buf, &remaining_len);
size_t i;
- if (ptr == NULL)
+ if (ptr == NULL) {
return 0;
+ }
- for (i=0; i<remaining_len; i++) {
- switch(ptr[i]) {
- case '\r':
- case '\t':
- case ' ':
- case '\v':
- case '\f':
- break;
- case '\n':
- if (!include_linefeed)
- goto done;
- break;
- default:
- goto done;
+ for (i = 0; i < remaining_len; i++) {
+ if (!ares__is_whitespace(ptr[i], include_linefeed)) {
+ break;
}
}
-done:
- if (i > 0)
+ if (i > 0) {
ares__buf_consume(buf, i);
+ }
return i;
}
@@ -392,85 +636,580 @@ size_t ares__buf_consume_nonwhitespace(ares__buf_t *buf)
const unsigned char *ptr = ares__buf_fetch(buf, &remaining_len);
size_t i;
- if (ptr == NULL)
+ if (ptr == NULL) {
return 0;
+ }
- for (i=0; i<remaining_len; i++) {
- switch(ptr[i]) {
- case '\r':
- case '\t':
- case ' ':
- case '\v':
- case '\f':
- case '\n':
- goto done;
- default:
- break;
+ for (i = 0; i < remaining_len; i++) {
+ if (ares__is_whitespace(ptr[i], ARES_TRUE)) {
+ break;
+ }
+ }
+
+ if (i > 0) {
+ ares__buf_consume(buf, i);
+ }
+ return i;
+}
+
+size_t ares__buf_consume_line(ares__buf_t *buf, ares_bool_t include_linefeed)
+{
+ size_t remaining_len = 0;
+ const unsigned char *ptr = ares__buf_fetch(buf, &remaining_len);
+ size_t i;
+
+ if (ptr == NULL) {
+ return 0;
+ }
+
+ for (i = 0; i < remaining_len; i++) {
+ if (ptr[i] == '\n') {
+ goto done;
}
}
done:
- if (i > 0)
+ if (include_linefeed && i < remaining_len && ptr[i] == '\n') {
+ i++;
+ }
+
+ if (i > 0) {
ares__buf_consume(buf, i);
+ }
return i;
}
-size_t ares__buf_consume_line(ares__buf_t *buf, int include_linefeed)
+size_t ares__buf_consume_until_charset(ares__buf_t *buf,
+ const unsigned char *charset, size_t len,
+ ares_bool_t require_charset)
{
size_t remaining_len = 0;
const unsigned char *ptr = ares__buf_fetch(buf, &remaining_len);
size_t i;
+ ares_bool_t found = ARES_FALSE;
- if (ptr == NULL)
+ if (ptr == NULL || charset == NULL || len == 0) {
return 0;
+ }
- for (i=0; i<remaining_len; i++) {
- switch(ptr[i]) {
- case '\n':
- if (include_linefeed)
- i++;
+ for (i = 0; i < remaining_len; i++) {
+ size_t j;
+ for (j = 0; j < len; j++) {
+ if (ptr[i] == charset[j]) {
+ found = ARES_TRUE;
goto done;
- default:
- break;
+ }
}
}
done:
- if (i > 0)
+ if (require_charset && !found) {
+ return 0;
+ }
+
+ if (i > 0) {
+ ares__buf_consume(buf, i);
+ }
+ return i;
+}
+
+size_t ares__buf_consume_charset(ares__buf_t *buf, const unsigned char *charset,
+ size_t len)
+{
+ size_t remaining_len = 0;
+ const unsigned char *ptr = ares__buf_fetch(buf, &remaining_len);
+ size_t i;
+
+ if (ptr == NULL || charset == NULL || len == 0) {
+ return 0;
+ }
+
+ for (i = 0; i < remaining_len; i++) {
+ size_t j;
+ for (j = 0; j < len; j++) {
+ if (ptr[i] == charset[j]) {
+ break;
+ }
+ }
+ /* Not found */
+ if (j == len) {
+ break;
+ }
+ }
+
+ if (i > 0) {
ares__buf_consume(buf, i);
+ }
return i;
}
+static void ares__buf_destroy_cb(void *arg)
+{
+ ares__buf_destroy(arg);
+}
+
+static ares_bool_t ares__buf_split_isduplicate(ares__llist_t *list,
+ const unsigned char *val,
+ size_t len,
+ ares__buf_split_t flags)
+{
+ ares__llist_node_t *node;
+
+ for (node = ares__llist_node_first(list); node != NULL;
+ node = ares__llist_node_next(node)) {
+ const ares__buf_t *buf = ares__llist_node_val(node);
+ size_t plen = 0;
+ const unsigned char *ptr = ares__buf_peek(buf, &plen);
+
+ /* Can't be duplicate if lengths mismatch */
+ if (plen != len) {
+ continue;
+ }
+
+ if (flags & ARES_BUF_SPLIT_CASE_INSENSITIVE) {
+ if (ares__memeq_ci(ptr, val, len)) {
+ return ARES_TRUE;
+ }
+ } else {
+ if (memcmp(ptr, val, len) == 0) {
+ return ARES_TRUE;
+ }
+ }
+ }
+ return ARES_FALSE;
+}
+
+ares_status_t ares__buf_split(ares__buf_t *buf, const unsigned char *delims,
+ size_t delims_len, ares__buf_split_t flags,
+ size_t max_sections, ares__llist_t **list)
+{
+ ares_status_t status = ARES_SUCCESS;
+ ares_bool_t first = ARES_TRUE;
+
+ if (buf == NULL || delims == NULL || delims_len == 0 || list == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ *list = ares__llist_create(ares__buf_destroy_cb);
+ if (*list == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ while (ares__buf_len(buf)) {
+ size_t len = 0;
+ const unsigned char *ptr;
+
+ if (first) {
+ /* No delimiter yet, just tag the start */
+ ares__buf_tag(buf);
+ } else {
+ if (flags & ARES_BUF_SPLIT_DONT_CONSUME_DELIMS) {
+ /* tag then eat delimiter so its first byte in buffer */
+ ares__buf_tag(buf);
+ ares__buf_consume(buf, 1);
+ } else {
+ /* throw away delimiter */
+ ares__buf_consume(buf, 1);
+ ares__buf_tag(buf);
+ }
+ }
+
+ if (max_sections && ares__llist_len(*list) >= max_sections - 1) {
+ ares__buf_consume(buf, ares__buf_len(buf));
+ } else {
+ ares__buf_consume_until_charset(buf, delims, delims_len, ARES_FALSE);
+ }
+
+ ptr = ares__buf_tag_fetch(buf, &len);
+
+ /* Shouldn't be possible */
+ if (ptr == NULL) {
+ status = ARES_EFORMERR;
+ goto done;
+ }
+
+ if (flags & ARES_BUF_SPLIT_LTRIM) {
+ size_t i;
+ for (i = 0; i < len; i++) {
+ if (!ares__is_whitespace(ptr[i], ARES_TRUE)) {
+ break;
+ }
+ }
+ ptr += i;
+ len -= i;
+ }
+
+ if (flags & ARES_BUF_SPLIT_RTRIM) {
+ while (len && ares__is_whitespace(ptr[len - 1], ARES_TRUE)) {
+ len--;
+ }
+ }
+
+ if (len != 0 || flags & ARES_BUF_SPLIT_ALLOW_BLANK) {
+ ares__buf_t *data;
+
+ if (!(flags & ARES_BUF_SPLIT_NO_DUPLICATES) ||
+ !ares__buf_split_isduplicate(*list, ptr, len, flags)) {
+ /* Since we don't allow const buffers of 0 length, and user wants
+ * 0-length buffers, swap what we do here */
+ if (len) {
+ data = ares__buf_create_const(ptr, len);
+ } else {
+ data = ares__buf_create();
+ }
+
+ if (data == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ if (ares__llist_insert_last(*list, data) == NULL) {
+ ares__buf_destroy(data);
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ }
+ }
+
+ first = ARES_FALSE;
+ }
+
+done:
+ if (status != ARES_SUCCESS) {
+ ares__llist_destroy(*list);
+ *list = NULL;
+ }
-int ares__buf_begins_with(ares__buf_t *buf, const unsigned char *data,
- size_t data_len)
+ return status;
+}
+
+ares_bool_t ares__buf_begins_with(const ares__buf_t *buf,
+ const unsigned char *data, size_t data_len)
{
size_t remaining_len = 0;
const unsigned char *ptr = ares__buf_fetch(buf, &remaining_len);
- if (ptr == NULL || data == NULL || data_len == 0)
+ if (ptr == NULL || data == NULL || data_len == 0) {
+ return ARES_FALSE;
+ }
+
+ if (data_len > remaining_len) {
+ return ARES_FALSE;
+ }
+
+ if (memcmp(ptr, data, data_len) != 0) {
+ return ARES_FALSE;
+ }
+
+ return ARES_TRUE;
+}
+
+size_t ares__buf_len(const ares__buf_t *buf)
+{
+ if (buf == NULL) {
+ return 0;
+ }
+
+ return buf->data_len - buf->offset;
+}
+
+const unsigned char *ares__buf_peek(const ares__buf_t *buf, size_t *len)
+{
+ return ares__buf_fetch(buf, len);
+}
+
+size_t ares__buf_get_position(const ares__buf_t *buf)
+{
+ if (buf == NULL) {
+ return 0;
+ }
+ return buf->offset;
+}
+
+ares_status_t ares__buf_set_position(ares__buf_t *buf, size_t idx)
+{
+ if (buf == NULL) {
return ARES_EFORMERR;
+ }
- if (data_len > remaining_len)
- return ARES_EBADRESP;
+ if (idx > buf->data_len) {
+ return ARES_EFORMERR;
+ }
- if (memcmp(ptr, data, data_len) == 0)
+ buf->offset = idx;
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares__buf_parse_dns_binstr(ares__buf_t *buf, size_t remaining_len,
+ unsigned char **bin, size_t *bin_len,
+ ares_bool_t allow_multiple)
+{
+ unsigned char len;
+ ares_status_t status;
+ ares__buf_t *binbuf = NULL;
+ size_t orig_len = ares__buf_len(buf);
+
+ if (buf == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ if (remaining_len == 0) {
return ARES_EBADRESP;
+ }
+
+ binbuf = ares__buf_create();
+ if (binbuf == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ while (orig_len - ares__buf_len(buf) < remaining_len) {
+ status = ares__buf_fetch_bytes(buf, &len, 1);
+ if (status != ARES_SUCCESS) {
+ break;
+ }
+
+ if (len) {
+ /* XXX: Maybe we should scan to make sure it is printable? */
+ if (bin != NULL) {
+ status = ares__buf_fetch_bytes_into_buf(buf, binbuf, len);
+ } else {
+ status = ares__buf_consume(buf, len);
+ }
+ if (status != ARES_SUCCESS) {
+ break;
+ }
+ }
+
+ if (!allow_multiple) {
+ break;
+ }
+ }
+
+
+ if (status != ARES_SUCCESS) {
+ ares__buf_destroy(binbuf);
+ } else {
+ if (bin != NULL) {
+ size_t mylen = 0;
+ /* NOTE: we use ares__buf_finish_str() here as we guarantee NULL
+ * Termination even though we are technically returning binary data.
+ */
+ *bin = (unsigned char *)ares__buf_finish_str(binbuf, &mylen);
+ *bin_len = mylen;
+ }
+ }
+
+ return status;
+}
+
+ares_status_t ares__buf_parse_dns_str(ares__buf_t *buf, size_t remaining_len,
+ char **str, ares_bool_t allow_multiple)
+{
+ size_t len;
+ return ares__buf_parse_dns_binstr(buf, remaining_len, (unsigned char **)str,
+ &len, allow_multiple);
+}
+
+ares_status_t ares__buf_append_num_dec(ares__buf_t *buf, size_t num, size_t len)
+{
+ size_t i;
+ size_t mod;
+
+ if (len == 0) {
+ len = ares__count_digits(num);
+ }
+
+ mod = ares__pow(10, len);
+
+ for (i = len; i > 0; i--) {
+ size_t digit = (num % mod);
+ ares_status_t status;
+
+ mod /= 10;
+
+ /* Silence coverity. Shouldn't be possible since we calculate it above */
+ if (mod == 0) {
+ return ARES_EFORMERR;
+ }
+ digit /= mod;
+ status = ares__buf_append_byte(buf, '0' + (unsigned char)(digit & 0xFF));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
return ARES_SUCCESS;
}
+ares_status_t ares__buf_append_num_hex(ares__buf_t *buf, size_t num, size_t len)
+{
+ size_t i;
+ static const unsigned char hexbytes[] = "0123456789ABCDEF";
-size_t ares__buf_len(const ares__buf_t *buf)
+ if (len == 0) {
+ len = ares__count_hexdigits(num);
+ }
+
+ for (i = len; i > 0; i--) {
+ ares_status_t status;
+ status = ares__buf_append_byte(buf, hexbytes[(num >> ((i - 1) * 4)) & 0xF]);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares__buf_append_str(ares__buf_t *buf, const char *str)
{
- size_t len = 0;
- ares__buf_fetch(buf, &len);
- return len;
+ return ares__buf_append(buf, (const unsigned char *)str, ares_strlen(str));
}
+static ares_status_t ares__buf_hexdump_line(ares__buf_t *buf, size_t idx,
+ const unsigned char *data,
+ size_t len)
+{
+ size_t i;
+ ares_status_t status;
-const unsigned char *ares__buf_peek(const ares__buf_t *buf, size_t *len)
+ /* Address */
+ status = ares__buf_append_num_hex(buf, idx, 6);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* | */
+ status = ares__buf_append_str(buf, " | ");
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ for (i = 0; i < 16; i++) {
+ if (i >= len) {
+ status = ares__buf_append_str(buf, " ");
+ } else {
+ status = ares__buf_append_num_hex(buf, data[i], 2);
+ }
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ status = ares__buf_append_byte(buf, ' ');
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+
+ /* | */
+ status = ares__buf_append_str(buf, " | ");
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ for (i = 0; i < 16; i++) {
+ if (i >= len) {
+ break;
+ }
+ status = ares__buf_append_byte(buf, ares__isprint(data[i]) ? data[i] : '.');
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+
+ return ares__buf_append_byte(buf, '\n');
+}
+
+ares_status_t ares__buf_hexdump(ares__buf_t *buf, const unsigned char *data,
+ size_t len)
{
- return ares__buf_fetch(buf, len);
+ size_t i;
+
+ /* Each line is 16 bytes */
+ for (i = 0; i < len; i += 16) {
+ ares_status_t status;
+ status = ares__buf_hexdump_line(buf, i, data + i, len - i);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+
+ return ARES_SUCCESS;
}
+ares_status_t ares__buf_load_file(const char *filename, ares__buf_t *buf)
+{
+ FILE *fp = NULL;
+ unsigned char *ptr = NULL;
+ size_t len = 0;
+ size_t ptr_len = 0;
+ long ftell_len = 0;
+ ares_status_t status;
+
+ if (filename == NULL || buf == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ fp = fopen(filename, "rb");
+ if (fp == NULL) {
+ int error = ERRNO;
+ switch (error) {
+ case ENOENT:
+ case ESRCH:
+ status = ARES_ENOTFOUND;
+ goto done;
+ default:
+ DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n", error,
+ strerror(error)));
+ DEBUGF(fprintf(stderr, "Error opening file: %s\n", filename));
+ status = ARES_EFILE;
+ goto done;
+ }
+ }
+
+ /* Get length portably, fstat() is POSIX, not C */
+ if (fseek(fp, 0, SEEK_END) != 0) {
+ status = ARES_EFILE;
+ goto done;
+ }
+
+ ftell_len = ftell(fp);
+ if (ftell_len < 0) {
+ status = ARES_EFILE;
+ goto done;
+ }
+ len = (size_t)ftell_len;
+
+ if (fseek(fp, 0, SEEK_SET) != 0) {
+ status = ARES_EFILE;
+ goto done;
+ }
+
+ if (len == 0) {
+ status = ARES_SUCCESS;
+ goto done;
+ }
+
+ /* Read entire data into buffer */
+ ptr_len = len;
+ ptr = ares__buf_append_start(buf, &ptr_len);
+ if (ptr == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ ptr_len = fread(ptr, 1, len, fp);
+ if (ptr_len != len) {
+ status = ARES_EFILE;
+ goto done;
+ }
+
+ ares__buf_append_finish(buf, len);
+ status = ARES_SUCCESS;
+
+done:
+ if (fp != NULL) {
+ fclose(fp);
+ }
+ return status;
+}
diff --git a/contrib/libs/c-ares/src/lib/ares__buf.h b/contrib/libs/c-ares/src/lib/ares__buf.h
index d81fc26f42..4298814f7b 100644
--- a/contrib/libs/c-ares/src/lib/ares__buf.h
+++ b/contrib/libs/c-ares/src/lib/ares__buf.h
@@ -33,6 +33,10 @@
* validation and return a success/fail result. There are also various helpers
* for writing data to the buffer which dynamically grows.
*
+ * All operations that fetch or consume data from the buffer will move forward
+ * the internal pointer, thus marking the data as processed which may no longer
+ * be accessible after certain operations (such as append).
+ *
* The helpers for this object are meant to be added as needed. If you can't
* find it, write it!
*
@@ -44,10 +48,10 @@ struct ares__buf;
typedef struct ares__buf ares__buf_t;
/*! Create a new buffer object that dynamically allocates buffers for data.
- *
+ *
* \return initialized buffer object or NULL if out of memory.
*/
-ares__buf_t *ares__buf_create(void);
+ares__buf_t *ares__buf_create(void);
/*! Create a new buffer object that uses a user-provided data pointer. The
* data provided will not be manipulated, and cannot be appended to. This
@@ -60,21 +64,90 @@ ares__buf_t *ares__buf_create(void);
*/
ares__buf_t *ares__buf_create_const(const unsigned char *data, size_t data_len);
+
/*! Destroy an initialized buffer object.
*
* \param[in] buf Initialized buf object
*/
-void ares__buf_destroy(ares__buf_t *buf);
+void ares__buf_destroy(ares__buf_t *buf);
+
-/*! Append to a dynamic buffer object
+/*! Append multiple bytes to a dynamic buffer object
*
* \param[in] buf Initialized buffer object
* \param[in] data Data to copy to buffer object
* \param[in] data_len Length of data to copy to buffer object.
* \return ARES_SUCCESS or one of the c-ares error codes
*/
-int ares__buf_append(ares__buf_t *buf, const unsigned char *data,
- size_t data_len);
+ares_status_t ares__buf_append(ares__buf_t *buf, const unsigned char *data,
+ size_t data_len);
+
+/*! Append a single byte to the dynamic buffer object
+ *
+ * \param[in] buf Initialized buffer object
+ * \param[in] byte Single byte to append to buffer object.
+ * \return ARES_SUCCESS or one of the c-ares error codes
+ */
+ares_status_t ares__buf_append_byte(ares__buf_t *buf, unsigned char byte);
+
+/*! Append a null-terminated string to the dynamic buffer object
+ *
+ * \param[in] buf Initialized buffer object
+ * \param[in] str String to append to buffer object.
+ * \return ARES_SUCCESS or one of the c-ares error codes
+ */
+ares_status_t ares__buf_append_str(ares__buf_t *buf, const char *str);
+
+/*! Append a 16bit Big Endian number to the buffer.
+ *
+ * \param[in] buf Initialized buffer object
+ * \param[out] u16 16bit integer
+ * \return ARES_SUCCESS or one of the c-ares error codes
+ */
+ares_status_t ares__buf_append_be16(ares__buf_t *buf, unsigned short u16);
+
+/*! Append a 32bit Big Endian number to the buffer.
+ *
+ * \param[in] buf Initialized buffer object
+ * \param[out] u32 32bit integer
+ * \return ARES_SUCCESS or one of the c-ares error codes
+ */
+ares_status_t ares__buf_append_be32(ares__buf_t *buf, unsigned int u32);
+
+/*! Append a number in ASCII decimal form.
+ *
+ * \param[in] buf Initialized buffer object
+ * \param[in] num Number to print
+ * \param[in] len Length to output, use 0 for no padding
+ * \return ARES_SUCCESS on success
+ */
+ares_status_t ares__buf_append_num_dec(ares__buf_t *buf, size_t num,
+ size_t len);
+
+/*! Append a number in ASCII hexadecimal form.
+ *
+ * \param[in] buf Initialized buffer object
+ * \param[in] num Number to print
+ * \param[in] len Length to output, use 0 for no padding
+ * \return ARES_SUCCESS on success
+ */
+ares_status_t ares__buf_append_num_hex(ares__buf_t *buf, size_t num,
+ size_t len);
+
+/*! Sets the current buffer length. This *may* be used if there is a need to
+ * override a prior position in the buffer, such as if there is a length
+ * prefix that isn't easily predictable, and you must go back and overwrite
+ * that position.
+ *
+ * Only valid on non-const buffers. Length provided must not exceed current
+ * allocated buffer size, but otherwise there are very few protections on
+ * this function. Use cautiously.
+ *
+ * \param[in] buf Initialized buffer object
+ * \param[in] len Length to set
+ * \return ARES_SUCCESS or one of the c-ares error codes
+ */
+ares_status_t ares__buf_set_length(ares__buf_t *buf, size_t len);
/*! Start a dynamic append operation that returns a buffer suitable for
@@ -98,7 +171,17 @@ unsigned char *ares__buf_append_start(ares__buf_t *buf, size_t *len);
* operation. Must not be greater than returned from
* ares__buf_append_start().
*/
-void ares__buf_append_finish(ares__buf_t *buf, size_t len);
+void ares__buf_append_finish(ares__buf_t *buf, size_t len);
+
+/*! Write the data provided to the buffer in a hexdump format.
+ *
+ * \param[in] buf Initialized buffer object.
+ * \param[in] data Data to hex dump
+ * \param[in] len Length of data to hexdump
+ * \return ARES_SUCCESS on success.
+ */
+ares_status_t ares__buf_hexdump(ares__buf_t *buf, const unsigned char *data,
+ size_t len);
/*! Clean up ares__buf_t and return allocated pointer to unprocessed data. It
* is the responsibility of the caller to ares_free() the returned buffer.
@@ -106,7 +189,7 @@ void ares__buf_append_finish(ares__buf_t *buf, size_t len);
*
* \param[in] buf Initialized buffer object. Can not be a "const" buffer.
* \param[out] len Length of data returned
- * \return pointer to unprocessed data or NULL on error.
+ * \return pointer to unprocessed data (may be zero length) or NULL on error.
*/
unsigned char *ares__buf_finish_bin(ares__buf_t *buf, size_t *len);
@@ -124,7 +207,7 @@ unsigned char *ares__buf_finish_bin(ares__buf_t *buf, size_t *len);
* \param[out] len Optional. Length of data returned, or NULL if not needed.
* \return pointer to unprocessed data or NULL on error.
*/
-char *ares__buf_finish_str(ares__buf_t *buf, size_t *len);
+char *ares__buf_finish_str(ares__buf_t *buf, size_t *len);
/*! Tag a position to save in the buffer in case parsing needs to rollback,
* such as if insufficient data is available, but more data may be added in
@@ -133,14 +216,14 @@ char *ares__buf_finish_str(ares__buf_t *buf, size_t *len);
*
* \param[in] buf Initialized buffer object
*/
-void ares__buf_tag(ares__buf_t *buf);
+void ares__buf_tag(ares__buf_t *buf);
/*! Rollback to a tagged position. Will automatically clear the tag.
*
* \param[in] buf Initialized buffer object
* \return ARES_SUCCESS or one of the c-ares error codes
*/
-int ares__buf_tag_rollback(ares__buf_t *buf);
+ares_status_t ares__buf_tag_rollback(ares__buf_t *buf);
/*! Clear the tagged position without rolling back. You should do this any
* time a tag is no longer needed as future append operations can reclaim
@@ -149,7 +232,7 @@ int ares__buf_tag_rollback(ares__buf_t *buf);
* \param[in] buf Initialized buffer object
* \return ARES_SUCCESS or one of the c-ares error codes
*/
-int ares__buf_tag_clear(ares__buf_t *buf);
+ares_status_t ares__buf_tag_clear(ares__buf_t *buf);
/*! Fetch the buffer and length of data starting from the tagged position up
* to the _current_ position. It will not unset the tagged position. The
@@ -162,13 +245,47 @@ int ares__buf_tag_clear(ares__buf_t *buf);
*/
const unsigned char *ares__buf_tag_fetch(const ares__buf_t *buf, size_t *len);
+/*! Get the length of the current tag offset to the current position.
+ *
+ * \param[in] buf Initialized buffer object
+ * \return length
+ */
+size_t ares__buf_tag_length(const ares__buf_t *buf);
+
+/*! Fetch the bytes starting from the tagged position up to the _current_
+ * position using the provided buffer. It will not unset the tagged position.
+ *
+ * \param[in] buf Initialized buffer object
+ * \param[in,out] bytes Buffer to hold data
+ * \param[in,out] len On input, buffer size, on output, bytes place in
+ * buffer.
+ * \return ARES_SUCCESS if fetched, ARES_EFORMERR if insufficient buffer size
+ */
+ares_status_t ares__buf_tag_fetch_bytes(const ares__buf_t *buf,
+ unsigned char *bytes, size_t *len);
+
+/*! Fetch the bytes starting from the tagged position up to the _current_
+ * position as a NULL-terminated string using the provided buffer. The data
+ * is validated to be ASCII-printable data. It will not unset the tagged
+ * poition.
+ *
+ * \param[in] buf Initialized buffer object
+ * \param[in,out] str Buffer to hold data
+ * \param[in] len On input, buffer size, on output, bytes place in
+ * buffer.
+ * \return ARES_SUCCESS if fetched, ARES_EFORMERR if insufficient buffer size,
+ * ARES_EBADSTR if not printable ASCII
+ */
+ares_status_t ares__buf_tag_fetch_string(const ares__buf_t *buf, char *str,
+ size_t len);
+
/*! Consume the given number of bytes without reading them.
*
* \param[in] buf Initialized buffer object
* \param[in] len Length to consume
* \return ARES_SUCCESS or one of the c-ares error codes
*/
-int ares__buf_consume(ares__buf_t *buf, size_t len);
+ares_status_t ares__buf_consume(ares__buf_t *buf, size_t len);
/*! Fetch a 16bit Big Endian number from the buffer.
*
@@ -176,7 +293,16 @@ int ares__buf_consume(ares__buf_t *buf, size_t len);
* \param[out] u16 Buffer to hold 16bit integer
* \return ARES_SUCCESS or one of the c-ares error codes
*/
-int ares__buf_fetch_be16(ares__buf_t *buf, unsigned short *u16);
+ares_status_t ares__buf_fetch_be16(ares__buf_t *buf, unsigned short *u16);
+
+/*! Fetch a 32bit Big Endian number from the buffer.
+ *
+ * \param[in] buf Initialized buffer object
+ * \param[out] u32 Buffer to hold 32bit integer
+ * \return ARES_SUCCESS or one of the c-ares error codes
+ */
+ares_status_t ares__buf_fetch_be32(ares__buf_t *buf, unsigned int *u32);
+
/*! Fetch the requested number of bytes into the provided buffer
*
@@ -185,17 +311,57 @@ int ares__buf_fetch_be16(ares__buf_t *buf, unsigned short *u16);
* \param[in] len Requested number of bytes (must be > 0)
* \return ARES_SUCCESS or one of the c-ares error codes
*/
-int ares__buf_fetch_bytes(ares__buf_t *buf, unsigned char *bytes,
- size_t len);
+ares_status_t ares__buf_fetch_bytes(ares__buf_t *buf, unsigned char *bytes,
+ size_t len);
+
+
+/*! Fetch the requested number of bytes and return a new buffer that must be
+ * ares_free()'d by the caller.
+ *
+ * \param[in] buf Initialized buffer object
+ * \param[in] len Requested number of bytes (must be > 0)
+ * \param[in] null_term Even though this is considered binary data, the user
+ * knows it may be a vald string, so add a null
+ * terminator.
+ * \param[out] bytes Pointer passed by reference. Will be allocated.
+ * \return ARES_SUCCESS or one of the c-ares error codes
+ */
+ares_status_t ares__buf_fetch_bytes_dup(ares__buf_t *buf, size_t len,
+ ares_bool_t null_term,
+ unsigned char **bytes);
+
+/*! Fetch the requested number of bytes and place them into the provided
+ * dest buffer object.
+ *
+ * \param[in] buf Initialized buffer object
+ * \param[out] dest Buffer object to append bytes.
+ * \param[in] len Requested number of bytes (must be > 0)
+ * \return ARES_SUCCESS or one of the c-ares error codes
+ */
+ares_status_t ares__buf_fetch_bytes_into_buf(ares__buf_t *buf,
+ ares__buf_t *dest, size_t len);
+
+/*! Fetch the requested number of bytes and return a new buffer that must be
+ * ares_free()'d by the caller. The returned buffer is a null terminated
+ * string.
+ *
+ * \param[in] buf Initialized buffer object
+ * \param[in] len Requested number of bytes (must be > 0)
+ * \param[out] str Pointer passed by reference. Will be allocated.
+ * \return ARES_SUCCESS or one of the c-ares error codes
+ */
+ares_status_t ares__buf_fetch_str_dup(ares__buf_t *buf, size_t len, char **str);
/*! Consume whitespace characters (0x09, 0x0B, 0x0C, 0x0D, 0x20, and optionally
* 0x0A).
*
* \param[in] buf Initialized buffer object
- * \param[in] include_linefeed 1 to include consuming 0x0A, 0 otherwise.
+ * \param[in] include_linefeed ARES_TRUE to include consuming 0x0A,
+ * ARES_FALSE otherwise.
* \return number of whitespace characters consumed
*/
-size_t ares__buf_consume_whitespace(ares__buf_t *buf, int include_linefeed);
+size_t ares__buf_consume_whitespace(ares__buf_t *buf,
+ ares_bool_t include_linefeed);
/*! Consume any non-whitespace character (anything other than 0x09, 0x0B, 0x0C,
@@ -204,16 +370,96 @@ size_t ares__buf_consume_whitespace(ares__buf_t *buf, int include_linefeed);
* \param[in] buf Initialized buffer object
* \return number of characters consumed
*/
-size_t ares__buf_consume_nonwhitespace(ares__buf_t *buf);
+size_t ares__buf_consume_nonwhitespace(ares__buf_t *buf);
+
+
+/*! Consume until a character in the character set provided is reached. Does
+ * not include the character from the charset at the end.
+ *
+ * \param[in] buf Initialized buffer object
+ * \param[in] charset character set
+ * \param[in] len length of character set
+ * \param[in] require_charset require we find a character from the charset.
+ * if ARES_FALSE it will simply consume the
+ * rest of the buffer. If ARES_TRUE will return
+ * 0 if not found.
+ * \return number of characters consumed
+ */
+size_t ares__buf_consume_until_charset(ares__buf_t *buf,
+ const unsigned char *charset, size_t len,
+ ares_bool_t require_charset);
+
+
+/*! Consume while the characters match the characters in the provided set.
+ *
+ * \param[in] buf Initialized buffer object
+ * \param[in] charset character set
+ * \param[in] len length of character set
+ * \return number of characters consumed
+ */
+size_t ares__buf_consume_charset(ares__buf_t *buf, const unsigned char *charset,
+ size_t len);
+
/*! Consume from the current position until the end of the line, and optionally
* the end of line character (0x0A) itself.
*
* \param[in] buf Initialized buffer object
- * \param[in] include_linefeed 1 to include consuming 0x0A, 0 otherwise.
+ * \param[in] include_linefeed ARES_TRUE to include consuming 0x0A,
+ * ARES_FALSE otherwise.
* \return number of characters consumed
*/
-size_t ares__buf_consume_line(ares__buf_t *buf, int include_linefeed);
+size_t ares__buf_consume_line(ares__buf_t *buf, ares_bool_t include_linefeed);
+
+typedef enum {
+ /*! No flags */
+ ARES_BUF_SPLIT_NONE = 0,
+ /*! The delimiter will be the first character in the buffer, except the
+ * first buffer since the start doesn't have a delimiter. This option is
+ * incompatible with ARES_BUF_SPLIT_LTRIM since the delimiter is always
+ * the first character.
+ */
+ ARES_BUF_SPLIT_DONT_CONSUME_DELIMS = 1 << 0,
+ /*! Allow blank sections, by default blank sections are not emitted. If using
+ * ARES_BUF_SPLIT_DONT_CONSUME_DELIMS, the delimiter is not counted as part
+ * of the section */
+ ARES_BUF_SPLIT_ALLOW_BLANK = 1 << 1,
+ /*! Remove duplicate entries */
+ ARES_BUF_SPLIT_NO_DUPLICATES = 1 << 2,
+ /*! Perform case-insensitive matching when comparing values */
+ ARES_BUF_SPLIT_CASE_INSENSITIVE = 1 << 3,
+ /*! Trim leading whitespace from buffer */
+ ARES_BUF_SPLIT_LTRIM = 1 << 4,
+ /*! Trim trailing whitespace from buffer */
+ ARES_BUF_SPLIT_RTRIM = 1 << 5,
+ /*! Trim leading and trailing whitespace from buffer */
+ ARES_BUF_SPLIT_TRIM = (ARES_BUF_SPLIT_LTRIM | ARES_BUF_SPLIT_RTRIM)
+} ares__buf_split_t;
+
+/*! Split the provided buffer into multiple sub-buffers stored in the variable
+ * pointed to by the linked list. The sub buffers are const buffers pointing
+ * into the buf provided.
+ *
+ * \param[in] buf Initialized buffer object
+ * \param[in] delims Possible delimiters
+ * \param[in] delims_len Length of possible delimiters
+ * \param[in] flags One more more flags
+ * \param[in] max_sections Maximum number of sections. Use 0 for
+ * unlimited. Useful for splitting key/value
+ * pairs where the delimiter may be a valid
+ * character in the value. A value of 1 would
+ * have little usefulness and would effectively
+ * ignore the delimiter itself.
+ * \param[out] list Result. Depending on flags, this may be a
+ * valid list with no elements. Use
+ * ares__llist_destroy() to free the memory which
+ * will also free the contained ares__buf_t
+ * objects.
+ * \return ARES_SUCCESS on success, or error like ARES_ENOMEM.
+ */
+ares_status_t ares__buf_split(ares__buf_t *buf, const unsigned char *delims,
+ size_t delims_len, ares__buf_split_t flags,
+ size_t max_sections, ares__llist_t **list);
/*! Check the unprocessed buffer to see if it begins with the sequence of
@@ -222,10 +468,10 @@ size_t ares__buf_consume_line(ares__buf_t *buf, int include_linefeed);
* \param[in] buf Initialized buffer object
* \param[in] data Bytes of data to compare.
* \param[in] data_len Length of data to compare.
- * \return ARES_SUCCESS or one of the c-ares error codes
+ * \return ARES_TRUE on match, ARES_FALSE otherwise.
*/
-int ares__buf_begins_with(ares__buf_t *buf, const unsigned char *data,
- size_t data_len);
+ares_bool_t ares__buf_begins_with(const ares__buf_t *buf,
+ const unsigned char *data, size_t data_len);
/*! Size of unprocessed remaining data length
@@ -233,7 +479,7 @@ int ares__buf_begins_with(ares__buf_t *buf, const unsigned char *data,
* \param[in] buf Initialized buffer object
* \return length remaining
*/
-size_t ares__buf_len(const ares__buf_t *buf);
+size_t ares__buf_len(const ares__buf_t *buf);
/*! Retrieve a pointer to the currently unprocessed data. Generally this isn't
* recommended to be used in practice. The returned pointer may be invalidated
@@ -243,9 +489,110 @@ size_t ares__buf_len(const ares__buf_t *buf);
* \param[out] len Length of available data
* \return Pointer to buffer of unprocessed data
*/
-const unsigned char *ares__buf_peek(const ares__buf_t *buf,
- size_t *len);
+const unsigned char *ares__buf_peek(const ares__buf_t *buf, size_t *len);
+
+
+/*! Wipe any processed data from the beginning of the buffer. This will
+ * move any remaining data to the front of the internally allocated buffer.
+ *
+ * Can not be used on const buffer objects.
+ *
+ * Typically not needed to call, as any new append operation will automatically
+ * call this function if there is insufficient space to append the data in
+ * order to try to avoid another memory allocation.
+ *
+ * It may be useful to call in order to ensure the current message being
+ * processed is in the beginning of the buffer if there is an intent to use
+ * ares__buf_set_position() and ares__buf_get_position() as may be necessary
+ * when processing DNS compressed names.
+ *
+ * If there is an active tag, it will NOT clear the tag, it will use the tag
+ * as the start of the unprocessed data rather than the current offset. If
+ * a prior tag is no longer needed, may be wise to call ares__buf_tag_clear().
+ *
+ * \param[in] buf Initialized buffer object
+ */
+void ares__buf_reclaim(ares__buf_t *buf);
+
+/*! Set the current offset within the internal buffer.
+ *
+ * Typically this should not be used, if possible, use the ares__buf_tag*()
+ * operations instead.
+ *
+ * One exception is DNS name compression which may backwards reference to
+ * an index in the message. It may be necessary in such a case to call
+ * ares__buf_reclaim() if using a dynamic (non-const) buffer before processing
+ * such a message.
+ *
+ * \param[in] buf Initialized buffer object
+ * \param[in] idx Index to set position
+ * \return ARES_SUCCESS if valid index
+ */
+ares_status_t ares__buf_set_position(ares__buf_t *buf, size_t idx);
+/*! Get the current offset within the internal buffer.
+ *
+ * Typically this should not be used, if possible, use the ares__buf_tag*()
+ * operations instead.
+ *
+ * This can be used to get the current position, useful for saving if a
+ * jump via ares__buf_set_position() is performed and need to restore the
+ * current position for future operations.
+ *
+ * \param[in] buf Initialized buffer object
+ * \return index of current position
+ */
+size_t ares__buf_get_position(const ares__buf_t *buf);
+
+/*! Parse a character-string as defined in RFC1035, as a null-terminated
+ * string.
+ *
+ * \param[in] buf initialized buffer object
+ * \param[in] remaining_len maximum length that should be used for parsing
+ * the string, this is often less than the remaining
+ * buffer and is based on the RR record length.
+ * \param[out] name Pointer passed by reference to be filled in with
+ * allocated string of the parsed that must be
+ * ares_free()'d by the caller.
+ * \param[in] allow_multiple ARES_TRUE if it should attempt to parse multiple
+ * strings back to back, and will concatenate in
+ * the returned str.
+ * \return ARES_SUCCESS on success
+ */
+ares_status_t ares__buf_parse_dns_str(ares__buf_t *buf, size_t remaining_len,
+ char **name, ares_bool_t allow_multiple);
+
+/*! Parse a character-string as defined in RFC1035, as binary, however for
+ * convenience this does guarantee a NULL terminator (that is not included
+ * in the returned length).
+ *
+ * \param[in] buf initialized buffer object
+ * \param[in] remaining_len maximum length that should be used for parsing
+ * the string, this is often less than the remaining
+ * buffer and is based on the RR record length.
+ * \param[out] bin Pointer passed by reference to be filled in with
+ * allocated string of the parsed that must be
+ * ares_free()'d by the caller.
+ * \param[out] bin_len Length of returned string.
+ * \param[in] allow_multiple ARES_TRUE if it should attempt to parse multiple
+ * strings back to back, and will concatenate in
+ * the returned str.
+ * \return ARES_SUCCESS on success
+ */
+ares_status_t ares__buf_parse_dns_binstr(ares__buf_t *buf, size_t remaining_len,
+ unsigned char **bin, size_t *bin_len,
+ ares_bool_t allow_multiple);
+
+/*! Load data from specified file path into provided buffer. The entire file
+ * is loaded into memory.
+ *
+ * \param[in] filename complete path to file
+ * \param[in,out] buf Initialized (non-const) buffer object to load data
+ * into
+ * \return ARES_ENOTFOUND if file not found, ARES_EFILE if issues reading
+ * file, ARES_ENOMEM if out of memory, ARES_SUCCESS on success.
+ */
+ares_status_t ares__buf_load_file(const char *filename, ares__buf_t *buf);
/*! @} */
diff --git a/contrib/libs/c-ares/src/lib/ares__close_sockets.c b/contrib/libs/c-ares/src/lib/ares__close_sockets.c
index fe64e54037..13ecca8f5e 100644
--- a/contrib/libs/c-ares/src/lib/ares__close_sockets.c
+++ b/contrib/libs/c-ares/src/lib/ares__close_sockets.c
@@ -31,38 +31,47 @@
#include "ares_private.h"
#include <assert.h>
+static void ares__requeue_queries(struct server_connection *conn)
+{
+ struct query *query;
+ struct timeval now = ares__tvnow();
+
+ while ((query = ares__llist_first_val(conn->queries_to_conn)) != NULL) {
+ ares__requeue_query(query, &now);
+ }
+}
void ares__close_connection(struct server_connection *conn)
{
struct server_state *server = conn->server;
- ares_channel channel = server->channel;
+ ares_channel_t *channel = server->channel;
+
+ /* Unlink */
+ ares__llist_node_claim(
+ ares__htable_asvp_get_direct(channel->connnode_by_socket, conn->fd));
+ ares__htable_asvp_remove(channel->connnode_by_socket, conn->fd);
if (conn->is_tcp) {
/* Reset any existing input and output buffer. */
ares__buf_consume(server->tcp_parser, ares__buf_len(server->tcp_parser));
ares__buf_consume(server->tcp_send, ares__buf_len(server->tcp_send));
- server->tcp_connection_generation = ++channel->tcp_connection_generation;
server->tcp_conn = NULL;
}
+ /* Requeue queries to other connections */
+ ares__requeue_queries(conn);
+
+ ares__llist_destroy(conn->queries_to_conn);
SOCK_STATE_CALLBACK(channel, conn->fd, 0, 0);
ares__close_socket(channel, conn->fd);
- ares__llist_node_claim(
- ares__htable_asvp_get_direct(channel->connnode_by_socket, conn->fd)
- );
- ares__htable_asvp_remove(channel->connnode_by_socket, conn->fd);
-#ifndef NDEBUG
- assert(ares__llist_len(conn->queries_to_conn) == 0);
-#endif
- ares__llist_destroy(conn->queries_to_conn);
ares_free(conn);
}
void ares__close_sockets(struct server_state *server)
{
- ares__llist_node_t *node;
+ ares__llist_node_t *node;
while ((node = ares__llist_node_first(server->connections)) != NULL) {
struct server_connection *conn = ares__llist_node_val(node);
@@ -70,35 +79,41 @@ void ares__close_sockets(struct server_state *server)
}
}
-void ares__check_cleanup_conn(ares_channel channel, ares_socket_t fd)
+void ares__check_cleanup_conn(const ares_channel_t *channel,
+ struct server_connection *conn)
{
- ares__llist_node_t *node;
- struct server_connection *conn;
- int do_cleanup = 0;
+ ares_bool_t do_cleanup = ARES_FALSE;
- node = ares__htable_asvp_get_direct(channel->connnode_by_socket, fd);
- if (node == NULL) {
+ if (channel == NULL || conn == NULL) {
return;
}
- conn = ares__llist_node_val(node);
-
if (ares__llist_len(conn->queries_to_conn)) {
return;
}
/* If we are configured not to stay open, close it out */
if (!(channel->flags & ARES_FLAG_STAYOPEN)) {
- do_cleanup = 1;
+ do_cleanup = ARES_TRUE;
+ }
+
+ /* If the associated server has failures, close it out. Resetting the
+ * connection (and specifically the source port number) can help resolve
+ * situations where packets are being dropped.
+ */
+ if (conn->server->consec_failures > 0) {
+ do_cleanup = ARES_TRUE;
}
/* If the udp connection hit its max queries, always close it */
if (!conn->is_tcp && channel->udp_max_queries > 0 &&
- conn->total_queries >= (size_t)channel->udp_max_queries) {
- do_cleanup = 1;
+ conn->total_queries >= channel->udp_max_queries) {
+ do_cleanup = ARES_TRUE;
}
- if (do_cleanup) {
- ares__close_connection(conn);
+ if (!do_cleanup) {
+ return;
}
+
+ ares__close_connection(conn);
}
diff --git a/contrib/libs/c-ares/src/lib/ares__get_hostent.c b/contrib/libs/c-ares/src/lib/ares__get_hostent.c
deleted file mode 100644
index 8ac2425ed4..0000000000
--- a/contrib/libs/c-ares/src/lib/ares__get_hostent.c
+++ /dev/null
@@ -1,271 +0,0 @@
-/* MIT License
- *
- * Copyright (c) 1998, 2011 Massachusetts Institute of Technology
- * Copyright (c) The c-ares project and its contributors
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- * SPDX-License-Identifier: MIT
- */
-
-#include "ares_setup.h"
-
-#ifdef HAVE_NETINET_IN_H
-# include <netinet/in.h>
-#endif
-#ifdef HAVE_NETDB_H
-# include <netdb.h>
-#endif
-#ifdef HAVE_ARPA_INET_H
-# include <arpa/inet.h>
-#endif
-
-#include "ares.h"
-#include "ares_inet_net_pton.h"
-#include "ares_nowarn.h"
-#include "ares_private.h"
-
-int ares__get_hostent(FILE *fp, int family, struct hostent **host)
-{
- char *line = NULL, *p, *q, **alias;
- char *txtaddr, *txthost, *txtalias;
- int status;
- size_t addrlen, linesize, naliases;
- struct ares_addr addr;
- struct hostent *hostent = NULL;
-
- *host = NULL; /* Assume failure */
-
- /* Validate family */
- switch (family) {
- case AF_INET:
- case AF_INET6:
- case AF_UNSPEC:
- break;
- default:
- return ARES_EBADFAMILY;
- }
-
- while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS)
- {
-
- /* Trim line comment. */
- p = line;
- while (*p && (*p != '#'))
- p++;
- *p = '\0';
-
- /* Trim trailing whitespace. */
- q = p - 1;
- while ((q >= line) && ISSPACE(*q))
- q--;
- *++q = '\0';
-
- /* Skip leading whitespace. */
- p = line;
- while (*p && ISSPACE(*p))
- p++;
- if (!*p)
- /* Ignore line if empty. */
- continue;
-
- /* Pointer to start of IPv4 or IPv6 address part. */
- txtaddr = p;
-
- /* Advance past address part. */
- while (*p && !ISSPACE(*p))
- p++;
- if (!*p)
- /* Ignore line if reached end of line. */
- continue;
-
- /* Null terminate address part. */
- *p = '\0';
-
- /* Advance to host name */
- p++;
- while (*p && ISSPACE(*p))
- p++;
- if (!*p)
- /* Ignore line if reached end of line. */
- continue; /* LCOV_EXCL_LINE: trailing whitespace already stripped */
-
- /* Pointer to start of host name. */
- txthost = p;
-
- /* Advance past host name. */
- while (*p && !ISSPACE(*p))
- p++;
-
- /* Pointer to start of first alias. */
- txtalias = NULL;
- if (*p)
- {
- q = p + 1;
- while (*q && ISSPACE(*q))
- q++;
- if (*q)
- txtalias = q;
- }
-
- /* Null terminate host name. */
- *p = '\0';
-
- /* find out number of aliases. */
- naliases = 0;
- if (txtalias)
- {
- p = txtalias;
- while (*p)
- {
- while (*p && !ISSPACE(*p))
- p++;
- while (*p && ISSPACE(*p))
- p++;
- naliases++;
- }
- }
-
- /* Convert address string to network address for the requested family. */
- addrlen = 0;
- addr.family = AF_UNSPEC;
- addr.addrV4.s_addr = INADDR_NONE;
- if ((family == AF_INET) || (family == AF_UNSPEC))
- {
- if (ares_inet_pton(AF_INET, txtaddr, &addr.addrV4) > 0)
- {
- /* Actual network address family and length. */
- addr.family = AF_INET;
- addrlen = sizeof(addr.addrV4);
- }
- }
- if ((family == AF_INET6) || ((family == AF_UNSPEC) && (!addrlen)))
- {
- if (ares_inet_pton(AF_INET6, txtaddr, &addr.addrV6) > 0)
- {
- /* Actual network address family and length. */
- addr.family = AF_INET6;
- addrlen = sizeof(addr.addrV6);
- }
- }
- if (!addrlen)
- /* Ignore line if invalid address string for the requested family. */
- continue;
-
- /*
- ** Actual address family possible values are AF_INET and AF_INET6 only.
- */
-
- /* Allocate memory for the hostent structure. */
- hostent = ares_malloc(sizeof(struct hostent));
- if (!hostent)
- break;
-
- /* Initialize fields for out of memory condition. */
- hostent->h_aliases = NULL;
- hostent->h_addr_list = NULL;
-
- /* Copy official host name. */
- hostent->h_name = ares_strdup(txthost);
- if (!hostent->h_name)
- break;
-
- /* Copy network address. */
- hostent->h_addr_list = ares_malloc(2 * sizeof(char *));
- if (!hostent->h_addr_list)
- break;
- hostent->h_addr_list[1] = NULL;
- hostent->h_addr_list[0] = ares_malloc(addrlen);
- if (!hostent->h_addr_list[0])
- break;
- if (addr.family == AF_INET)
- memcpy(hostent->h_addr_list[0], &addr.addrV4, sizeof(addr.addrV4));
- else
- memcpy(hostent->h_addr_list[0], &addr.addrV6, sizeof(addr.addrV6));
-
- /* Copy aliases. */
- hostent->h_aliases = ares_malloc((naliases + 1) * sizeof(char *));
- if (!hostent->h_aliases)
- break;
- alias = hostent->h_aliases;
- while (naliases)
- *(alias + naliases--) = NULL;
- *alias = NULL;
- while (txtalias)
- {
- p = txtalias;
- while (*p && !ISSPACE(*p))
- p++;
- q = p;
- while (*q && ISSPACE(*q))
- q++;
- *p = '\0';
- if ((*alias = ares_strdup(txtalias)) == NULL)
- break;
- alias++;
- txtalias = *q ? q : NULL;
- }
- if (txtalias)
- /* Alias memory allocation failure. */
- break;
-
- /* Copy actual network address family and length. */
- hostent->h_addrtype = aresx_sitoss(addr.family);
- hostent->h_length = aresx_uztoss(addrlen);
-
- /* Free line buffer. */
- ares_free(line);
-
- /* Return hostent successfully */
- *host = hostent;
- return ARES_SUCCESS;
-
- }
-
- /* If allocated, free line buffer. */
- if (line)
- ares_free(line);
-
- if (status == ARES_SUCCESS)
- {
- /* Memory allocation failure; clean up. */
- if (hostent)
- {
- if (hostent->h_name)
- ares_free((char *) hostent->h_name);
- if (hostent->h_aliases)
- {
- for (alias = hostent->h_aliases; *alias; alias++)
- ares_free(*alias);
- ares_free(hostent->h_aliases);
- }
- if (hostent->h_addr_list)
- {
- if (hostent->h_addr_list[0])
- ares_free(hostent->h_addr_list[0]);
- ares_free(hostent->h_addr_list);
- }
- ares_free(hostent);
- }
- return ARES_ENOMEM;
- }
-
- return status;
-}
diff --git a/contrib/libs/c-ares/src/lib/ares__hosts_file.c b/contrib/libs/c-ares/src/lib/ares__hosts_file.c
new file mode 100644
index 0000000000..e279623de3
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares__hosts_file.c
@@ -0,0 +1,1030 @@
+/* MIT License
+ *
+ * Copyright (c) 2023 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#include "ares_setup.h"
+#include "ares.h"
+#include "ares_private.h"
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef HAVE_NETINET_IN_H
+# include <netinet/in.h>
+#endif
+#ifdef HAVE_NETDB_H
+# include <netdb.h>
+#endif
+#ifdef HAVE_ARPA_INET_H
+# include <arpa/inet.h>
+#endif
+#include <time.h>
+#include "ares_platform.h"
+
+/* HOSTS FILE PROCESSING OVERVIEW
+ * ==============================
+ * The hosts file on the system contains static entries to be processed locally
+ * rather than querying the nameserver. Each row is an IP address followed by
+ * a list of space delimited hostnames that match the ip address. This is used
+ * for both forward and reverse lookups.
+ *
+ * We are caching the entire parsed hosts file for performance reasons. Some
+ * files may be quite sizable and as per Issue #458 can approach 1/2MB in size,
+ * and the parse overhead on a rapid succession of queries can be quite large.
+ * The entries are stored in forwards and backwards hashtables so we can get
+ * O(1) performance on lookup. The file is cached until the file modification
+ * timestamp changes.
+ *
+ * The hosts file processing is quite unique. It has to merge all related hosts
+ * and ips into a single entry due to file formatting requirements. For
+ * instance take the below:
+ *
+ * 127.0.0.1 localhost.localdomain localhost
+ * ::1 localhost.localdomain localhost
+ * 192.168.1.1 host.example.com host
+ * 192.168.1.5 host.example.com host
+ * 2620:1234::1 host.example.com host6.example.com host6 host
+ *
+ * This will yield 2 entries.
+ * 1) ips: 127.0.0.1,::1
+ * hosts: localhost.localdomain,localhost
+ * 2) ips: 192.168.1.1,192.168.1.5,2620:1234::1
+ * hosts: host.example.com,host,host6.example.com,host6
+ *
+ * It could be argued that if searching for 192.168.1.1 that the 'host6'
+ * hostnames should not be returned, but this implementation will return them
+ * since they are related. It is unlikely this will matter in the real world.
+ */
+
+struct ares_hosts_file {
+ time_t ts;
+ /*! cache the filename so we know if the filename changes it automatically
+ * invalidates the cache */
+ char *filename;
+ /*! iphash is the owner of the 'entry' object as there is only ever a single
+ * match to the object. */
+ ares__htable_strvp_t *iphash;
+ /*! hosthash does not own the entry so won't free on destruction */
+ ares__htable_strvp_t *hosthash;
+};
+
+struct ares_hosts_entry {
+ size_t refcnt; /*! If the entry is stored multiple times in the
+ * ip address hash, we have to reference count it */
+ ares__llist_t *ips;
+ ares__llist_t *hosts;
+};
+
+const void *ares_dns_pton(const char *ipaddr, struct ares_addr *addr,
+ size_t *out_len)
+{
+ const void *ptr = NULL;
+ size_t ptr_len = 0;
+
+ if (ipaddr == NULL || addr == NULL || out_len == NULL) {
+ return NULL;
+ }
+
+ *out_len = 0;
+
+ if (addr->family == AF_INET &&
+ ares_inet_pton(AF_INET, ipaddr, &addr->addr.addr4) > 0) {
+ ptr = &addr->addr.addr4;
+ ptr_len = sizeof(addr->addr.addr4);
+ } else if (addr->family == AF_INET6 &&
+ ares_inet_pton(AF_INET6, ipaddr, &addr->addr.addr6) > 0) {
+ ptr = &addr->addr.addr6;
+ ptr_len = sizeof(addr->addr.addr6);
+ } else if (addr->family == AF_UNSPEC) {
+ if (ares_inet_pton(AF_INET, ipaddr, &addr->addr.addr4) > 0) {
+ addr->family = AF_INET;
+ ptr = &addr->addr.addr4;
+ ptr_len = sizeof(addr->addr.addr4);
+ } else if (ares_inet_pton(AF_INET6, ipaddr, &addr->addr.addr6) > 0) {
+ addr->family = AF_INET6;
+ ptr = &addr->addr.addr6;
+ ptr_len = sizeof(addr->addr.addr6);
+ }
+ }
+
+ *out_len = ptr_len;
+ return ptr;
+}
+
+static ares_bool_t ares__normalize_ipaddr(const char *ipaddr, char *out,
+ size_t out_len)
+{
+ struct ares_addr data;
+ const void *addr;
+ size_t addr_len = 0;
+
+ memset(&data, 0, sizeof(data));
+ data.family = AF_UNSPEC;
+
+ addr = ares_dns_pton(ipaddr, &data, &addr_len);
+ if (addr == NULL) {
+ return ARES_FALSE;
+ }
+
+ if (!ares_inet_ntop(data.family, addr, out, (ares_socklen_t)out_len)) {
+ return ARES_FALSE;
+ }
+
+ return ARES_TRUE;
+}
+
+static void ares__hosts_entry_destroy(ares_hosts_entry_t *entry)
+{
+ if (entry == NULL) {
+ return;
+ }
+
+ /* Honor reference counting */
+ if (entry->refcnt != 0) {
+ entry->refcnt--;
+ }
+
+ if (entry->refcnt > 0) {
+ return;
+ }
+
+ ares__llist_destroy(entry->hosts);
+ ares__llist_destroy(entry->ips);
+ ares_free(entry);
+}
+
+static void ares__hosts_entry_destroy_cb(void *entry)
+{
+ ares__hosts_entry_destroy(entry);
+}
+
+void ares__hosts_file_destroy(ares_hosts_file_t *hf)
+{
+ if (hf == NULL) {
+ return;
+ }
+
+ ares_free(hf->filename);
+ ares__htable_strvp_destroy(hf->hosthash);
+ ares__htable_strvp_destroy(hf->iphash);
+ ares_free(hf);
+}
+
+static ares_hosts_file_t *ares__hosts_file_create(const char *filename)
+{
+ ares_hosts_file_t *hf = ares_malloc_zero(sizeof(*hf));
+ if (hf == NULL) {
+ goto fail;
+ }
+
+ hf->ts = time(NULL);
+
+ hf->filename = ares_strdup(filename);
+ if (hf->filename == NULL) {
+ goto fail;
+ }
+
+ hf->iphash = ares__htable_strvp_create(ares__hosts_entry_destroy_cb);
+ if (hf->iphash == NULL) {
+ goto fail;
+ }
+
+ hf->hosthash = ares__htable_strvp_create(NULL);
+ if (hf->hosthash == NULL) {
+ goto fail;
+ }
+
+ return hf;
+
+fail:
+ ares__hosts_file_destroy(hf);
+ return NULL;
+}
+
+typedef enum {
+ ARES_MATCH_NONE = 0,
+ ARES_MATCH_IPADDR = 1,
+ ARES_MATCH_HOST = 2
+} ares_hosts_file_match_t;
+
+static ares_status_t ares__hosts_file_merge_entry(
+ const ares_hosts_file_t *hf, ares_hosts_entry_t *existing,
+ ares_hosts_entry_t *entry, ares_hosts_file_match_t matchtype)
+{
+ ares__llist_node_t *node;
+
+ /* If we matched on IP address, we know there can only be 1, so there's no
+ * reason to do anything */
+ if (matchtype != ARES_MATCH_IPADDR) {
+ while ((node = ares__llist_node_first(entry->ips)) != NULL) {
+ const char *ipaddr = ares__llist_node_val(node);
+
+ if (ares__htable_strvp_get_direct(hf->iphash, ipaddr) != NULL) {
+ ares__llist_node_destroy(node);
+ continue;
+ }
+
+ ares__llist_node_move_parent_last(node, existing->ips);
+ }
+ }
+
+
+ while ((node = ares__llist_node_first(entry->hosts)) != NULL) {
+ const char *hostname = ares__llist_node_val(node);
+
+ if (ares__htable_strvp_get_direct(hf->hosthash, hostname) != NULL) {
+ ares__llist_node_destroy(node);
+ continue;
+ }
+
+ ares__llist_node_move_parent_last(node, existing->hosts);
+ }
+
+ ares__hosts_entry_destroy(entry);
+ return ARES_SUCCESS;
+}
+
+static ares_hosts_file_match_t
+ ares__hosts_file_match(const ares_hosts_file_t *hf, ares_hosts_entry_t *entry,
+ ares_hosts_entry_t **match)
+{
+ ares__llist_node_t *node;
+ *match = NULL;
+
+ for (node = ares__llist_node_first(entry->ips); node != NULL;
+ node = ares__llist_node_next(node)) {
+ const char *ipaddr = ares__llist_node_val(node);
+ *match = ares__htable_strvp_get_direct(hf->iphash, ipaddr);
+ if (*match != NULL) {
+ return ARES_MATCH_IPADDR;
+ }
+ }
+
+ for (node = ares__llist_node_first(entry->hosts); node != NULL;
+ node = ares__llist_node_next(node)) {
+ const char *host = ares__llist_node_val(node);
+ *match = ares__htable_strvp_get_direct(hf->hosthash, host);
+ if (*match != NULL) {
+ return ARES_MATCH_HOST;
+ }
+ }
+
+ return ARES_MATCH_NONE;
+}
+
+/*! entry is invalidated upon calling this function, always, even on error */
+static ares_status_t ares__hosts_file_add(ares_hosts_file_t *hosts,
+ ares_hosts_entry_t *entry)
+{
+ ares_hosts_entry_t *match = NULL;
+ ares_status_t status = ARES_SUCCESS;
+ ares__llist_node_t *node;
+ ares_hosts_file_match_t matchtype;
+ size_t num_hostnames;
+
+ /* Record the number of hostnames in this entry file. If we merge into an
+ * existing record, these will be *appended* to the entry, so we'll count
+ * backwards when adding to the hosts hashtable */
+ num_hostnames = ares__llist_len(entry->hosts);
+
+ matchtype = ares__hosts_file_match(hosts, entry, &match);
+
+ if (matchtype != ARES_MATCH_NONE) {
+ status = ares__hosts_file_merge_entry(hosts, match, entry, matchtype);
+ if (status != ARES_SUCCESS) {
+ ares__hosts_entry_destroy(entry);
+ return status;
+ }
+ /* entry was invalidated above by merging */
+ entry = match;
+ }
+
+ if (matchtype != ARES_MATCH_IPADDR) {
+ const char *ipaddr = ares__llist_last_val(entry->ips);
+
+ if (!ares__htable_strvp_get(hosts->iphash, ipaddr, NULL)) {
+ if (!ares__htable_strvp_insert(hosts->iphash, ipaddr, entry)) {
+ ares__hosts_entry_destroy(entry);
+ return ARES_ENOMEM;
+ }
+ entry->refcnt++;
+ }
+ }
+
+ /* Go backwards, on a merge, hostnames are appended. Breakout once we've
+ * consumed all the hosts that we appended */
+ for (node = ares__llist_node_last(entry->hosts); node != NULL;
+ node = ares__llist_node_prev(node)) {
+ const char *val = ares__llist_node_val(node);
+
+ if (num_hostnames == 0) {
+ break;
+ }
+
+ num_hostnames--;
+
+ /* first hostname match wins. If we detect a duplicate hostname for another
+ * ip it will automatically be added to the same entry */
+ if (ares__htable_strvp_get(hosts->hosthash, val, NULL)) {
+ continue;
+ }
+
+ if (!ares__htable_strvp_insert(hosts->hosthash, val, entry)) {
+ return ARES_ENOMEM;
+ }
+ }
+
+ return ARES_SUCCESS;
+}
+
+static ares_bool_t ares__hosts_entry_isdup(ares_hosts_entry_t *entry,
+ const char *host)
+{
+ ares__llist_node_t *node;
+
+ for (node = ares__llist_node_first(entry->ips); node != NULL;
+ node = ares__llist_node_next(node)) {
+ const char *myhost = ares__llist_node_val(node);
+ if (strcasecmp(myhost, host) == 0) {
+ return ARES_TRUE;
+ }
+ }
+
+ return ARES_FALSE;
+}
+
+static ares_status_t ares__parse_hosts_hostnames(ares__buf_t *buf,
+ ares_hosts_entry_t *entry)
+{
+ entry->hosts = ares__llist_create(ares_free);
+ if (entry->hosts == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ /* Parse hostnames and aliases */
+ while (ares__buf_len(buf)) {
+ char hostname[256];
+ char *temp;
+ ares_status_t status;
+ unsigned char comment = '#';
+
+ ares__buf_consume_whitespace(buf, ARES_FALSE);
+
+ if (ares__buf_len(buf) == 0) {
+ break;
+ }
+
+ /* See if it is a comment, if so stop processing */
+ if (ares__buf_begins_with(buf, &comment, 1)) {
+ break;
+ }
+
+ ares__buf_tag(buf);
+
+ /* Must be at end of line */
+ if (ares__buf_consume_nonwhitespace(buf) == 0) {
+ break;
+ }
+
+ status = ares__buf_tag_fetch_string(buf, hostname, sizeof(hostname));
+ if (status != ARES_SUCCESS) {
+ /* Bad entry, just ignore as long as its not the first. If its the first,
+ * it must be valid */
+ if (ares__llist_len(entry->hosts) == 0) {
+ return ARES_EBADSTR;
+ }
+
+ continue;
+ }
+
+ /* Validate it is a valid hostname characterset */
+ if (!ares__is_hostname(hostname)) {
+ continue;
+ }
+
+ /* Don't add a duplicate to the same entry */
+ if (ares__hosts_entry_isdup(entry, hostname)) {
+ continue;
+ }
+
+ /* Add to list */
+ temp = ares_strdup(hostname);
+ if (temp == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ if (ares__llist_insert_last(entry->hosts, temp) == NULL) {
+ ares_free(temp);
+ return ARES_ENOMEM;
+ }
+ }
+
+ /* Must have at least 1 entry */
+ if (ares__llist_len(entry->hosts) == 0) {
+ return ARES_EBADSTR;
+ }
+
+ return ARES_SUCCESS;
+}
+
+static ares_status_t ares__parse_hosts_ipaddr(ares__buf_t *buf,
+ ares_hosts_entry_t **entry_out)
+{
+ char addr[INET6_ADDRSTRLEN];
+ char *temp;
+ ares_hosts_entry_t *entry = NULL;
+ ares_status_t status;
+
+ *entry_out = NULL;
+
+ ares__buf_tag(buf);
+ ares__buf_consume_nonwhitespace(buf);
+ status = ares__buf_tag_fetch_string(buf, addr, sizeof(addr));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Validate and normalize the ip address format */
+ if (!ares__normalize_ipaddr(addr, addr, sizeof(addr))) {
+ return ARES_EBADSTR;
+ }
+
+ entry = ares_malloc_zero(sizeof(*entry));
+ if (entry == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ entry->ips = ares__llist_create(ares_free);
+ if (entry->ips == NULL) {
+ ares__hosts_entry_destroy(entry);
+ return ARES_ENOMEM;
+ }
+
+ temp = ares_strdup(addr);
+ if (temp == NULL) {
+ ares__hosts_entry_destroy(entry);
+ return ARES_ENOMEM;
+ }
+
+ if (ares__llist_insert_first(entry->ips, temp) == NULL) {
+ ares_free(temp);
+ ares__hosts_entry_destroy(entry);
+ return ARES_ENOMEM;
+ }
+
+ *entry_out = entry;
+
+ return ARES_SUCCESS;
+}
+
+static ares_status_t ares__parse_hosts(const char *filename,
+ ares_hosts_file_t **out)
+{
+ ares__buf_t *buf = NULL;
+ ares_status_t status = ARES_EBADRESP;
+ ares_hosts_file_t *hf = NULL;
+ ares_hosts_entry_t *entry = NULL;
+
+ *out = NULL;
+
+ buf = ares__buf_create();
+ if (buf == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ status = ares__buf_load_file(filename, buf);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ hf = ares__hosts_file_create(filename);
+ if (hf == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ while (ares__buf_len(buf)) {
+ unsigned char comment = '#';
+
+ /* -- Start of new line here -- */
+
+ /* Consume any leading whitespace */
+ ares__buf_consume_whitespace(buf, ARES_FALSE);
+
+ if (ares__buf_len(buf) == 0) {
+ break;
+ }
+
+ /* See if it is a comment, if so, consume remaining line */
+ if (ares__buf_begins_with(buf, &comment, 1)) {
+ ares__buf_consume_line(buf, ARES_TRUE);
+ continue;
+ }
+
+ /* Pull off ip address */
+ status = ares__parse_hosts_ipaddr(buf, &entry);
+ if (status == ARES_ENOMEM) {
+ goto done;
+ }
+ if (status != ARES_SUCCESS) {
+ /* Bad line, consume and go onto next */
+ ares__buf_consume_line(buf, ARES_TRUE);
+ continue;
+ }
+
+ /* Parse of the hostnames */
+ status = ares__parse_hosts_hostnames(buf, entry);
+ if (status == ARES_ENOMEM) {
+ goto done;
+ } else if (status != ARES_SUCCESS) {
+ /* Bad line, consume and go onto next */
+ ares__hosts_entry_destroy(entry);
+ entry = NULL;
+ ares__buf_consume_line(buf, ARES_TRUE);
+ continue;
+ }
+
+ /* Append the successful entry to the hosts file */
+ status = ares__hosts_file_add(hf, entry);
+ entry = NULL; /* is always invalidated by this function, even on error */
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ /* Go to next line */
+ ares__buf_consume_line(buf, ARES_TRUE);
+ }
+
+ status = ARES_SUCCESS;
+
+done:
+ ares__hosts_entry_destroy(entry);
+ ares__buf_destroy(buf);
+ if (status != ARES_SUCCESS) {
+ ares__hosts_file_destroy(hf);
+ } else {
+ *out = hf;
+ }
+ return status;
+}
+
+static ares_bool_t ares__hosts_expired(const char *filename,
+ const ares_hosts_file_t *hf)
+{
+ time_t mod_ts = 0;
+
+#ifdef HAVE_STAT
+ struct stat st;
+ if (stat(filename, &st) == 0) {
+ mod_ts = st.st_mtime;
+ }
+#elif defined(_WIN32)
+ struct _stat st;
+ if (_stat(filename, &st) == 0) {
+ mod_ts = st.st_mtime;
+ }
+#else
+ (void)filename;
+#endif
+
+ if (hf == NULL) {
+ return ARES_TRUE;
+ }
+
+ /* Expire every 60s if we can't get a time */
+ if (mod_ts == 0) {
+ mod_ts = time(NULL) - 60;
+ }
+
+ /* If filenames are different, its expired */
+ if (strcasecmp(hf->filename, filename) != 0) {
+ return ARES_TRUE;
+ }
+
+ if (hf->ts <= mod_ts) {
+ return ARES_TRUE;
+ }
+
+ return ARES_FALSE;
+}
+
+static ares_status_t ares__hosts_path(const ares_channel_t *channel,
+ ares_bool_t use_env, char **path)
+{
+ char *path_hosts = NULL;
+
+ *path = NULL;
+
+ if (channel->hosts_path) {
+ path_hosts = ares_strdup(channel->hosts_path);
+ if (!path_hosts) {
+ return ARES_ENOMEM;
+ }
+ }
+
+ if (use_env) {
+ if (path_hosts) {
+ ares_free(path_hosts);
+ }
+
+ path_hosts = ares_strdup(getenv("CARES_HOSTS"));
+ if (!path_hosts) {
+ return ARES_ENOMEM;
+ }
+ }
+
+ if (!path_hosts) {
+#ifdef WIN32
+ char PATH_HOSTS[MAX_PATH] = "";
+ char tmp[MAX_PATH];
+ HKEY hkeyHosts;
+ DWORD dwLength = sizeof(tmp);
+ if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0, KEY_READ,
+ &hkeyHosts) != ERROR_SUCCESS) {
+ return ARES_ENOTFOUND;
+ }
+ RegQueryValueExA(hkeyHosts, DATABASEPATH, NULL, NULL, (LPBYTE)tmp,
+ &dwLength);
+ ExpandEnvironmentStringsA(tmp, PATH_HOSTS, MAX_PATH);
+ RegCloseKey(hkeyHosts);
+ strcat(PATH_HOSTS, WIN_PATH_HOSTS);
+#elif defined(WATT32)
+ const char *PATH_HOSTS = _w32_GetHostsFile();
+
+ if (!PATH_HOSTS) {
+ return ARES_ENOTFOUND;
+ }
+#endif
+ path_hosts = ares_strdup(PATH_HOSTS);
+ if (!path_hosts) {
+ return ARES_ENOMEM;
+ }
+ }
+
+ *path = path_hosts;
+ return ARES_SUCCESS;
+}
+
+static ares_status_t ares__hosts_update(ares_channel_t *channel,
+ ares_bool_t use_env)
+{
+ ares_status_t status;
+ char *filename = NULL;
+
+ status = ares__hosts_path(channel, use_env, &filename);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ if (!ares__hosts_expired(filename, channel->hf)) {
+ ares_free(filename);
+ return ARES_SUCCESS;
+ }
+
+ ares__hosts_file_destroy(channel->hf);
+ channel->hf = NULL;
+
+ status = ares__parse_hosts(filename, &channel->hf);
+ ares_free(filename);
+ return status;
+}
+
+ares_status_t ares__hosts_search_ipaddr(ares_channel_t *channel,
+ ares_bool_t use_env, const char *ipaddr,
+ const ares_hosts_entry_t **entry)
+{
+ ares_status_t status;
+ char addr[INET6_ADDRSTRLEN];
+
+ *entry = NULL;
+
+ status = ares__hosts_update(channel, use_env);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ if (channel->hf == NULL) {
+ return ARES_ENOTFOUND;
+ }
+
+ if (!ares__normalize_ipaddr(ipaddr, addr, sizeof(addr))) {
+ return ARES_EBADNAME;
+ }
+
+ *entry = ares__htable_strvp_get_direct(channel->hf->iphash, addr);
+ if (*entry == NULL) {
+ return ARES_ENOTFOUND;
+ }
+
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares__hosts_search_host(ares_channel_t *channel,
+ ares_bool_t use_env, const char *host,
+ const ares_hosts_entry_t **entry)
+{
+ ares_status_t status;
+
+ *entry = NULL;
+
+ status = ares__hosts_update(channel, use_env);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ if (channel->hf == NULL) {
+ return ARES_ENOTFOUND;
+ }
+
+ *entry = ares__htable_strvp_get_direct(channel->hf->hosthash, host);
+ if (*entry == NULL) {
+ return ARES_ENOTFOUND;
+ }
+
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares__hosts_entry_to_hostent(const ares_hosts_entry_t *entry,
+ int family, struct hostent **hostent)
+{
+ ares_status_t status;
+ size_t naliases;
+ ares__llist_node_t *node;
+ size_t idx;
+
+ *hostent = ares_malloc_zero(sizeof(**hostent));
+ if (*hostent == NULL) {
+ status = ARES_ENOMEM;
+ goto fail;
+ }
+
+ (*hostent)->h_addrtype = (HOSTENT_ADDRTYPE_TYPE)family;
+
+ /* Copy IP addresses that match the address family */
+ idx = 0;
+ for (node = ares__llist_node_first(entry->ips); node != NULL;
+ node = ares__llist_node_next(node)) {
+ struct ares_addr addr;
+ const void *ptr = NULL;
+ size_t ptr_len = 0;
+ const char *ipaddr = ares__llist_node_val(node);
+ char **temp = NULL;
+
+ memset(&addr, 0, sizeof(addr));
+
+ addr.family = family;
+ ptr = ares_dns_pton(ipaddr, &addr, &ptr_len);
+ if (ptr == NULL) {
+ continue;
+ }
+
+ /* If family == AF_UNSPEC, then we want to inherit this for future
+ * conversions as we can only support a single address class */
+ if (family == AF_UNSPEC) {
+ family = addr.family;
+ (*hostent)->h_addrtype = (HOSTENT_ADDRTYPE_TYPE)addr.family;
+ }
+
+ temp = ares_realloc_zero((*hostent)->h_addr_list,
+ (idx + 1) * sizeof(*(*hostent)->h_addr_list),
+ (idx + 2) * sizeof(*(*hostent)->h_addr_list));
+ if (temp == NULL) {
+ status = ARES_ENOMEM;
+ goto fail;
+ }
+
+ (*hostent)->h_addr_list = temp;
+
+ (*hostent)->h_addr_list[idx] = ares_malloc(ptr_len);
+ if ((*hostent)->h_addr_list[idx] == NULL) {
+ status = ARES_ENOMEM;
+ goto fail;
+ }
+
+ memcpy((*hostent)->h_addr_list[idx], ptr, ptr_len);
+ idx++;
+ (*hostent)->h_length = (HOSTENT_LENGTH_TYPE)ptr_len;
+ }
+
+ /* entry didn't match address class */
+ if (idx == 0) {
+ status = ARES_ENOTFOUND;
+ goto fail;
+ }
+
+ /* Copy main hostname */
+ (*hostent)->h_name = ares_strdup(ares__llist_first_val(entry->hosts));
+ if ((*hostent)->h_name == NULL) {
+ status = ARES_ENOMEM;
+ goto fail;
+ }
+
+ /* Copy aliases */
+ naliases = ares__llist_len(entry->hosts) - 1;
+
+ /* Cap at 100, some people use https://github.com/StevenBlack/hosts and we
+ * don't need 200k+ aliases */
+ if (naliases > 100) {
+ naliases = 100;
+ }
+
+ (*hostent)->h_aliases =
+ ares_malloc_zero((naliases + 1) * sizeof(*(*hostent)->h_aliases));
+ if ((*hostent)->h_aliases == NULL) {
+ status = ARES_ENOMEM;
+ goto fail;
+ }
+
+ /* Copy all entries to the alias except the first */
+ idx = 0;
+ node = ares__llist_node_first(entry->hosts);
+ node = ares__llist_node_next(node);
+ while (node != NULL) {
+ (*hostent)->h_aliases[idx] = ares_strdup(ares__llist_node_val(node));
+ if ((*hostent)->h_aliases[idx] == NULL) {
+ status = ARES_ENOMEM;
+ goto fail;
+ }
+ idx++;
+
+ /* Break out if artificially capped */
+ if (idx == naliases) {
+ break;
+ }
+ node = ares__llist_node_next(node);
+ }
+
+ return ARES_SUCCESS;
+
+fail:
+ ares_free_hostent(*hostent);
+ *hostent = NULL;
+ return status;
+}
+
+static ares_status_t
+ ares__hosts_ai_append_cnames(const ares_hosts_entry_t *entry,
+ struct ares_addrinfo_cname **cnames_out)
+{
+ struct ares_addrinfo_cname *cname = NULL;
+ struct ares_addrinfo_cname *cnames = NULL;
+ const char *primaryhost;
+ ares__llist_node_t *node;
+ ares_status_t status;
+ size_t cnt = 0;
+
+ node = ares__llist_node_first(entry->hosts);
+ primaryhost = ares__llist_node_val(node);
+ /* Skip to next node to start with aliases */
+ node = ares__llist_node_next(node);
+
+ while (node != NULL) {
+ const char *host = ares__llist_node_val(node);
+
+ /* Cap at 100 entries. , some people use
+ * https://github.com/StevenBlack/hosts and we don't need 200k+ aliases */
+ cnt++;
+ if (cnt > 100) {
+ break;
+ }
+
+ cname = ares__append_addrinfo_cname(&cnames);
+ if (cname == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ cname->alias = ares_strdup(host);
+ if (cname->alias == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ cname->name = ares_strdup(primaryhost);
+ if (cname->name == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ node = ares__llist_node_next(node);
+ }
+
+ /* No entries, add only primary */
+ if (cnames == NULL) {
+ cname = ares__append_addrinfo_cname(&cnames);
+ if (cname == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ cname->name = ares_strdup(primaryhost);
+ if (cname->name == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ }
+ status = ARES_SUCCESS;
+
+done:
+ if (status != ARES_SUCCESS) {
+ ares__freeaddrinfo_cnames(cnames);
+ return status;
+ }
+
+ *cnames_out = cnames;
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares__hosts_entry_to_addrinfo(const ares_hosts_entry_t *entry,
+ const char *name, int family,
+ unsigned short port,
+ ares_bool_t want_cnames,
+ struct ares_addrinfo *ai)
+{
+ ares_status_t status;
+ struct ares_addrinfo_cname *cnames = NULL;
+ struct ares_addrinfo_node *ainodes = NULL;
+ ares__llist_node_t *node;
+
+ switch (family) {
+ case AF_INET:
+ case AF_INET6:
+ case AF_UNSPEC:
+ break;
+ default:
+ return ARES_EBADFAMILY;
+ }
+
+ ai->name = ares_strdup(name);
+ if (ai->name == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ for (node = ares__llist_node_first(entry->ips); node != NULL;
+ node = ares__llist_node_next(node)) {
+ struct ares_addr addr;
+ const void *ptr = NULL;
+ size_t ptr_len = 0;
+ const char *ipaddr = ares__llist_node_val(node);
+
+ memset(&addr, 0, sizeof(addr));
+ addr.family = family;
+ ptr = ares_dns_pton(ipaddr, &addr, &ptr_len);
+
+ if (ptr == NULL) {
+ continue;
+ }
+
+ status = ares_append_ai_node(addr.family, port, 0, ptr, &ainodes);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+
+ if (want_cnames) {
+ status = ares__hosts_ai_append_cnames(entry, &cnames);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+
+ status = ARES_SUCCESS;
+
+done:
+ if (status != ARES_SUCCESS) {
+ ares__freeaddrinfo_cnames(cnames);
+ ares__freeaddrinfo_nodes(ainodes);
+ ares_free(ai->name);
+ ai->name = NULL;
+ return status;
+ }
+ ares__addrinfo_cat_cnames(&ai->cnames, cnames);
+ ares__addrinfo_cat_nodes(&ai->nodes, ainodes);
+
+ return status;
+}
diff --git a/contrib/libs/c-ares/src/lib/ares__htable.c b/contrib/libs/c-ares/src/lib/ares__htable.c
index 3ea65642d9..7aaf2d2089 100644
--- a/contrib/libs/c-ares/src/lib/ares__htable.c
+++ b/contrib/libs/c-ares/src/lib/ares__htable.c
@@ -29,8 +29,8 @@
#include "ares__llist.h"
#include "ares__htable.h"
-#define ARES__HTABLE_MAX_BUCKETS (1U<<24)
-#define ARES__HTABLE_MIN_BUCKETS (1U<<4)
+#define ARES__HTABLE_MAX_BUCKETS (1U << 24)
+#define ARES__HTABLE_MIN_BUCKETS (1U << 4)
#define ARES__HTABLE_EXPAND_PERCENT 75
struct ares__htable {
@@ -41,44 +41,48 @@ struct ares__htable {
unsigned int seed;
unsigned int size;
size_t num_keys;
+ size_t num_collisions;
/* NOTE: if we converted buckets into ares__slist_t we could guarantee on
* hash collisions we would have O(log n) worst case insert and search
* performance. (We'd also need to make key_eq into a key_cmp to
* support sort). That said, risk with a random hash seed is near zero,
- * and ares__slist_t is heavier weight so I think using ares__llist_t is
+ * and ares__slist_t is heavier weight, so I think using ares__llist_t
* is an overall win. */
ares__llist_t **buckets;
};
-
static unsigned int ares__htable_generate_seed(ares__htable_t *htable)
{
unsigned int seed = 0;
+ time_t t = time(NULL);
/* Mix stack address, heap address, and time to generate a random seed, it
* doesn't have to be super secure, just quick. Likelihood of a hash
* collision attack is very low with a small amount of effort */
seed |= (unsigned int)((size_t)htable & 0xFFFFFFFF);
seed |= (unsigned int)((size_t)&seed & 0xFFFFFFFF);
- seed |= (unsigned int)time(NULL) & 0xFFFFFFFF;
+ seed |= (unsigned int)(t & 0xFFFFFFFF);
return seed;
}
static void ares__htable_buckets_destroy(ares__llist_t **buckets,
- unsigned int size,
- unsigned char destroy_vals)
+ unsigned int size,
+ ares_bool_t destroy_vals)
{
unsigned int i;
- if (buckets == NULL)
+ if (buckets == NULL) {
return;
+ }
- for (i=0; i<size; i++) {
- if (buckets[i] == NULL)
+ for (i = 0; i < size; i++) {
+ if (buckets[i] == NULL) {
continue;
+ }
- if (!destroy_vals)
+ if (!destroy_vals) {
ares__llist_replace_destructor(buckets[i], NULL);
+ }
ares__llist_destroy(buckets[i]);
}
@@ -86,16 +90,15 @@ static void ares__htable_buckets_destroy(ares__llist_t **buckets,
ares_free(buckets);
}
-
void ares__htable_destroy(ares__htable_t *htable)
{
- if (htable == NULL)
+ if (htable == NULL) {
return;
- ares__htable_buckets_destroy(htable->buckets, htable->size, 1);
+ }
+ ares__htable_buckets_destroy(htable->buckets, htable->size, ARES_TRUE);
ares_free(htable);
}
-
ares__htable_t *ares__htable_create(ares__htable_hashfunc_t hash_func,
ares__htable_bucket_key_t bucket_key,
ares__htable_bucket_free_t bucket_free,
@@ -108,11 +111,10 @@ ares__htable_t *ares__htable_create(ares__htable_hashfunc_t hash_func,
goto fail;
}
- htable = ares_malloc(sizeof(*htable));
- if (htable == NULL)
+ htable = ares_malloc_zero(sizeof(*htable));
+ if (htable == NULL) {
goto fail;
-
- memset(htable, 0, sizeof(*htable));
+ }
htable->hash = hash_func;
htable->bucket_key = bucket_key;
@@ -120,12 +122,11 @@ ares__htable_t *ares__htable_create(ares__htable_hashfunc_t hash_func,
htable->key_eq = key_eq;
htable->seed = ares__htable_generate_seed(htable);
htable->size = ARES__HTABLE_MIN_BUCKETS;
- htable->buckets = ares_malloc(sizeof(*htable->buckets) * htable->size);
+ htable->buckets = ares_malloc_zero(sizeof(*htable->buckets) * htable->size);
- if (htable->buckets == NULL)
+ if (htable->buckets == NULL) {
goto fail;
-
- memset(htable->buckets, 0, sizeof(*htable->buckets) * htable->size);
+ }
return htable;
@@ -134,6 +135,34 @@ fail:
return NULL;
}
+const void **ares__htable_all_buckets(const ares__htable_t *htable, size_t *num)
+{
+ const void **out = NULL;
+ size_t cnt = 0;
+ size_t i;
+
+ if (htable == NULL || num == NULL) {
+ return NULL;
+ }
+
+ *num = 0;
+
+ out = ares_malloc_zero(sizeof(*out) * htable->num_keys);
+ if (out == NULL) {
+ return NULL;
+ }
+
+ for (i = 0; i < htable->size; i++) {
+ ares__llist_node_t *node;
+ for (node = ares__llist_node_first(htable->buckets[i]); node != NULL;
+ node = ares__llist_node_next(node)) {
+ out[cnt++] = ares__llist_node_val(node);
+ }
+ }
+
+ *num = cnt;
+ return out;
+}
/*! Grabs the Hashtable index from the key and length. The h index is
* the hash of the function reduced to the size of the bucket list.
@@ -142,106 +171,172 @@ fail:
* efficient */
#define HASH_IDX(h, key) h->hash(key, h->seed) & (h->size - 1)
-static ares__llist_node_t *ares__htable_find(ares__htable_t *htable,
- unsigned int idx,
- const void *key)
+static ares__llist_node_t *ares__htable_find(const ares__htable_t *htable,
+ unsigned int idx, const void *key)
{
ares__llist_node_t *node = NULL;
- for (node = ares__llist_node_first(htable->buckets[idx]);
- node != NULL;
+ for (node = ares__llist_node_first(htable->buckets[idx]); node != NULL;
node = ares__llist_node_next(node)) {
-
- if (htable->key_eq(key, htable->bucket_key(ares__llist_node_val(node))))
+ if (htable->key_eq(key, htable->bucket_key(ares__llist_node_val(node)))) {
break;
+ }
}
return node;
}
-
-static unsigned int ares__htable_expand(ares__htable_t *htable)
+static ares_bool_t ares__htable_expand(ares__htable_t *htable)
{
ares__llist_t **buckets = NULL;
unsigned int old_size = htable->size;
size_t i;
+ ares__llist_t **prealloc_llist = NULL;
+ size_t prealloc_llist_len = 0;
+ ares_bool_t rv = ARES_FALSE;
/* Not a failure, just won't expand */
- if (old_size == ARES__HTABLE_MAX_BUCKETS)
- return 1;
+ if (old_size == ARES__HTABLE_MAX_BUCKETS) {
+ return ARES_TRUE;
+ }
htable->size <<= 1;
- /* We must do this in 2 passes as we want it to be non-destructive in case
- * there is a memory allocation failure. So we will actually use more
- * memory doing it this way, but at least we might be able to gracefully
- * recover */
- buckets = ares_malloc(sizeof(*buckets) * htable->size);
- if (buckets == NULL)
- goto fail;
+ /* We must pre-allocate all memory we'll need before moving entries to the
+ * new hash array. Otherwise if there's a memory allocation failure in the
+ * middle, we wouldn't be able to recover. */
+ buckets = ares_malloc_zero(sizeof(*buckets) * htable->size);
+ if (buckets == NULL) {
+ goto done;
+ }
- memset(buckets, 0, sizeof(*buckets) * htable->size);
+ /* The maximum number of new llists we'll need is the number of collisions
+ * that were recorded */
+ prealloc_llist_len = htable->num_collisions;
+ if (prealloc_llist_len) {
+ prealloc_llist =
+ ares_malloc_zero(sizeof(*prealloc_llist) * prealloc_llist_len);
+ if (prealloc_llist == NULL) {
+ goto done;
+ }
+ }
+ for (i = 0; i < prealloc_llist_len; i++) {
+ prealloc_llist[i] = ares__llist_create(htable->bucket_free);
+ if (prealloc_llist[i] == NULL) {
+ goto done;
+ }
+ }
- for (i=0; i<old_size; i++) {
+ /* Iterate across all buckets and move the entries to the new buckets */
+ htable->num_collisions = 0;
+ for (i = 0; i < old_size; i++) {
ares__llist_node_t *node;
- for (node = ares__llist_node_first(htable->buckets[i]);
- node != NULL;
- node = ares__llist_node_next(node)) {
- void *val = ares__llist_node_val(node);
- size_t idx = HASH_IDX(htable, htable->bucket_key(val));
+ /* Nothing in this bucket */
+ if (htable->buckets[i] == NULL) {
+ continue;
+ }
+
+ /* Fast path optimization (most likely case), there is likely only a single
+ * entry in both the source and destination, check for this to confirm and
+ * if so, just move the bucket over */
+ if (ares__llist_len(htable->buckets[i]) == 1) {
+ const void *val = ares__llist_first_val(htable->buckets[i]);
+ size_t idx = HASH_IDX(htable, htable->bucket_key(val));
if (buckets[idx] == NULL) {
- buckets[idx] = ares__llist_create(htable->bucket_free);
- if (buckets[idx] == NULL)
- goto fail;
+ /* Swap! */
+ buckets[idx] = htable->buckets[i];
+ htable->buckets[i] = NULL;
+ continue;
+ }
+ }
+
+ /* Slow path, collisions */
+ while ((node = ares__llist_node_first(htable->buckets[i])) != NULL) {
+ const void *val = ares__llist_node_val(node);
+ size_t idx = HASH_IDX(htable, htable->bucket_key(val));
+
+ /* Try fast path again as maybe we popped one collision off and the
+ * next we can reuse the llist parent */
+ if (buckets[idx] == NULL && ares__llist_len(htable->buckets[i]) == 1) {
+ /* Swap! */
+ buckets[idx] = htable->buckets[i];
+ htable->buckets[i] = NULL;
+ break;
}
- if (ares__llist_insert_first(buckets[idx], val) == NULL) {
- goto fail;
+ /* Grab one off our preallocated list */
+ if (buckets[idx] == NULL) {
+ /* Silence static analysis, this isn't possible but it doesn't know */
+ if (prealloc_llist == NULL || prealloc_llist_len == 0) {
+ goto done;
+ }
+ buckets[idx] = prealloc_llist[prealloc_llist_len - 1];
+ prealloc_llist_len--;
+ } else {
+ /* Collision occurred since the bucket wasn't empty */
+ htable->num_collisions++;
}
+ ares__llist_node_move_parent_first(node, buckets[idx]);
+ }
+
+ /* Abandoned bucket, destroy */
+ if (htable->buckets[i] != NULL) {
+ ares__llist_destroy(htable->buckets[i]);
+ htable->buckets[i] = NULL;
}
}
- /* Swap out buckets */
- ares__htable_buckets_destroy(htable->buckets, old_size, 0);
+ /* We have guaranteed all the buckets have either been moved or destroyed,
+ * so we just call ares_free() on the array and swap out the pointer */
+ ares_free(htable->buckets);
htable->buckets = buckets;
- return 1;
+ buckets = NULL;
+ rv = ARES_TRUE;
-fail:
- ares__htable_buckets_destroy(buckets, htable->size, 0);
- htable->size = old_size;
+done:
+ ares_free(buckets);
+ /* destroy any unused preallocated buckets */
+ ares__htable_buckets_destroy(prealloc_llist, (unsigned int)prealloc_llist_len,
+ ARES_FALSE);
- return 0;
-}
+ /* On failure, we need to restore the htable size */
+ if (rv != ARES_TRUE) {
+ htable->size = old_size;
+ }
+ return rv;
+}
-unsigned int ares__htable_insert(ares__htable_t *htable, void *bucket)
+ares_bool_t ares__htable_insert(ares__htable_t *htable, void *bucket)
{
unsigned int idx = 0;
ares__llist_node_t *node = NULL;
const void *key = NULL;
- if (htable == NULL || bucket == NULL)
- return 0;
+ if (htable == NULL || bucket == NULL) {
+ return ARES_FALSE;
+ }
- key = htable->bucket_key(bucket);
- idx = HASH_IDX(htable, key);
+ key = htable->bucket_key(bucket);
+ idx = HASH_IDX(htable, key);
/* See if we have a matching bucket already, if so, replace it */
node = ares__htable_find(htable, idx, key);
if (node != NULL) {
ares__llist_node_replace(node, bucket);
- return 1;
+ return ARES_TRUE;
}
/* Check to see if we should rehash because likelihood of collisions has
* increased beyond our threshold */
- if (htable->num_keys+1 > (htable->size * ARES__HTABLE_EXPAND_PERCENT) / 100) {
+ if (htable->num_keys + 1 >
+ (htable->size * ARES__HTABLE_EXPAND_PERCENT) / 100) {
if (!ares__htable_expand(htable)) {
- return 0;
+ return ARES_FALSE;
}
/* If we expanded, need to calculate a new index */
idx = HASH_IDX(htable, key);
@@ -250,55 +345,70 @@ unsigned int ares__htable_insert(ares__htable_t *htable, void *bucket)
/* We lazily allocate the linked list */
if (htable->buckets[idx] == NULL) {
htable->buckets[idx] = ares__llist_create(htable->bucket_free);
- if (htable->buckets[idx] == NULL)
- return 0;
+ if (htable->buckets[idx] == NULL) {
+ return ARES_FALSE;
+ }
}
-
+
node = ares__llist_insert_first(htable->buckets[idx], bucket);
- if (node == NULL)
- return 0;
+ if (node == NULL) {
+ return ARES_FALSE;
+ }
+
+ /* Track collisions for rehash stability */
+ if (ares__llist_len(htable->buckets[idx]) > 1) {
+ htable->num_collisions++;
+ }
htable->num_keys++;
- return 1;
+ return ARES_TRUE;
}
-
-void *ares__htable_get(ares__htable_t *htable, const void *key)
+void *ares__htable_get(const ares__htable_t *htable, const void *key)
{
unsigned int idx;
- if (htable == NULL || key == NULL)
+ if (htable == NULL || key == NULL) {
return NULL;
+ }
idx = HASH_IDX(htable, key);
return ares__llist_node_val(ares__htable_find(htable, idx, key));
}
-
-unsigned int ares__htable_remove(ares__htable_t *htable, const void *key)
+ares_bool_t ares__htable_remove(ares__htable_t *htable, const void *key)
{
ares__llist_node_t *node;
unsigned int idx;
- if (htable == NULL || key == NULL)
- return 0;
+ if (htable == NULL || key == NULL) {
+ return ARES_FALSE;
+ }
idx = HASH_IDX(htable, key);
node = ares__htable_find(htable, idx, key);
- if (node == NULL)
- return 0;
+ if (node == NULL) {
+ return ARES_FALSE;
+ }
htable->num_keys--;
+
+ /* Reduce collisions */
+ if (ares__llist_len(ares__llist_node_parent(node)) > 1) {
+ htable->num_collisions--;
+ }
+
ares__llist_node_destroy(node);
- return 1;
+ return ARES_TRUE;
}
-size_t ares__htable_num_keys(ares__htable_t *htable)
+size_t ares__htable_num_keys(const ares__htable_t *htable)
{
- if (htable == NULL)
+ if (htable == NULL) {
return 0;
+ }
return htable->num_keys;
}
@@ -306,68 +416,30 @@ unsigned int ares__htable_hash_FNV1a(const unsigned char *key, size_t key_len,
unsigned int seed)
{
/* recommended seed is 2166136261U, but we don't want collisions */
- unsigned int hv = seed;
- size_t i;
+ unsigned int hv = seed;
+ size_t i;
for (i = 0; i < key_len; i++) {
hv ^= (unsigned int)key[i];
/* hv *= 0x01000193 */
- hv += (hv<<1) + (hv<<4) + (hv<<7) + (hv<<8) + (hv<<24);
+ hv += (hv << 1) + (hv << 4) + (hv << 7) + (hv << 8) + (hv << 24);
}
return hv;
}
-/* tolower() is locale-specific. Use a lookup table fast conversion that only
- * operates on ASCII */
-static const unsigned char ares__tolower_lookup[] = {
- 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
- 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,
- 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
- 0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,
- 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,
- 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,
- 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,
- 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,
- 0x40,0x61,0x62,0x63,0x64,0x65,0x66,0x67,
- 0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,
- 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,
- 0x78,0x79,0x7A,0x5B,0x5C,0x5D,0x5E,0x5F,
- 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,
- 0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,
- 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,
- 0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,
- 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,
- 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,
- 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,
- 0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,
- 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,
- 0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,
- 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,
- 0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF,
- 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,
- 0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,
- 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,
- 0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,
- 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,
- 0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,
- 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,
- 0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF
-};
-
-
/* Case insensitive version, meant for ASCII strings */
-unsigned int ares__htable_hash_FNV1a_casecmp(const unsigned char *key, size_t key_len,
- unsigned int seed)
+unsigned int ares__htable_hash_FNV1a_casecmp(const unsigned char *key,
+ size_t key_len, unsigned int seed)
{
/* recommended seed is 2166136261U, but we don't want collisions */
- unsigned int hv = seed;
- size_t i;
+ unsigned int hv = seed;
+ size_t i;
for (i = 0; i < key_len; i++) {
- hv ^= (unsigned int)ares__tolower_lookup[key[i]];
+ hv ^= (unsigned int)ares__tolower(key[i]);
/* hv *= 0x01000193 */
- hv += (hv<<1) + (hv<<4) + (hv<<7) + (hv<<8) + (hv<<24);
+ hv += (hv << 1) + (hv << 4) + (hv << 7) + (hv << 8) + (hv << 24);
}
return hv;
diff --git a/contrib/libs/c-ares/src/lib/ares__htable.h b/contrib/libs/c-ares/src/lib/ares__htable.h
index bbd36f779b..d09c865977 100644
--- a/contrib/libs/c-ares/src/lib/ares__htable.h
+++ b/contrib/libs/c-ares/src/lib/ares__htable.h
@@ -45,53 +45,53 @@
* @{
*/
-struct ares__htable_t;
+struct ares__htable;
/*! Opaque data type for generic hash table implementation */
typedef struct ares__htable ares__htable_t;
/*! Callback for generating a hash of the key.
- *
+ *
* \param[in] key pointer to key to be hashed
* \param[in] seed randomly generated seed used by hash function.
* value is specific to the hashtable instance
* but otherwise will not change between calls.
* \return hash
*/
-typedef unsigned int (*ares__htable_hashfunc_t)(const void *key,
+typedef unsigned int (*ares__htable_hashfunc_t)(const void *key,
unsigned int seed);
/*! Callback to free the bucket
- *
+ *
* \param[in] bucket user provided bucket
*/
typedef void (*ares__htable_bucket_free_t)(void *bucket);
/*! Callback to extract the key from the user-provided bucket
- *
+ *
* \param[in] bucket user provided bucket
* \return pointer to key held in bucket
*/
typedef const void *(*ares__htable_bucket_key_t)(const void *bucket);
/*! Callback to compare two keys for equality
- *
+ *
* \param[in] key1 first key
* \param[in] key2 second key
- * \return 1 if equal, 0 if not
+ * \return ARES_TRUE if equal, ARES_FALSE if not
*/
-typedef unsigned int (*ares__htable_key_eq_t)(const void *key1,
- const void *key2);
+typedef ares_bool_t (*ares__htable_key_eq_t)(const void *key1,
+ const void *key2);
-/*! Destroy the initialized hashtable
- *
- * \param[in] initialized hashtable
+/*! Destroy the initialized hashtable
+ *
+ * \param[in] htable initialized hashtable
*/
-void ares__htable_destroy(ares__htable_t *htable);
+void ares__htable_destroy(ares__htable_t *htable);
/*! Create a new hashtable
- *
+ *
* \param[in] hash_func Required. Callback for Hash function.
* \param[in] bucket_key Required. Callback to extract key from bucket.
* \param[in] bucket_free Required. Callback to free bucket.
@@ -104,40 +104,53 @@ ares__htable_t *ares__htable_create(ares__htable_hashfunc_t hash_func,
ares__htable_key_eq_t key_eq);
/*! Count of keys from initialized hashtable
- *
+ *
* \param[in] htable Initialized hashtable.
* \return count of keys
*/
-size_t ares__htable_num_keys(ares__htable_t *htable);
+size_t ares__htable_num_keys(const ares__htable_t *htable);
+
+/*! Retrieve an array of buckets from the hashtable. This is mainly used as
+ * a helper for retrieving an array of keys.
+ *
+ * \param[in] htable Initialized hashtable
+ * \param[out] num Count of returned buckets
+ * \return Array of pointers to the buckets. These are internal pointers
+ * to data within the hashtable, so if the key is removed, there
+ * will be a dangling pointer. It is expected wrappers will make
+ * such values safe by duplicating them.
+ */
+const void **ares__htable_all_buckets(const ares__htable_t *htable,
+ size_t *num);
/*! Insert bucket into hashtable
- *
+ *
* \param[in] htable Initialized hashtable.
* \param[in] bucket User-provided bucket to insert. Takes "ownership". Not
* allowed to be NULL.
- * \return 1 on success, 0 if out of memory
+ * \return ARES_TRUE on success, ARES_FALSE if out of memory
*/
-unsigned int ares__htable_insert(ares__htable_t *htable, void *bucket);
+ares_bool_t ares__htable_insert(ares__htable_t *htable, void *bucket);
/*! Retrieve bucket from hashtable based on key.
- *
+ *
* \param[in] htable Initialized hashtable
* \param[in] key Pointer to key to use for comparison.
* \return matching bucket, or NULL if not found.
*/
-void *ares__htable_get(ares__htable_t *htable, const void *key);
+void *ares__htable_get(const ares__htable_t *htable, const void *key);
-/*! Remove bucket from hashtable by key
- *
+/*! Remove bucket from hashtable by key
+ *
* \param[in] htable Initialized hashtable
* \param[in] key Pointer to key to use for comparison
- * \return 1 if found, 0 if not found
+ * \return ARES_TRUE if found, ARES_FALSE if not found
*/
-unsigned int ares__htable_remove(ares__htable_t *htable, const void *key);
+ares_bool_t ares__htable_remove(ares__htable_t *htable, const void *key);
/*! FNV1a hash algorithm. Can be used as underlying primitive for building
* a wrapper hashtable.
- *
+ *
* \param[in] key pointer to key
* \param[in] key_len Length of key
* \param[in] seed Seed for generating hash
@@ -146,18 +159,17 @@ unsigned int ares__htable_remove(ares__htable_t *htable, const void *key);
unsigned int ares__htable_hash_FNV1a(const unsigned char *key, size_t key_len,
unsigned int seed);
-/*! FNV1a hash algorithm, but converts all characters to lowercase before
+/*! FNV1a hash algorithm, but converts all characters to lowercase before
* hashing to make the hash case-insensitive. Can be used as underlying
* primitive for building a wrapper hashtable. Used on string-based keys.
- *
+ *
* \param[in] key pointer to key
* \param[in] key_len Length of key
* \param[in] seed Seed for generating hash
* \return hash value
*/
unsigned int ares__htable_hash_FNV1a_casecmp(const unsigned char *key,
- size_t key_len,
- unsigned int seed);
+ size_t key_len, unsigned int seed);
/*! @} */
diff --git a/contrib/libs/c-ares/src/lib/ares__htable_asvp.c b/contrib/libs/c-ares/src/lib/ares__htable_asvp.c
index 7026524159..3c1d2a336f 100644
--- a/contrib/libs/c-ares/src/lib/ares__htable_asvp.c
+++ b/contrib/libs/c-ares/src/lib/ares__htable_asvp.c
@@ -29,30 +29,27 @@
#include "ares__htable.h"
#include "ares__htable_asvp.h"
-
struct ares__htable_asvp {
ares__htable_asvp_val_free_t free_val;
ares__htable_t *hash;
};
-
typedef struct {
ares_socket_t key;
void *val;
ares__htable_asvp_t *parent;
} ares__htable_asvp_bucket_t;
-
void ares__htable_asvp_destroy(ares__htable_asvp_t *htable)
{
- if (htable == NULL)
+ if (htable == NULL) {
return;
+ }
ares__htable_destroy(htable->hash);
ares_free(htable);
}
-
static unsigned int hash_func(const void *key, unsigned int seed)
{
const ares_socket_t *arg = key;
@@ -60,50 +57,48 @@ static unsigned int hash_func(const void *key, unsigned int seed)
seed);
}
-
static const void *bucket_key(const void *bucket)
{
const ares__htable_asvp_bucket_t *arg = bucket;
return &arg->key;
}
-
static void bucket_free(void *bucket)
{
ares__htable_asvp_bucket_t *arg = bucket;
- if (arg->parent->free_val)
+ if (arg->parent->free_val) {
arg->parent->free_val(arg->val);
+ }
ares_free(arg);
}
-
-static unsigned int key_eq(const void *key1, const void *key2)
+static ares_bool_t key_eq(const void *key1, const void *key2)
{
const ares_socket_t *k1 = key1;
const ares_socket_t *k2 = key2;
- if (*k1 == *k2)
- return 1;
+ if (*k1 == *k2) {
+ return ARES_TRUE;
+ }
- return 0;
+ return ARES_FALSE;
}
-
-ares__htable_asvp_t *ares__htable_asvp_create(
- ares__htable_asvp_val_free_t val_free)
+ares__htable_asvp_t *
+ ares__htable_asvp_create(ares__htable_asvp_val_free_t val_free)
{
ares__htable_asvp_t *htable = ares_malloc(sizeof(*htable));
- if (htable == NULL)
+ if (htable == NULL) {
goto fail;
+ }
- htable->hash = ares__htable_create(hash_func,
- bucket_key,
- bucket_free,
- key_eq);
- if (htable->hash == NULL)
+ htable->hash =
+ ares__htable_create(hash_func, bucket_key, bucket_free, key_eq);
+ if (htable->hash == NULL) {
goto fail;
+ }
htable->free_val = val_free;
@@ -117,79 +112,117 @@ fail:
return NULL;
}
+ares_socket_t *ares__htable_asvp_keys(const ares__htable_asvp_t *htable,
+ size_t *num)
+{
+ const void **buckets = NULL;
+ size_t cnt = 0;
+ ares_socket_t *out = NULL;
+ size_t i;
+
+ if (htable == NULL || num == NULL) {
+ return NULL;
+ }
+
+ *num = 0;
+
+ buckets = ares__htable_all_buckets(htable->hash, &cnt);
+ if (buckets == NULL || cnt == 0) {
+ return NULL;
+ }
+
+ out = ares_malloc_zero(sizeof(*out) * cnt);
+ if (out == NULL) {
+ ares_free(buckets);
+ return NULL;
+ }
-unsigned int ares__htable_asvp_insert(ares__htable_asvp_t *htable,
- ares_socket_t key, void *val)
+ for (i = 0; i < cnt; i++) {
+ out[i] = ((const ares__htable_asvp_bucket_t *)buckets[i])->key;
+ }
+
+ ares_free(buckets);
+ *num = cnt;
+ return out;
+}
+
+ares_bool_t ares__htable_asvp_insert(ares__htable_asvp_t *htable,
+ ares_socket_t key, void *val)
{
ares__htable_asvp_bucket_t *bucket = NULL;
- if (htable == NULL)
+ if (htable == NULL) {
goto fail;
+ }
bucket = ares_malloc(sizeof(*bucket));
- if (bucket == NULL)
+ if (bucket == NULL) {
goto fail;
+ }
bucket->parent = htable;
bucket->key = key;
bucket->val = val;
- if (!ares__htable_insert(htable->hash, bucket))
+ if (!ares__htable_insert(htable->hash, bucket)) {
goto fail;
+ }
- return 1;
+ return ARES_TRUE;
fail:
if (bucket) {
ares_free(bucket);
}
- return 0;
+ return ARES_FALSE;
}
-
-unsigned int ares__htable_asvp_get(ares__htable_asvp_t *htable,
- ares_socket_t key, void **val)
+ares_bool_t ares__htable_asvp_get(const ares__htable_asvp_t *htable,
+ ares_socket_t key, void **val)
{
ares__htable_asvp_bucket_t *bucket = NULL;
- if (val)
+ if (val) {
*val = NULL;
+ }
- if (htable == NULL)
- return 0;
+ if (htable == NULL) {
+ return ARES_FALSE;
+ }
bucket = ares__htable_get(htable->hash, &key);
- if (bucket == NULL)
- return 0;
+ if (bucket == NULL) {
+ return ARES_FALSE;
+ }
- if (val)
+ if (val) {
*val = bucket->val;
- return 1;
+ }
+ return ARES_TRUE;
}
-
-void *ares__htable_asvp_get_direct(ares__htable_asvp_t *htable,
- ares_socket_t key)
+void *ares__htable_asvp_get_direct(const ares__htable_asvp_t *htable,
+ ares_socket_t key)
{
void *val = NULL;
ares__htable_asvp_get(htable, key, &val);
return val;
}
-
-unsigned int ares__htable_asvp_remove(ares__htable_asvp_t *htable,
- ares_socket_t key)
+ares_bool_t ares__htable_asvp_remove(ares__htable_asvp_t *htable,
+ ares_socket_t key)
{
- if (htable == NULL)
- return 0;
+ if (htable == NULL) {
+ return ARES_FALSE;
+ }
return ares__htable_remove(htable->hash, &key);
}
-
-size_t ares__htable_asvp_num_keys(ares__htable_asvp_t *htable)
+size_t ares__htable_asvp_num_keys(const ares__htable_asvp_t *htable)
{
- if (htable == NULL)
+ if (htable == NULL) {
return 0;
+ }
return ares__htable_num_keys(htable->hash);
}
diff --git a/contrib/libs/c-ares/src/lib/ares__htable_asvp.h b/contrib/libs/c-ares/src/lib/ares__htable_asvp.h
index f53b2775e0..49a766d023 100644
--- a/contrib/libs/c-ares/src/lib/ares__htable_asvp.h
+++ b/contrib/libs/c-ares/src/lib/ares__htable_asvp.h
@@ -48,72 +48,82 @@ struct ares__htable_asvp;
typedef struct ares__htable_asvp ares__htable_asvp_t;
/*! Callback to free value stored in hashtable
- *
+ *
* \param[in] val user-supplied value
*/
typedef void (*ares__htable_asvp_val_free_t)(void *val);
/*! Destroy hashtable
- *
+ *
* \param[in] htable Initialized hashtable
*/
void ares__htable_asvp_destroy(ares__htable_asvp_t *htable);
/*! Create size_t key, void pointer value hash table
- *
+ *
* \param[in] val_free Optional. Call back to free user-supplied value. If
* NULL it is expected the caller will clean up any user
* supplied values.
*/
-ares__htable_asvp_t *ares__htable_asvp_create(
- ares__htable_asvp_val_free_t val_free);
+ares__htable_asvp_t *
+ ares__htable_asvp_create(ares__htable_asvp_val_free_t val_free);
+
+/*! Retrieve an array of keys from the hashtable.
+ *
+ * \param[in] htable Initialized hashtable
+ * \param[out] num Count of returned keys
+ * \return Array of keys in the hashtable. Must be free'd with ares_free().
+ */
+ares_socket_t *ares__htable_asvp_keys(const ares__htable_asvp_t *htable,
+ size_t *num);
+
/*! Insert key/value into hash table
- *
+ *
* \param[in] htable Initialized hash table
* \param[in] key key to associate with value
* \param[in] val value to store (takes ownership). May be NULL.
- * \return 1 on success, 0 on out of memory or misuse
+ * \return ARES_TRUE on success, ARES_FALSE on out of memory or misuse
*/
-unsigned int ares__htable_asvp_insert(ares__htable_asvp_t *htable,
- ares_socket_t key, void *val);
+ares_bool_t ares__htable_asvp_insert(ares__htable_asvp_t *htable,
+ ares_socket_t key, void *val);
/*! Retrieve value from hashtable based on key
- *
+ *
* \param[in] htable Initialized hash table
* \param[in] key key to use to search
* \param[out] val Optional. Pointer to store value.
- * \return 1 on success, 0 on failure
+ * \return ARES_TRUE on success, ARES_FALSE on failure
*/
-unsigned int ares__htable_asvp_get(ares__htable_asvp_t *htable,
- ares_socket_t key, void **val);
+ares_bool_t ares__htable_asvp_get(const ares__htable_asvp_t *htable,
+ ares_socket_t key, void **val);
/*! Retrieve value from hashtable directly as return value. Caveat to this
* function over ares__htable_asvp_get() is that if a NULL value is stored
* you cannot determine if the key is not found or the value is NULL.
- *
+ *
* \param[in] htable Initialized hash table
* \param[in] key key to use to search
* \return value associated with key in hashtable or NULL
*/
-void *ares__htable_asvp_get_direct(ares__htable_asvp_t *htable,
- ares_socket_t key);
+void *ares__htable_asvp_get_direct(const ares__htable_asvp_t *htable,
+ ares_socket_t key);
/*! Remove a value from the hashtable by key
- *
+ *
* \param[in] htable Initialized hash table
* \param[in] key key to use to search
- * \return 1 if found, 0 if not
+ * \return ARES_TRUE if found, ARES_FALSE if not found
*/
-unsigned int ares__htable_asvp_remove(ares__htable_asvp_t *htable,
- ares_socket_t key);
+ares_bool_t ares__htable_asvp_remove(ares__htable_asvp_t *htable,
+ ares_socket_t key);
/*! Retrieve the number of keys stored in the hash table
- *
+ *
* \param[in] htable Initialized hash table
* \return count
*/
-size_t ares__htable_asvp_num_keys(ares__htable_asvp_t *htable);
+size_t ares__htable_asvp_num_keys(const ares__htable_asvp_t *htable);
/*! @} */
diff --git a/contrib/libs/c-ares/src/lib/ares__htable_strvp.c b/contrib/libs/c-ares/src/lib/ares__htable_strvp.c
new file mode 100644
index 0000000000..bfae4c3622
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares__htable_strvp.c
@@ -0,0 +1,198 @@
+/* MIT License
+ *
+ * Copyright (c) 2023 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#include "ares_setup.h"
+#include "ares.h"
+#include "ares_private.h"
+#include "ares__htable.h"
+#include "ares__htable_strvp.h"
+
+struct ares__htable_strvp {
+ ares__htable_strvp_val_free_t free_val;
+ ares__htable_t *hash;
+};
+
+typedef struct {
+ char *key;
+ void *val;
+ ares__htable_strvp_t *parent;
+} ares__htable_strvp_bucket_t;
+
+void ares__htable_strvp_destroy(ares__htable_strvp_t *htable)
+{
+ if (htable == NULL) {
+ return;
+ }
+
+ ares__htable_destroy(htable->hash);
+ ares_free(htable);
+}
+
+static unsigned int hash_func(const void *key, unsigned int seed)
+{
+ const char *arg = key;
+ return ares__htable_hash_FNV1a_casecmp((const unsigned char *)arg,
+ ares_strlen(arg), seed);
+}
+
+static const void *bucket_key(const void *bucket)
+{
+ const ares__htable_strvp_bucket_t *arg = bucket;
+ return arg->key;
+}
+
+static void bucket_free(void *bucket)
+{
+ ares__htable_strvp_bucket_t *arg = bucket;
+
+ if (arg->parent->free_val) {
+ arg->parent->free_val(arg->val);
+ }
+ ares_free(arg->key);
+ ares_free(arg);
+}
+
+static ares_bool_t key_eq(const void *key1, const void *key2)
+{
+ const char *k1 = key1;
+ const char *k2 = key2;
+
+ if (strcasecmp(k1, k2) == 0) {
+ return ARES_TRUE;
+ }
+
+ return ARES_FALSE;
+}
+
+ares__htable_strvp_t *
+ ares__htable_strvp_create(ares__htable_strvp_val_free_t val_free)
+{
+ ares__htable_strvp_t *htable = ares_malloc(sizeof(*htable));
+ if (htable == NULL) {
+ goto fail;
+ }
+
+ htable->hash =
+ ares__htable_create(hash_func, bucket_key, bucket_free, key_eq);
+ if (htable->hash == NULL) {
+ goto fail;
+ }
+
+ htable->free_val = val_free;
+
+ return htable;
+
+fail:
+ if (htable) {
+ ares__htable_destroy(htable->hash);
+ ares_free(htable);
+ }
+ return NULL;
+}
+
+ares_bool_t ares__htable_strvp_insert(ares__htable_strvp_t *htable,
+ const char *key, void *val)
+{
+ ares__htable_strvp_bucket_t *bucket = NULL;
+
+ if (htable == NULL || key == NULL) {
+ goto fail;
+ }
+
+ bucket = ares_malloc(sizeof(*bucket));
+ if (bucket == NULL) {
+ goto fail;
+ }
+
+ bucket->parent = htable;
+ bucket->key = ares_strdup(key);
+ if (bucket->key == NULL) {
+ goto fail;
+ }
+ bucket->val = val;
+
+ if (!ares__htable_insert(htable->hash, bucket)) {
+ goto fail;
+ }
+
+ return ARES_TRUE;
+
+fail:
+ if (bucket) {
+ ares_free(bucket->key);
+ ares_free(bucket);
+ }
+ return ARES_FALSE;
+}
+
+ares_bool_t ares__htable_strvp_get(const ares__htable_strvp_t *htable,
+ const char *key, void **val)
+{
+ ares__htable_strvp_bucket_t *bucket = NULL;
+
+ if (val) {
+ *val = NULL;
+ }
+
+ if (htable == NULL || key == NULL) {
+ return ARES_FALSE;
+ }
+
+ bucket = ares__htable_get(htable->hash, key);
+ if (bucket == NULL) {
+ return ARES_FALSE;
+ }
+
+ if (val) {
+ *val = bucket->val;
+ }
+ return ARES_TRUE;
+}
+
+void *ares__htable_strvp_get_direct(const ares__htable_strvp_t *htable,
+ const char *key)
+{
+ void *val = NULL;
+ ares__htable_strvp_get(htable, key, &val);
+ return val;
+}
+
+ares_bool_t ares__htable_strvp_remove(ares__htable_strvp_t *htable,
+ const char *key)
+{
+ if (htable == NULL) {
+ return ARES_FALSE;
+ }
+
+ return ares__htable_remove(htable->hash, key);
+}
+
+size_t ares__htable_strvp_num_keys(const ares__htable_strvp_t *htable)
+{
+ if (htable == NULL) {
+ return 0;
+ }
+ return ares__htable_num_keys(htable->hash);
+}
diff --git a/contrib/libs/c-ares/src/lib/ares__htable_strvp.h b/contrib/libs/c-ares/src/lib/ares__htable_strvp.h
new file mode 100644
index 0000000000..25dd2b9077
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares__htable_strvp.h
@@ -0,0 +1,118 @@
+/* MIT License
+ *
+ * Copyright (c) 2023 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#ifndef __ARES__HTABLE_STRVP_H
+#define __ARES__HTABLE_STRVP_H
+
+/*! \addtogroup ares__htable_strvp HashTable with string Key and void pointer
+ * Value
+ *
+ * This data structure wraps the base ares__htable data structure in order to
+ * split the key and value data types as string and void pointer, respectively.
+ *
+ * Average time complexity:
+ * - Insert: O(1)
+ * - Search: O(1)
+ * - Delete: O(1)
+ *
+ * @{
+ */
+
+struct ares__htable_strvp;
+
+/*! Opaque data type for size_t key, void pointer hash table implementation */
+typedef struct ares__htable_strvp ares__htable_strvp_t;
+
+/*! Callback to free value stored in hashtable
+ *
+ * \param[in] val user-supplied value
+ */
+typedef void (*ares__htable_strvp_val_free_t)(void *val);
+
+/*! Destroy hashtable
+ *
+ * \param[in] htable Initialized hashtable
+ */
+void ares__htable_strvp_destroy(ares__htable_strvp_t *htable);
+
+/*! Create string, void pointer value hash table
+ *
+ * \param[in] val_free Optional. Call back to free user-supplied value. If
+ * NULL it is expected the caller will clean up any user
+ * supplied values.
+ */
+ares__htable_strvp_t *
+ ares__htable_strvp_create(ares__htable_strvp_val_free_t val_free);
+
+/*! Insert key/value into hash table
+ *
+ * \param[in] htable Initialized hash table
+ * \param[in] key key to associate with value
+ * \param[in] val value to store (takes ownership). May be NULL.
+ * \return ARES_TRUE on success, ARES_FALSE on failure or out of memory
+ */
+ares_bool_t ares__htable_strvp_insert(ares__htable_strvp_t *htable,
+ const char *key, void *val);
+
+/*! Retrieve value from hashtable based on key
+ *
+ * \param[in] htable Initialized hash table
+ * \param[in] key key to use to search
+ * \param[out] val Optional. Pointer to store value.
+ * \return ARES_TRUE on success, ARES_FALSE on failure
+ */
+ares_bool_t ares__htable_strvp_get(const ares__htable_strvp_t *htable,
+ const char *key, void **val);
+
+/*! Retrieve value from hashtable directly as return value. Caveat to this
+ * function over ares__htable_strvp_get() is that if a NULL value is stored
+ * you cannot determine if the key is not found or the value is NULL.
+ *
+ * \param[in] htable Initialized hash table
+ * \param[in] key key to use to search
+ * \return value associated with key in hashtable or NULL
+ */
+void *ares__htable_strvp_get_direct(const ares__htable_strvp_t *htable,
+ const char *key);
+
+/*! Remove a value from the hashtable by key
+ *
+ * \param[in] htable Initialized hash table
+ * \param[in] key key to use to search
+ * \return ARES_TRUE if found, ARES_FALSE if not
+ */
+ares_bool_t ares__htable_strvp_remove(ares__htable_strvp_t *htable,
+ const char *key);
+
+/*! Retrieve the number of keys stored in the hash table
+ *
+ * \param[in] htable Initialized hash table
+ * \return count
+ */
+size_t ares__htable_strvp_num_keys(const ares__htable_strvp_t *htable);
+
+/*! @} */
+
+#endif /* __ARES__HTABLE_STVP_H */
diff --git a/contrib/libs/c-ares/src/lib/ares__htable_stvp.c b/contrib/libs/c-ares/src/lib/ares__htable_szvp.c
index 7a4cd40a76..2ff64784bc 100644
--- a/contrib/libs/c-ares/src/lib/ares__htable_stvp.c
+++ b/contrib/libs/c-ares/src/lib/ares__htable_szvp.c
@@ -27,32 +27,29 @@
#include "ares.h"
#include "ares_private.h"
#include "ares__htable.h"
-#include "ares__htable_stvp.h"
+#include "ares__htable_szvp.h"
-
-struct ares__htable_stvp {
- ares__htable_stvp_val_free_t free_val;
+struct ares__htable_szvp {
+ ares__htable_szvp_val_free_t free_val;
ares__htable_t *hash;
};
-
typedef struct {
size_t key;
void *val;
- ares__htable_stvp_t *parent;
-} ares__htable_stvp_bucket_t;
+ ares__htable_szvp_t *parent;
+} ares__htable_szvp_bucket_t;
-
-void ares__htable_stvp_destroy(ares__htable_stvp_t *htable)
+void ares__htable_szvp_destroy(ares__htable_szvp_t *htable)
{
- if (htable == NULL)
+ if (htable == NULL) {
return;
+ }
ares__htable_destroy(htable->hash);
ares_free(htable);
}
-
static unsigned int hash_func(const void *key, unsigned int seed)
{
const size_t *arg = key;
@@ -60,50 +57,48 @@ static unsigned int hash_func(const void *key, unsigned int seed)
seed);
}
-
static const void *bucket_key(const void *bucket)
{
- const ares__htable_stvp_bucket_t *arg = bucket;
+ const ares__htable_szvp_bucket_t *arg = bucket;
return &arg->key;
}
-
static void bucket_free(void *bucket)
{
- ares__htable_stvp_bucket_t *arg = bucket;
+ ares__htable_szvp_bucket_t *arg = bucket;
- if (arg->parent->free_val)
+ if (arg->parent->free_val) {
arg->parent->free_val(arg->val);
+ }
ares_free(arg);
}
-
-static unsigned int key_eq(const void *key1, const void *key2)
+static ares_bool_t key_eq(const void *key1, const void *key2)
{
const size_t *k1 = key1;
const size_t *k2 = key2;
- if (*k1 == *k2)
- return 1;
+ if (*k1 == *k2) {
+ return ARES_TRUE;
+ }
- return 0;
+ return ARES_FALSE;
}
-
-ares__htable_stvp_t *ares__htable_stvp_create(
- ares__htable_stvp_val_free_t val_free)
+ares__htable_szvp_t *
+ ares__htable_szvp_create(ares__htable_szvp_val_free_t val_free)
{
- ares__htable_stvp_t *htable = ares_malloc(sizeof(*htable));
- if (htable == NULL)
+ ares__htable_szvp_t *htable = ares_malloc(sizeof(*htable));
+ if (htable == NULL) {
goto fail;
+ }
- htable->hash = ares__htable_create(hash_func,
- bucket_key,
- bucket_free,
- key_eq);
- if (htable->hash == NULL)
+ htable->hash =
+ ares__htable_create(hash_func, bucket_key, bucket_free, key_eq);
+ if (htable->hash == NULL) {
goto fail;
+ }
htable->free_val = val_free;
@@ -117,77 +112,82 @@ fail:
return NULL;
}
-
-unsigned int ares__htable_stvp_insert(ares__htable_stvp_t *htable, size_t key,
- void *val)
+ares_bool_t ares__htable_szvp_insert(ares__htable_szvp_t *htable, size_t key,
+ void *val)
{
- ares__htable_stvp_bucket_t *bucket = NULL;
+ ares__htable_szvp_bucket_t *bucket = NULL;
- if (htable == NULL)
+ if (htable == NULL) {
goto fail;
+ }
bucket = ares_malloc(sizeof(*bucket));
- if (bucket == NULL)
+ if (bucket == NULL) {
goto fail;
+ }
bucket->parent = htable;
bucket->key = key;
bucket->val = val;
- if (!ares__htable_insert(htable->hash, bucket))
+ if (!ares__htable_insert(htable->hash, bucket)) {
goto fail;
+ }
- return 1;
+ return ARES_TRUE;
fail:
if (bucket) {
ares_free(bucket);
}
- return 0;
+ return ARES_FALSE;
}
-
-unsigned int ares__htable_stvp_get(ares__htable_stvp_t *htable, size_t key,
- void **val)
+ares_bool_t ares__htable_szvp_get(const ares__htable_szvp_t *htable, size_t key,
+ void **val)
{
- ares__htable_stvp_bucket_t *bucket = NULL;
+ ares__htable_szvp_bucket_t *bucket = NULL;
- if (val)
+ if (val) {
*val = NULL;
+ }
- if (htable == NULL)
- return 0;
+ if (htable == NULL) {
+ return ARES_FALSE;
+ }
bucket = ares__htable_get(htable->hash, &key);
- if (bucket == NULL)
- return 0;
+ if (bucket == NULL) {
+ return ARES_FALSE;
+ }
- if (val)
+ if (val) {
*val = bucket->val;
- return 1;
+ }
+ return ARES_TRUE;
}
-
-void *ares__htable_stvp_get_direct(ares__htable_stvp_t *htable, size_t key)
+void *ares__htable_szvp_get_direct(const ares__htable_szvp_t *htable,
+ size_t key)
{
void *val = NULL;
- ares__htable_stvp_get(htable, key, &val);
+ ares__htable_szvp_get(htable, key, &val);
return val;
}
-
-unsigned int ares__htable_stvp_remove(ares__htable_stvp_t *htable, size_t key)
+ares_bool_t ares__htable_szvp_remove(ares__htable_szvp_t *htable, size_t key)
{
- if (htable == NULL)
- return 0;
+ if (htable == NULL) {
+ return ARES_FALSE;
+ }
return ares__htable_remove(htable->hash, &key);
}
-
-size_t ares__htable_stvp_num_keys(ares__htable_stvp_t *htable)
+size_t ares__htable_szvp_num_keys(const ares__htable_szvp_t *htable)
{
- if (htable == NULL)
+ if (htable == NULL) {
return 0;
+ }
return ares__htable_num_keys(htable->hash);
}
diff --git a/contrib/libs/c-ares/src/lib/ares__htable_stvp.h b/contrib/libs/c-ares/src/lib/ares__htable_szvp.h
index 11d9d5ed4c..62b1776be9 100644
--- a/contrib/libs/c-ares/src/lib/ares__htable_stvp.h
+++ b/contrib/libs/c-ares/src/lib/ares__htable_szvp.h
@@ -26,7 +26,8 @@
#ifndef __ARES__HTABLE_STVP_H
#define __ARES__HTABLE_STVP_H
-/*! \addtogroup ares__htable_stvp HashTable with size_t Key and void pointer Value
+/*! \addtogroup ares__htable_szvp HashTable with size_t Key and void pointer
+ * Value
*
* This data structure wraps the base ares__htable data structure in order to
* split the key and value data types as size_t and void pointer, respectively.
@@ -39,76 +40,77 @@
* @{
*/
-struct ares__htable_stvp;
+struct ares__htable_szvp;
/*! Opaque data type for size_t key, void pointer hash table implementation */
-typedef struct ares__htable_stvp ares__htable_stvp_t;
+typedef struct ares__htable_szvp ares__htable_szvp_t;
/*! Callback to free value stored in hashtable
- *
+ *
* \param[in] val user-supplied value
*/
-typedef void (*ares__htable_stvp_val_free_t)(void *val);
+typedef void (*ares__htable_szvp_val_free_t)(void *val);
/*! Destroy hashtable
- *
+ *
* \param[in] htable Initialized hashtable
*/
-void ares__htable_stvp_destroy(ares__htable_stvp_t *htable);
+void ares__htable_szvp_destroy(ares__htable_szvp_t *htable);
/*! Create size_t key, void pointer value hash table
- *
+ *
* \param[in] val_free Optional. Call back to free user-supplied value. If
* NULL it is expected the caller will clean up any user
* supplied values.
*/
-ares__htable_stvp_t *ares__htable_stvp_create(
- ares__htable_stvp_val_free_t val_free);
+ares__htable_szvp_t *
+ ares__htable_szvp_create(ares__htable_szvp_val_free_t val_free);
/*! Insert key/value into hash table
- *
+ *
* \param[in] htable Initialized hash table
* \param[in] key key to associate with value
* \param[in] val value to store (takes ownership). May be NULL.
- * \return 1 on success, 0 on out of memory or misuse
+ * \return ARES_TRUE on success, ARES_FALSE on failure or out of memory
*/
-unsigned int ares__htable_stvp_insert(ares__htable_stvp_t *htable, size_t key,
- void *val);
+ares_bool_t ares__htable_szvp_insert(ares__htable_szvp_t *htable, size_t key,
+ void *val);
/*! Retrieve value from hashtable based on key
- *
+ *
* \param[in] htable Initialized hash table
* \param[in] key key to use to search
* \param[out] val Optional. Pointer to store value.
- * \return 1 on success, 0 on failure
+ * \return ARES_TRUE on success, ARES_FALSE on failure
*/
-unsigned int ares__htable_stvp_get(ares__htable_stvp_t *htable, size_t key,
- void **val);
+ares_bool_t ares__htable_szvp_get(const ares__htable_szvp_t *htable, size_t key,
+ void **val);
/*! Retrieve value from hashtable directly as return value. Caveat to this
- * function over ares__htable_stvp_get() is that if a NULL value is stored
+ * function over ares__htable_szvp_get() is that if a NULL value is stored
* you cannot determine if the key is not found or the value is NULL.
- *
+ *
* \param[in] htable Initialized hash table
* \param[in] key key to use to search
* \return value associated with key in hashtable or NULL
*/
-void *ares__htable_stvp_get_direct(ares__htable_stvp_t *htable, size_t key);
+void *ares__htable_szvp_get_direct(const ares__htable_szvp_t *htable,
+ size_t key);
/*! Remove a value from the hashtable by key
- *
+ *
* \param[in] htable Initialized hash table
* \param[in] key key to use to search
- * \return 1 if found, 0 if not
+ * \return ARES_TRUE if found, ARES_FALSE if not
*/
-unsigned int ares__htable_stvp_remove(ares__htable_stvp_t *htable, size_t key);
+ares_bool_t ares__htable_szvp_remove(ares__htable_szvp_t *htable, size_t key);
/*! Retrieve the number of keys stored in the hash table
- *
+ *
* \param[in] htable Initialized hash table
* \return count
*/
-size_t ares__htable_stvp_num_keys(ares__htable_stvp_t *htable);
+size_t ares__htable_szvp_num_keys(const ares__htable_szvp_t *htable);
/*! @} */
diff --git a/contrib/libs/c-ares/src/lib/ares__iface_ips.c b/contrib/libs/c-ares/src/lib/ares__iface_ips.c
new file mode 100644
index 0000000000..b252a7ab49
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares__iface_ips.c
@@ -0,0 +1,592 @@
+/* MIT License
+ *
+ * Copyright (c) 2023 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#include "ares_setup.h"
+
+
+#ifdef USE_WINSOCK
+# include <winsock2.h>
+# include <ws2tcpip.h>
+# if defined(HAVE_IPHLPAPI_H)
+# include <iphlpapi.h>
+# endif
+# if defined(HAVE_NETIOAPI_H)
+# include <netioapi.h>
+# endif
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_SOCKET_H
+# include <sys/socket.h>
+#endif
+#ifdef HAVE_NET_IF_H
+# include <net/if.h>
+#endif
+#ifdef HAVE_IFADDRS_H
+# include <ifaddrs.h>
+#endif
+#ifdef HAVE_SYS_IOCTL_H
+# include <sys/ioctl.h>
+#endif
+#ifdef HAVE_NETINET_IN_H
+# include <netinet/in.h>
+#endif
+
+#include "ares.h"
+#include "ares_private.h"
+
+static ares_status_t ares__iface_ips_enumerate(ares__iface_ips_t *ips,
+ const char *name);
+
+typedef struct {
+ char *name;
+ struct ares_addr addr;
+ unsigned char netmask;
+ unsigned int ll_scope;
+ ares__iface_ip_flags_t flags;
+} ares__iface_ip_t;
+
+struct ares__iface_ips {
+ ares__iface_ip_t *ips;
+ size_t cnt;
+ size_t alloc_size;
+ ares__iface_ip_flags_t enum_flags;
+};
+
+static ares__iface_ips_t *ares__iface_ips_alloc(ares__iface_ip_flags_t flags)
+{
+ ares__iface_ips_t *ips = ares_malloc_zero(sizeof(*ips));
+ if (ips == NULL) {
+ return NULL;
+ }
+
+ /* Prealloc 4 entries */
+ ips->alloc_size = 4;
+ ips->ips = ares_malloc_zero(ips->alloc_size * sizeof(*ips->ips));
+ if (ips->ips == NULL) {
+ ares_free(ips);
+ return NULL;
+ }
+ ips->enum_flags = flags;
+ return ips;
+}
+
+static void ares__iface_ip_destroy(ares__iface_ip_t *ip)
+{
+ if (ip == NULL) {
+ return;
+ }
+ ares_free(ip->name);
+ memset(ip, 0, sizeof(*ip));
+}
+
+void ares__iface_ips_destroy(ares__iface_ips_t *ips)
+{
+ size_t i;
+
+ if (ips == NULL) {
+ return;
+ }
+
+ for (i = 0; i < ips->cnt; i++) {
+ ares__iface_ip_destroy(&ips->ips[i]);
+ }
+ ares_free(ips->ips);
+ ares_free(ips);
+}
+
+ares_status_t ares__iface_ips(ares__iface_ips_t **ips,
+ ares__iface_ip_flags_t flags, const char *name)
+{
+ ares_status_t status;
+
+ if (ips == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ *ips = ares__iface_ips_alloc(flags);
+ if (*ips == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ status = ares__iface_ips_enumerate(*ips, name);
+ if (status != ARES_SUCCESS) {
+ ares__iface_ips_destroy(*ips);
+ *ips = NULL;
+ return status;
+ }
+
+ return ARES_SUCCESS;
+}
+
+static ares_status_t
+ ares__iface_ips_add(ares__iface_ips_t *ips, ares__iface_ip_flags_t flags,
+ const char *name, const struct ares_addr *addr,
+ unsigned char netmask, unsigned int ll_scope)
+{
+ size_t idx;
+
+ if (ips == NULL || name == NULL || addr == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ /* Don't want loopback */
+ if (flags & ARES_IFACE_IP_LOOPBACK &&
+ !(ips->enum_flags & ARES_IFACE_IP_LOOPBACK)) {
+ return ARES_SUCCESS;
+ }
+
+ /* Don't want offline */
+ if (flags & ARES_IFACE_IP_OFFLINE &&
+ !(ips->enum_flags & ARES_IFACE_IP_OFFLINE)) {
+ return ARES_SUCCESS;
+ }
+
+ /* Check for link-local */
+ if (ares__addr_is_linklocal(addr)) {
+ flags |= ARES_IFACE_IP_LINKLOCAL;
+ }
+ if (flags & ARES_IFACE_IP_LINKLOCAL &&
+ !(ips->enum_flags & ARES_IFACE_IP_LINKLOCAL)) {
+ return ARES_SUCCESS;
+ }
+
+ /* Set address flag based on address provided */
+ if (addr->family == AF_INET) {
+ flags |= ARES_IFACE_IP_V4;
+ }
+
+ if (addr->family == AF_INET6) {
+ flags |= ARES_IFACE_IP_V6;
+ }
+
+ /* If they specified either v4 or v6 validate flags otherwise assume they
+ * want to enumerate both */
+ if (ips->enum_flags & (ARES_IFACE_IP_V4 | ARES_IFACE_IP_V6)) {
+ if (flags & ARES_IFACE_IP_V4 && !(ips->enum_flags & ARES_IFACE_IP_V4)) {
+ return ARES_SUCCESS;
+ }
+ if (flags & ARES_IFACE_IP_V6 && !(ips->enum_flags & ARES_IFACE_IP_V6)) {
+ return ARES_SUCCESS;
+ }
+ }
+
+ /* Allocate more ips */
+ if (ips->cnt + 1 > ips->alloc_size) {
+ void *temp;
+ size_t alloc_size;
+
+ alloc_size = ares__round_up_pow2(ips->alloc_size + 1);
+ temp = ares_realloc_zero(ips->ips, ips->alloc_size * sizeof(*ips->ips),
+ alloc_size * sizeof(*ips->ips));
+ if (temp == NULL) {
+ return ARES_ENOMEM;
+ }
+ ips->ips = temp;
+ ips->alloc_size = alloc_size;
+ }
+
+ /* Add */
+ idx = ips->cnt++;
+
+ ips->ips[idx].flags = flags;
+ ips->ips[idx].netmask = netmask;
+ ips->ips[idx].ll_scope = ll_scope;
+ memcpy(&ips->ips[idx].addr, addr, sizeof(*addr));
+ ips->ips[idx].name = ares_strdup(name);
+ if (ips->ips[idx].name == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ return ARES_SUCCESS;
+}
+
+size_t ares__iface_ips_cnt(const ares__iface_ips_t *ips)
+{
+ if (ips == NULL) {
+ return 0;
+ }
+ return ips->cnt;
+}
+
+const char *ares__iface_ips_get_name(const ares__iface_ips_t *ips, size_t idx)
+{
+ if (ips == NULL || idx >= ips->cnt) {
+ return NULL;
+ }
+ return ips->ips[idx].name;
+}
+
+const struct ares_addr *ares__iface_ips_get_addr(const ares__iface_ips_t *ips,
+ size_t idx)
+{
+ if (ips == NULL || idx >= ips->cnt) {
+ return NULL;
+ }
+ return &ips->ips[idx].addr;
+}
+
+ares__iface_ip_flags_t ares__iface_ips_get_flags(const ares__iface_ips_t *ips,
+ size_t idx)
+{
+ if (ips == NULL || idx >= ips->cnt) {
+ return 0;
+ }
+ return ips->ips[idx].flags;
+}
+
+unsigned char ares__iface_ips_get_netmask(const ares__iface_ips_t *ips,
+ size_t idx)
+{
+ if (ips == NULL || idx >= ips->cnt) {
+ return 0;
+ }
+ return ips->ips[idx].netmask;
+}
+
+unsigned int ares__iface_ips_get_ll_scope(const ares__iface_ips_t *ips,
+ size_t idx)
+{
+ if (ips == NULL || idx >= ips->cnt) {
+ return 0;
+ }
+ return ips->ips[idx].ll_scope;
+}
+
+
+#ifdef USE_WINSOCK
+
+# if 0
+static char *wcharp_to_charp(const wchar_t *in)
+{
+ char *out;
+ int len;
+
+ len = WideCharToMultiByte(CP_UTF8, 0, in, -1, NULL, 0, NULL, NULL);
+ if (len == -1) {
+ return NULL;
+ }
+
+ out = ares_malloc_zero((size_t)len + 1);
+
+ if (WideCharToMultiByte(CP_UTF8, 0, in, -1, out, len, NULL, NULL) == -1) {
+ ares_free(out);
+ return NULL;
+ }
+
+ return out;
+}
+# endif
+
+static ares_bool_t name_match(const char *name, const char *adapter_name,
+ unsigned int ll_scope)
+{
+ if (name == NULL || *name == 0) {
+ return ARES_TRUE;
+ }
+
+ if (strcasecmp(name, adapter_name) == 0) {
+ return ARES_TRUE;
+ }
+
+ if (ares_str_isnum(name) && (unsigned int)atoi(name) == ll_scope) {
+ return ARES_TRUE;
+ }
+
+ return ARES_FALSE;
+}
+
+static ares_status_t ares__iface_ips_enumerate(ares__iface_ips_t *ips,
+ const char *name)
+{
+ ULONG myflags = GAA_FLAG_INCLUDE_PREFIX /*|GAA_FLAG_INCLUDE_ALL_INTERFACES */;
+ ULONG outBufLen = 0;
+ DWORD retval;
+ IP_ADAPTER_ADDRESSES *addresses = NULL;
+ IP_ADAPTER_ADDRESSES *address = NULL;
+ ares_status_t status = ARES_SUCCESS;
+
+ /* Get necessary buffer size */
+ GetAdaptersAddresses(AF_UNSPEC, myflags, NULL, NULL, &outBufLen);
+ if (outBufLen == 0) {
+ status = ARES_EFILE;
+ goto done;
+ }
+
+ addresses = ares_malloc_zero(outBufLen);
+ if (addresses == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ retval =
+ GetAdaptersAddresses(AF_UNSPEC, myflags, NULL, addresses, &outBufLen);
+ if (retval != ERROR_SUCCESS) {
+ status = ARES_EFILE;
+ goto done;
+ }
+
+ for (address = addresses; address != NULL; address = address->Next) {
+ IP_ADAPTER_UNICAST_ADDRESS *ipaddr = NULL;
+ ares__iface_ip_flags_t addrflag = 0;
+ char ifname[64] = "";
+
+# if defined(HAVE_CONVERTINTERFACEINDEXTOLUID) && \
+ defined(HAVE_CONVERTINTERFACELUIDTONAMEA)
+ /* Retrieve name from interface index.
+ * address->AdapterName appears to be a GUID/UUID of some sort, not a name.
+ * address->FriendlyName is user-changeable.
+ * That said, this doesn't appear to help us out on systems that don't
+ * have if_nametoindex() or if_indextoname() as they don't have these
+ * functions either! */
+ NET_LUID luid;
+ ConvertInterfaceIndexToLuid(address->IfIndex, &luid);
+ ConvertInterfaceLuidToNameA(&luid, ifname, sizeof(ifname));
+# else
+ ares_strcpy(ifname, address->AdapterName, sizeof(ifname));
+# endif
+
+ if (address->OperStatus != IfOperStatusUp) {
+ addrflag |= ARES_IFACE_IP_OFFLINE;
+ }
+
+ if (address->IfType == IF_TYPE_SOFTWARE_LOOPBACK) {
+ addrflag |= ARES_IFACE_IP_LOOPBACK;
+ }
+
+ for (ipaddr = address->FirstUnicastAddress; ipaddr != NULL;
+ ipaddr = ipaddr->Next) {
+ struct ares_addr addr;
+
+ if (ipaddr->Address.lpSockaddr->sa_family == AF_INET) {
+ const struct sockaddr_in *sockaddr_in =
+ (const struct sockaddr_in *)((void *)ipaddr->Address.lpSockaddr);
+ addr.family = AF_INET;
+ memcpy(&addr.addr.addr4, &sockaddr_in->sin_addr,
+ sizeof(addr.addr.addr4));
+ } else if (ipaddr->Address.lpSockaddr->sa_family == AF_INET6) {
+ const struct sockaddr_in6 *sockaddr_in6 =
+ (const struct sockaddr_in6 *)((void *)ipaddr->Address.lpSockaddr);
+ addr.family = AF_INET6;
+ memcpy(&addr.addr.addr6, &sockaddr_in6->sin6_addr,
+ sizeof(addr.addr.addr6));
+ } else {
+ /* Unknown */
+ continue;
+ }
+
+ /* Sometimes windows may use numerics to indicate a DNS server's adapter,
+ * which corresponds to the index rather than the name. Check and
+ * validate both. */
+ if (!name_match(name, ifname, address->Ipv6IfIndex)) {
+ continue;
+ }
+
+ status = ares__iface_ips_add(ips, addrflag, ifname, &addr,
+ ipaddr->OnLinkPrefixLength /* netmask */,
+ address->Ipv6IfIndex /* ll_scope */);
+
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+ }
+
+done:
+ ares_free(addresses);
+ return status;
+}
+
+#elif defined(HAVE_GETIFADDRS)
+
+static unsigned char count_addr_bits(const unsigned char *addr, size_t addr_len)
+{
+ size_t i;
+ unsigned char count = 0;
+
+ for (i = 0; i < addr_len; i++) {
+ count += ares__count_bits_u8(addr[i]);
+ }
+ return count;
+}
+
+static ares_status_t ares__iface_ips_enumerate(ares__iface_ips_t *ips,
+ const char *name)
+{
+ struct ifaddrs *ifap = NULL;
+ struct ifaddrs *ifa = NULL;
+ ares_status_t status = ARES_SUCCESS;
+
+ if (getifaddrs(&ifap) != 0) {
+ status = ARES_EFILE;
+ goto done;
+ }
+
+ for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) {
+ ares__iface_ip_flags_t addrflag = 0;
+ struct ares_addr addr;
+ unsigned char netmask = 0;
+ unsigned int ll_scope = 0;
+
+ if (ifa->ifa_addr == NULL) {
+ continue;
+ }
+
+ if (!(ifa->ifa_flags & IFF_UP)) {
+ addrflag |= ARES_IFACE_IP_OFFLINE;
+ }
+
+ if (ifa->ifa_flags & IFF_LOOPBACK) {
+ addrflag |= ARES_IFACE_IP_LOOPBACK;
+ }
+
+ if (ifa->ifa_addr->sa_family == AF_INET) {
+ const struct sockaddr_in *sockaddr_in =
+ (const struct sockaddr_in *)((void *)ifa->ifa_addr);
+ addr.family = AF_INET;
+ memcpy(&addr.addr.addr4, &sockaddr_in->sin_addr, sizeof(addr.addr.addr4));
+ /* netmask */
+ sockaddr_in = (struct sockaddr_in *)((void *)ifa->ifa_netmask);
+ netmask = count_addr_bits((const void *)&sockaddr_in->sin_addr, 4);
+ } else if (ifa->ifa_addr->sa_family == AF_INET6) {
+ const struct sockaddr_in6 *sockaddr_in6 =
+ (const struct sockaddr_in6 *)((void *)ifa->ifa_addr);
+ addr.family = AF_INET6;
+ memcpy(&addr.addr.addr6, &sockaddr_in6->sin6_addr,
+ sizeof(addr.addr.addr6));
+ /* netmask */
+ sockaddr_in6 = (struct sockaddr_in6 *)((void *)ifa->ifa_netmask);
+ netmask = count_addr_bits((const void *)&sockaddr_in6->sin6_addr, 16);
+# ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID
+ ll_scope = sockaddr_in6->sin6_scope_id;
+# endif
+ } else {
+ /* unknown */
+ continue;
+ }
+
+ /* Name mismatch */
+ if (strcasecmp(ifa->ifa_name, name) != 0) {
+ continue;
+ }
+
+ status = ares__iface_ips_add(ips, addrflag, ifa->ifa_name, &addr, netmask,
+ ll_scope);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+
+done:
+ freeifaddrs(ifap);
+ return status;
+}
+
+#else
+
+static ares_status_t ares__iface_ips_enumerate(ares__iface_ips_t *ips,
+ const char *name)
+{
+ (void)ips;
+ (void)name;
+ return ARES_ENOTIMP;
+}
+
+#endif
+
+
+unsigned int ares__if_nametoindex(const char *name)
+{
+#ifdef HAVE_IF_NAMETOINDEX
+ return if_nametoindex(name);
+#else
+ ares_status_t status;
+ ares__iface_ips_t *ips = NULL;
+ size_t i;
+ unsigned int index = 0;
+
+ status =
+ ares__iface_ips(&ips, ARES_IFACE_IP_V6 | ARES_IFACE_IP_LINKLOCAL, name);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ for (i = 0; i < ares__iface_ips_cnt(ips); i++) {
+ if (ares__iface_ips_get_flags(ips, i) & ARES_IFACE_IP_LINKLOCAL) {
+ index = ares__iface_ips_get_ll_scope(ips, i);
+ goto done;
+ }
+ }
+
+done:
+ ares__iface_ips_destroy(ips);
+ return index;
+#endif
+}
+
+const char *ares__if_indextoname(unsigned int index, char *name,
+ size_t name_len)
+{
+#ifdef HAVE_IF_INDEXTONAME
+ if (name_len < IF_NAMESIZE) {
+ return NULL;
+ }
+ return if_indextoname(index, name);
+#else
+ ares_status_t status;
+ ares__iface_ips_t *ips = NULL;
+ size_t i;
+ const char *ptr = NULL;
+
+ if (name_len < IF_NAMESIZE) {
+ goto done;
+ }
+
+ if (index == 0) {
+ goto done;
+ }
+
+ status =
+ ares__iface_ips(&ips, ARES_IFACE_IP_V6 | ARES_IFACE_IP_LINKLOCAL, NULL);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ for (i = 0; i < ares__iface_ips_cnt(ips); i++) {
+ if (ares__iface_ips_get_flags(ips, i) & ARES_IFACE_IP_LINKLOCAL &&
+ ares__iface_ips_get_ll_scope(ips, i) == index) {
+ ares_strcpy(name, ares__iface_ips_get_name(ips, i), name_len);
+ ptr = name;
+ goto done;
+ }
+ }
+
+done:
+ ares__iface_ips_destroy(ips);
+ return ptr;
+#endif
+}
diff --git a/contrib/libs/c-ares/src/lib/ares__iface_ips.h b/contrib/libs/c-ares/src/lib/ares__iface_ips.h
new file mode 100644
index 0000000000..61ff736a79
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares__iface_ips.h
@@ -0,0 +1,139 @@
+/* MIT License
+ *
+ * Copyright (c) 2023 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#ifndef __ARES__IFACE_IPS_H
+#define __ARES__IFACE_IPS_H
+
+/*! Flags for interface ip addresses. */
+typedef enum {
+ ARES_IFACE_IP_V4 = 1 << 0, /*!< IPv4 address. During enumeration if
+ * this flag is set ARES_IFACE_IP_V6
+ * is not, will only enumerate v4
+ * addresses. */
+ ARES_IFACE_IP_V6 = 1 << 1, /*!< IPv6 address. During enumeration if
+ * this flag is set ARES_IFACE_IP_V4
+ * is not, will only enumerate v6
+ * addresses. */
+ ARES_IFACE_IP_LOOPBACK = 1 << 2, /*!< Loopback adapter */
+ ARES_IFACE_IP_OFFLINE = 1 << 3, /*!< Adapter offline */
+ ARES_IFACE_IP_LINKLOCAL = 1 << 4, /*!< Link-local ip address */
+ /*! Default, enumerate all ips for online interfaces, including loopback */
+ ARES_IFACE_IP_DEFAULT = (ARES_IFACE_IP_V4 | ARES_IFACE_IP_V6 |
+ ARES_IFACE_IP_LOOPBACK | ARES_IFACE_IP_LINKLOCAL)
+} ares__iface_ip_flags_t;
+
+struct ares__iface_ips;
+
+/*! Opaque pointer for holding enumerated interface ip addresses */
+typedef struct ares__iface_ips ares__iface_ips_t;
+
+/*! Destroy ip address enumeration created by ares__iface_ips().
+ *
+ * \param[in] ips Initialized IP address enumeration structure
+ */
+void ares__iface_ips_destroy(ares__iface_ips_t *ips);
+
+/*! Enumerate ip addresses on interfaces
+ *
+ * \param[out] ips Returns initialized ip address structure
+ * \param[in] flags Flags for enumeration
+ * \param[in] name Interface name to enumerate, or NULL to enumerate all
+ * \return ARES_ENOMEM on out of memory, ARES_ENOTIMP if not supported on
+ * the system, ARES_SUCCESS on success
+ */
+ares_status_t ares__iface_ips(ares__iface_ips_t **ips,
+ ares__iface_ip_flags_t flags, const char *name);
+
+/*! Count of ips enumerated
+ *
+ * \param[in] ips Initialized IP address enumeration structure
+ * \return count
+ */
+size_t ares__iface_ips_cnt(const ares__iface_ips_t *ips);
+
+/*! Retrieve interface name
+ *
+ * \param[in] ips Initialized IP address enumeration structure
+ * \param[in] idx Index of entry to pull
+ * \return interface name
+ */
+const char *ares__iface_ips_get_name(const ares__iface_ips_t *ips, size_t idx);
+
+/*! Retrieve interface address
+ *
+ * \param[in] ips Initialized IP address enumeration structure
+ * \param[in] idx Index of entry to pull
+ * \return interface address
+ */
+const struct ares_addr *ares__iface_ips_get_addr(const ares__iface_ips_t *ips,
+ size_t idx);
+
+/*! Retrieve interface address flags
+ *
+ * \param[in] ips Initialized IP address enumeration structure
+ * \param[in] idx Index of entry to pull
+ * \return interface address flags
+ */
+ares__iface_ip_flags_t ares__iface_ips_get_flags(const ares__iface_ips_t *ips,
+ size_t idx);
+
+/*! Retrieve interface address netmask
+ *
+ * \param[in] ips Initialized IP address enumeration structure
+ * \param[in] idx Index of entry to pull
+ * \return interface address netmask
+ */
+unsigned char ares__iface_ips_get_netmask(const ares__iface_ips_t *ips,
+ size_t idx);
+
+/*! Retrieve interface ipv6 link local scope
+ *
+ * \param[in] ips Initialized IP address enumeration structure
+ * \param[in] idx Index of entry to pull
+ * \return interface ipv6 link local scope
+ */
+unsigned int ares__iface_ips_get_ll_scope(const ares__iface_ips_t *ips,
+ size_t idx);
+
+
+/*! Retrieve the interface index (aka link local scope) from the interface
+ * name.
+ *
+ * \param[in] name Interface name
+ * \return 0 on failure, index otherwise
+ */
+unsigned int ares__if_nametoindex(const char *name);
+
+/*! Retrieves the interface name from the index (aka link local scope)
+ *
+ * \param[in] index Interface index (> 0)
+ * \param[in] name Buffer to hold name
+ * \param[in] name_len Length of provided buffer, must be at least IF_NAMESIZE
+ * \return NULL on failure, or pointer to name on success
+ */
+const char *ares__if_indextoname(unsigned int index, char *name,
+ size_t name_len);
+
+#endif
diff --git a/contrib/libs/c-ares/src/lib/ares__llist.c b/contrib/libs/c-ares/src/lib/ares__llist.c
index 9ccda81a6a..d175da2bd3 100644
--- a/contrib/libs/c-ares/src/lib/ares__llist.c
+++ b/contrib/libs/c-ares/src/lib/ares__llist.c
@@ -35,7 +35,6 @@ struct ares__llist {
size_t cnt;
};
-
struct ares__llist_node {
void *data;
ares__llist_node_t *prev;
@@ -43,56 +42,44 @@ struct ares__llist_node {
ares__llist_t *parent;
};
-
ares__llist_t *ares__llist_create(ares__llist_destructor_t destruct)
{
- ares__llist_t *list = ares_malloc(sizeof(*list));
+ ares__llist_t *list = ares_malloc_zero(sizeof(*list));
- if (list == NULL)
+ if (list == NULL) {
return NULL;
-
- memset(list, 0, sizeof(*list));
+ }
list->destruct = destruct;
return list;
}
-
-void ares__llist_replace_destructor(ares__llist_t *list,
+void ares__llist_replace_destructor(ares__llist_t *list,
ares__llist_destructor_t destruct)
{
- if (list == NULL)
+ if (list == NULL) {
return;
+ }
list->destruct = destruct;
}
-
typedef enum {
ARES__LLIST_INSERT_HEAD,
ARES__LLIST_INSERT_TAIL,
ARES__LLIST_INSERT_BEFORE
} ares__llist_insert_type_t;
-
-static ares__llist_node_t *ares__llist_insert_at(ares__llist_t *list,
- ares__llist_insert_type_t type,
- ares__llist_node_t *at,
- void *val)
+static void ares__llist_attach_at(ares__llist_t *list,
+ ares__llist_insert_type_t type,
+ ares__llist_node_t *at,
+ ares__llist_node_t *node)
{
- ares__llist_node_t *node = NULL;
-
- if (list == NULL || val == NULL)
- return NULL;
-
- node = ares_malloc(sizeof(*node));
-
- if (node == NULL)
- return NULL;
+ if (list == NULL || node == NULL) {
+ return;
+ }
- memset(node, 0, sizeof(*node));
- node->data = val;
node->parent = list;
if (type == ARES__LLIST_INSERT_BEFORE && (at == list->head || at == NULL)) {
@@ -103,15 +90,17 @@ static ares__llist_node_t *ares__llist_insert_at(ares__llist_t *list,
case ARES__LLIST_INSERT_HEAD:
node->next = list->head;
node->prev = NULL;
- if (list->head)
+ if (list->head) {
list->head->prev = node;
+ }
list->head = node;
break;
case ARES__LLIST_INSERT_TAIL:
node->next = NULL;
node->prev = list->tail;
- if (list->tail)
+ if (list->tail) {
list->tail->next = node;
+ }
list->tail = node;
break;
case ARES__LLIST_INSERT_BEFORE:
@@ -120,133 +109,151 @@ static ares__llist_node_t *ares__llist_insert_at(ares__llist_t *list,
at->prev = node;
break;
}
- if (list->tail == NULL)
+ if (list->tail == NULL) {
list->tail = node;
- if (list->head == NULL)
+ }
+ if (list->head == NULL) {
list->head = node;
+ }
list->cnt++;
+}
+
+static ares__llist_node_t *ares__llist_insert_at(ares__llist_t *list,
+ ares__llist_insert_type_t type,
+ ares__llist_node_t *at,
+ void *val)
+{
+ ares__llist_node_t *node = NULL;
+
+ if (list == NULL || val == NULL) {
+ return NULL;
+ }
+
+ node = ares_malloc_zero(sizeof(*node));
+
+ if (node == NULL) {
+ return NULL;
+ }
+
+ node->data = val;
+ ares__llist_attach_at(list, type, at, node);
return node;
}
-
ares__llist_node_t *ares__llist_insert_first(ares__llist_t *list, void *val)
{
return ares__llist_insert_at(list, ARES__LLIST_INSERT_HEAD, NULL, val);
}
-
ares__llist_node_t *ares__llist_insert_last(ares__llist_t *list, void *val)
{
return ares__llist_insert_at(list, ARES__LLIST_INSERT_TAIL, NULL, val);
}
-
ares__llist_node_t *ares__llist_insert_before(ares__llist_node_t *node,
- void *val)
+ void *val)
{
- if (node == NULL)
+ if (node == NULL) {
return NULL;
+ }
return ares__llist_insert_at(node->parent, ARES__LLIST_INSERT_BEFORE, node,
val);
}
-
ares__llist_node_t *ares__llist_insert_after(ares__llist_node_t *node,
- void *val)
+ void *val)
{
- if (node == NULL)
+ if (node == NULL) {
return NULL;
+ }
- if (node->next == NULL)
+ if (node->next == NULL) {
return ares__llist_insert_last(node->parent, val);
+ }
return ares__llist_insert_at(node->parent, ARES__LLIST_INSERT_BEFORE,
node->next, val);
}
-
ares__llist_node_t *ares__llist_node_first(ares__llist_t *list)
{
- if (list == NULL)
+ if (list == NULL) {
return NULL;
+ }
return list->head;
}
-
ares__llist_node_t *ares__llist_node_last(ares__llist_t *list)
{
- if (list == NULL)
+ if (list == NULL) {
return NULL;
+ }
return list->tail;
}
-
ares__llist_node_t *ares__llist_node_next(ares__llist_node_t *node)
{
- if (node == NULL)
+ if (node == NULL) {
return NULL;
+ }
return node->next;
}
-
ares__llist_node_t *ares__llist_node_prev(ares__llist_node_t *node)
{
- if (node == NULL)
+ if (node == NULL) {
return NULL;
+ }
return node->prev;
}
-
void *ares__llist_node_val(ares__llist_node_t *node)
{
- if (node == NULL)
+ if (node == NULL) {
return NULL;
+ }
return node->data;
}
-
-size_t ares__llist_len(ares__llist_t *list)
+size_t ares__llist_len(const ares__llist_t *list)
{
- if (list == NULL)
+ if (list == NULL) {
return 0;
+ }
return list->cnt;
}
-
ares__llist_t *ares__llist_node_parent(ares__llist_node_t *node)
{
- if (node == NULL)
+ if (node == NULL) {
return NULL;
+ }
return node->parent;
}
-
void *ares__llist_first_val(ares__llist_t *list)
{
return ares__llist_node_val(ares__llist_node_first(list));
}
-
void *ares__llist_last_val(ares__llist_t *list)
{
return ares__llist_node_val(ares__llist_node_last(list));
}
-
-void *ares__llist_node_claim(ares__llist_node_t *node)
+static void ares__llist_node_detach(ares__llist_node_t *node)
{
- void *val;
ares__llist_t *list;
- if (node == NULL)
- return NULL;
+ if (node == NULL) {
+ return;
+ }
list = node->parent;
- val = node->data;
if (node->prev) {
node->prev->next = node->next;
@@ -263,54 +270,91 @@ void *ares__llist_node_claim(ares__llist_node_t *node)
if (node == list->tail) {
list->tail = node->prev;
}
- ares_free(node);
+ node->parent = NULL;
list->cnt--;
+}
+
+void *ares__llist_node_claim(ares__llist_node_t *node)
+{
+ void *val;
+
+ if (node == NULL) {
+ return NULL;
+ }
+
+ val = node->data;
+ ares__llist_node_detach(node);
+ ares_free(node);
return val;
}
-
void ares__llist_node_destroy(ares__llist_node_t *node)
{
ares__llist_destructor_t destruct;
void *val;
- if (node == NULL)
+ if (node == NULL) {
return;
+ }
destruct = node->parent->destruct;
val = ares__llist_node_claim(node);
- if (val != NULL && destruct != NULL)
+ if (val != NULL && destruct != NULL) {
destruct(val);
+ }
}
-
void ares__llist_node_replace(ares__llist_node_t *node, void *val)
{
ares__llist_destructor_t destruct;
-
- if (node == NULL)
+
+ if (node == NULL) {
return;
+ }
destruct = node->parent->destruct;
- if (destruct != NULL)
+ if (destruct != NULL) {
destruct(node->data);
+ }
node->data = val;
}
-
void ares__llist_destroy(ares__llist_t *list)
{
ares__llist_node_t *node;
- if (list == NULL)
+ if (list == NULL) {
return;
+ }
while ((node = ares__llist_node_first(list)) != NULL) {
ares__llist_node_destroy(node);
}
ares_free(list);
}
+
+void ares__llist_node_move_parent_last(ares__llist_node_t *node,
+ ares__llist_t *new_parent)
+{
+ if (node == NULL || new_parent == NULL) {
+ return;
+ }
+
+ ares__llist_node_detach(node);
+ ares__llist_attach_at(new_parent, ARES__LLIST_INSERT_TAIL, NULL, node);
+}
+
+void ares__llist_node_move_parent_first(ares__llist_node_t *node,
+ ares__llist_t *new_parent)
+{
+ if (node == NULL || new_parent == NULL) {
+ return;
+ }
+
+ ares__llist_node_detach(node);
+ ares__llist_attach_at(new_parent, ARES__LLIST_INSERT_HEAD, NULL, node);
+}
diff --git a/contrib/libs/c-ares/src/lib/ares__llist.h b/contrib/libs/c-ares/src/lib/ares__llist.h
index 950c7ac1d0..7d57bdab3b 100644
--- a/contrib/libs/c-ares/src/lib/ares__llist.h
+++ b/contrib/libs/c-ares/src/lib/ares__llist.h
@@ -49,29 +49,29 @@ struct ares__llist_node;
typedef struct ares__llist_node ares__llist_node_t;
/*! Callback to free user-defined node data
- *
+ *
* \param[in] data user supplied data
*/
typedef void (*ares__llist_destructor_t)(void *data);
/*! Create a linked list object
- *
+ *
* \param[in] destruct Optional. Destructor to call on all removed nodes
* \return linked list object or NULL on out of memory
*/
-ares__llist_t *ares__llist_create(ares__llist_destructor_t destruct);
+ares__llist_t *ares__llist_create(ares__llist_destructor_t destruct);
/*! Replace destructor for linked list nodes. Typically this is used
* when wanting to disable the destructor by using NULL.
- *
+ *
* \param[in] list Initialized linked list object
* \param[in] destruct replacement destructor, NULL is allowed
*/
-void ares__llist_replace_destructor(ares__llist_t *list,
- ares__llist_destructor_t destruct);
+void ares__llist_replace_destructor(ares__llist_t *list,
+ ares__llist_destructor_t destruct);
/*! Insert value as the first node in the linked list
- *
+ *
* \param[in] list Initialized linked list object
* \param[in] val user-supplied value.
* \return node object referencing place in list, or null if out of memory or
@@ -80,7 +80,7 @@ void ares__llist_replace_destructor(ares__llist_t *list,
ares__llist_node_t *ares__llist_insert_first(ares__llist_t *list, void *val);
/*! Insert value as the last node in the linked list
- *
+ *
* \param[in] list Initialized linked list object
* \param[in] val user-supplied value.
* \return node object referencing place in list, or null if out of memory or
@@ -89,115 +89,132 @@ ares__llist_node_t *ares__llist_insert_first(ares__llist_t *list, void *val);
ares__llist_node_t *ares__llist_insert_last(ares__llist_t *list, void *val);
/*! Insert value before specified node in the linked list
- *
+ *
* \param[in] node node referenced to insert before
* \param[in] val user-supplied value.
* \return node object referencing place in list, or null if out of memory or
* misuse
*/
ares__llist_node_t *ares__llist_insert_before(ares__llist_node_t *node,
- void *val);
+ void *val);
/*! Insert value after specified node in the linked list
- *
+ *
* \param[in] node node referenced to insert after
* \param[in] val user-supplied value.
* \return node object referencing place in list, or null if out of memory or
* misuse
*/
ares__llist_node_t *ares__llist_insert_after(ares__llist_node_t *node,
- void *val);
+ void *val);
/*! Obtain first node in list
- *
+ *
* \param[in] list Initialized list object
* \return first node in list or NULL if none
*/
ares__llist_node_t *ares__llist_node_first(ares__llist_t *list);
/*! Obtain last node in list
- *
+ *
* \param[in] list Initialized list object
* \return last node in list or NULL if none
*/
ares__llist_node_t *ares__llist_node_last(ares__llist_t *list);
/*! Obtain next node in respect to specified node
- *
+ *
* \param[in] node Node referenced
* \return node or NULL if none
*/
ares__llist_node_t *ares__llist_node_next(ares__llist_node_t *node);
/*! Obtain previous node in respect to specified node
- *
+ *
* \param[in] node Node referenced
* \return node or NULL if none
*/
ares__llist_node_t *ares__llist_node_prev(ares__llist_node_t *node);
/*! Obtain value from node
- *
+ *
* \param[in] node Node referenced
* \return user provided value from node
*/
-void *ares__llist_node_val(ares__llist_node_t *node);
+void *ares__llist_node_val(ares__llist_node_t *node);
/*! Obtain the number of entries in the list
- *
+ *
* \param[in] list Initialized list object
* \return count
*/
-size_t ares__llist_len(ares__llist_t *list);
+size_t ares__llist_len(const ares__llist_t *list);
/*! Obtain list object from referenced node
- *
+ *
* \param[in] node Node referenced
* \return list object node belongs to
*/
-ares__llist_t *ares__llist_node_parent(ares__llist_node_t *node);
+ares__llist_t *ares__llist_node_parent(ares__llist_node_t *node);
/*! Obtain the first user-supplied value in the list
- *
+ *
* \param[in] list Initialized list object
* \return first user supplied value or NULL if none
*/
-void *ares__llist_first_val(ares__llist_t *list);
+void *ares__llist_first_val(ares__llist_t *list);
/*! Obtain the last user-supplied value in the list
- *
+ *
* \param[in] list Initialized list object
* \return last user supplied value or NULL if none
*/
-void *ares__llist_last_val(ares__llist_t *list);
+void *ares__llist_last_val(ares__llist_t *list);
/*! Take ownership of user-supplied value in list without calling destructor.
* Will unchain entry from list.
- *
+ *
* \param[in] node Node referenced
* \return user supplied value
*/
-void *ares__llist_node_claim(ares__llist_node_t *node);
+void *ares__llist_node_claim(ares__llist_node_t *node);
/*! Replace user-supplied value for node
- *
+ *
* \param[in] node Node referenced
* \param[in] val new user-supplied value
*/
void ares__llist_node_replace(ares__llist_node_t *node, void *val);
/*! Destroy the node, removing it from the list and calling destructor.
- *
+ *
* \param[in] node Node referenced
*/
void ares__llist_node_destroy(ares__llist_node_t *node);
/*! Destroy the list object and all nodes in the list.
- *
+ *
* \param[in] list Initialized list object
*/
void ares__llist_destroy(ares__llist_t *list);
+/*! Detach node from the current list and re-attach it to the new list as the
+ * last entry.
+ *
+ * \param[in] node node to move
+ * \param[in] new_parent new list
+ */
+void ares__llist_node_move_parent_last(ares__llist_node_t *node,
+ ares__llist_t *new_parent);
+
+/*! Detach node from the current list and re-attach it to the new list as the
+ * first entry.
+ *
+ * \param[in] node node to move
+ * \param[in] new_parent new list
+ */
+void ares__llist_node_move_parent_first(ares__llist_node_t *node,
+ ares__llist_t *new_parent);
/*! @} */
#endif /* __ARES__LLIST_H */
diff --git a/contrib/libs/c-ares/src/lib/ares__parse_into_addrinfo.c b/contrib/libs/c-ares/src/lib/ares__parse_into_addrinfo.c
index 73a17ea0ed..90e951c02f 100644
--- a/contrib/libs/c-ares/src/lib/ares__parse_into_addrinfo.c
+++ b/contrib/libs/c-ares/src/lib/ares__parse_into_addrinfo.c
@@ -1,6 +1,7 @@
/* MIT License
*
* Copyright (c) 2019 Andrew Selivanov
+ * Copyright (c) 2023 Brad House
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -35,8 +36,6 @@
# include <arpa/inet.h>
#endif
-#include "ares_nameser.h"
-
#ifdef HAVE_STRINGS_H
# include <strings.h>
#endif
@@ -46,194 +45,137 @@
#endif
#include "ares.h"
-#include "ares_dns.h"
#include "ares_private.h"
-int ares__parse_into_addrinfo(const unsigned char *abuf,
- int alen, int cname_only_is_enodata,
- unsigned short port,
- struct ares_addrinfo *ai)
+ares_status_t ares__parse_into_addrinfo(const ares_dns_record_t *dnsrec,
+ ares_bool_t cname_only_is_enodata,
+ unsigned short port,
+ struct ares_addrinfo *ai)
{
- unsigned int qdcount, ancount;
- int status, i, rr_type, rr_class, rr_len, rr_ttl;
- int got_a = 0, got_aaaa = 0, got_cname = 0;
- long len;
- const unsigned char *aptr;
- char *question_hostname = NULL;
- char *hostname, *rr_name = NULL, *rr_data;
- struct ares_addrinfo_cname *cname, *cnames = NULL;
- struct ares_addrinfo_node *nodes = NULL;
-
- /* Give up if abuf doesn't have room for a header. */
- if (alen < HFIXEDSZ)
- return ARES_EBADRESP;
-
- /* Fetch the question and answer count from the header. */
- qdcount = DNS_HEADER_QDCOUNT(abuf);
- ancount = DNS_HEADER_ANCOUNT(abuf);
- if (qdcount != 1)
- return ARES_EBADRESP;
-
-
- /* Expand the name from the question, and skip past the question. */
- aptr = abuf + HFIXEDSZ;
- status = ares__expand_name_for_response(aptr, abuf, alen, &question_hostname, &len, 0);
- if (status != ARES_SUCCESS)
- return status;
- if (aptr + len + QFIXEDSZ > abuf + alen)
- {
- status = ARES_EBADRESP;
- goto failed_stat;
+ ares_status_t status;
+ size_t i;
+ size_t ancount;
+ const char *hostname = NULL;
+ ares_bool_t got_a = ARES_FALSE;
+ ares_bool_t got_aaaa = ARES_FALSE;
+ ares_bool_t got_cname = ARES_FALSE;
+ struct ares_addrinfo_cname *cnames = NULL;
+ struct ares_addrinfo_node *nodes = NULL;
+
+ /* Save question hostname */
+ status = ares_dns_record_query_get(dnsrec, 0, &hostname, NULL, NULL);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ ancount = ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER);
+ if (ancount == 0) {
+ status = ARES_ENODATA;
+ goto done;
+ }
+
+ for (i = 0; i < ancount; i++) {
+ ares_dns_rec_type_t rtype;
+ const ares_dns_rr_t *rr =
+ ares_dns_record_rr_get_const(dnsrec, ARES_SECTION_ANSWER, i);
+
+ if (ares_dns_rr_get_class(rr) != ARES_CLASS_IN) {
+ continue;
}
- hostname = question_hostname;
-
- aptr += len + QFIXEDSZ;
-
- /* Examine each answer resource record (RR) in turn. */
- for (i = 0; i < (int)ancount; i++)
- {
- /* Decode the RR up to the data field. */
- status = ares__expand_name_for_response(aptr, abuf, alen, &rr_name, &len, 0);
- if (status != ARES_SUCCESS)
- {
- rr_name = NULL;
- goto failed_stat;
- }
-
- aptr += len;
- if (aptr + RRFIXEDSZ > abuf + alen)
- {
- status = ARES_EBADRESP;
- goto failed_stat;
- }
- rr_type = DNS_RR_TYPE(aptr);
- rr_class = DNS_RR_CLASS(aptr);
- rr_len = DNS_RR_LEN(aptr);
- rr_ttl = DNS_RR_TTL(aptr);
- aptr += RRFIXEDSZ;
- if (aptr + rr_len > abuf + alen)
- {
- status = ARES_EBADRESP;
- goto failed_stat;
- }
-
- if (rr_class == C_IN && rr_type == T_A
- && rr_len == sizeof(struct in_addr)
- && strcasecmp(rr_name, hostname) == 0)
- {
- got_a = 1;
- if (aptr + sizeof(struct in_addr) > abuf + alen)
- { /* LCOV_EXCL_START: already checked above */
- status = ARES_EBADRESP;
- goto failed_stat;
- } /* LCOV_EXCL_STOP */
-
- status = ares_append_ai_node(AF_INET, port, rr_ttl, aptr, &nodes);
- if (status != ARES_SUCCESS)
- goto failed_stat;
- }
- else if (rr_class == C_IN && rr_type == T_AAAA
- && rr_len == sizeof(struct ares_in6_addr)
- && strcasecmp(rr_name, hostname) == 0)
- {
- got_aaaa = 1;
- if (aptr + sizeof(struct ares_in6_addr) > abuf + alen)
- { /* LCOV_EXCL_START: already checked above */
- status = ARES_EBADRESP;
- goto failed_stat;
- } /* LCOV_EXCL_STOP */
-
- status = ares_append_ai_node(AF_INET6, port, rr_ttl, aptr, &nodes);
- if (status != ARES_SUCCESS)
- goto failed_stat;
- }
-
- if (rr_class == C_IN && rr_type == T_CNAME)
- {
- got_cname = 1;
- status = ares__expand_name_for_response(aptr, abuf, alen, &rr_data,
- &len, 1);
- if (status != ARES_SUCCESS)
- {
- goto failed_stat;
- }
-
- /* Decode the RR data and replace the hostname with it. */
- /* SA: Seems wrong as it introduses order dependency. */
- hostname = rr_data;
-
- cname = ares__append_addrinfo_cname(&cnames);
- if (!cname)
- {
- status = ARES_ENOMEM;
- ares_free(rr_data);
- goto failed_stat;
- }
- cname->ttl = rr_ttl;
- cname->alias = rr_name;
- cname->name = rr_data;
- rr_name = NULL;
- }
- else
- {
- /* rr_name is only saved for cname */
- ares_free(rr_name);
- rr_name = NULL;
- }
-
-
- aptr += rr_len;
- if (aptr > abuf + alen)
- { /* LCOV_EXCL_START: already checked above */
- status = ARES_EBADRESP;
- goto failed_stat;
- } /* LCOV_EXCL_STOP */
+ rtype = ares_dns_rr_get_type(rr);
+
+ /* Issue #683
+ * Old code did this hostname sanity check, however it appears this is
+ * flawed logic. Other resolvers don't do this sanity check. Leaving
+ * this code commented out for future reference.
+ *
+ * rname = ares_dns_rr_get_name(rr);
+ * if ((rtype == ARES_REC_TYPE_A || rtype == ARES_REC_TYPE_AAAA) &&
+ * strcasecmp(rname, hostname) != 0) {
+ * continue;
+ * }
+ */
+
+ if (rtype == ARES_REC_TYPE_CNAME) {
+ struct ares_addrinfo_cname *cname;
+
+ got_cname = ARES_TRUE;
+ /* replace hostname with data from cname
+ * SA: Seems wrong as it introduces order dependency. */
+ hostname = ares_dns_rr_get_str(rr, ARES_RR_CNAME_CNAME);
+
+ cname = ares__append_addrinfo_cname(&cnames);
+ if (cname == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ cname->ttl = (int)ares_dns_rr_get_ttl(rr);
+ cname->alias = ares_strdup(ares_dns_rr_get_name(rr));
+ if (cname->alias == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ cname->name = ares_strdup(hostname);
+ if (cname->name == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ } else if (rtype == ARES_REC_TYPE_A) {
+ got_a = ARES_TRUE;
+ status =
+ ares_append_ai_node(AF_INET, port, ares_dns_rr_get_ttl(rr),
+ ares_dns_rr_get_addr(rr, ARES_RR_A_ADDR), &nodes);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ } else if (rtype == ARES_REC_TYPE_AAAA) {
+ got_aaaa = ARES_TRUE;
+ status = ares_append_ai_node(AF_INET6, port, ares_dns_rr_get_ttl(rr),
+ ares_dns_rr_get_addr6(rr, ARES_RR_AAAA_ADDR),
+ &nodes);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ } else {
+ continue;
}
-
- if (status == ARES_SUCCESS)
- {
- if (!got_a && !got_aaaa)
- {
- if (!got_cname || (got_cname && cname_only_is_enodata))
- {
- status = ARES_ENODATA;
- goto failed_stat;
- }
- }
-
- /* save the question hostname as ai->name */
- if (ai->name == NULL || strcasecmp(ai->name, question_hostname) != 0)
- {
- ares_free(ai->name);
- ai->name = ares_strdup(question_hostname);
- if (!ai->name)
- {
- status = ARES_ENOMEM;
- goto failed_stat;
- }
- }
-
- if (got_a || got_aaaa)
- {
- ares__addrinfo_cat_nodes(&ai->nodes, nodes);
- nodes = NULL;
- }
-
- if (got_cname)
- {
- ares__addrinfo_cat_cnames(&ai->cnames, cnames);
- cnames = NULL;
- }
+ }
+
+ if (!got_a && !got_aaaa &&
+ (!got_cname || (got_cname && cname_only_is_enodata))) {
+ status = ARES_ENODATA;
+ goto done;
+ }
+
+ /* save the hostname as ai->name */
+ if (ai->name == NULL || strcasecmp(ai->name, hostname) != 0) {
+ ares_free(ai->name);
+ ai->name = ares_strdup(hostname);
+ if (ai->name == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
}
+ }
- ares_free(question_hostname);
- return status;
+ if (got_a || got_aaaa) {
+ ares__addrinfo_cat_nodes(&ai->nodes, nodes);
+ nodes = NULL;
+ }
-failed_stat:
- ares_free(question_hostname);
- ares_free(rr_name);
+ if (got_cname) {
+ ares__addrinfo_cat_cnames(&ai->cnames, cnames);
+ cnames = NULL;
+ }
+
+done:
ares__freeaddrinfo_cnames(cnames);
ares__freeaddrinfo_nodes(nodes);
+
+ /* compatibility */
+ if (status == ARES_EBADNAME) {
+ status = ARES_EBADRESP;
+ }
+
return status;
}
diff --git a/contrib/libs/c-ares/src/lib/ares__read_line.c b/contrib/libs/c-ares/src/lib/ares__read_line.c
deleted file mode 100644
index 38beda6fb0..0000000000
--- a/contrib/libs/c-ares/src/lib/ares__read_line.c
+++ /dev/null
@@ -1,84 +0,0 @@
-/* MIT License
- *
- * Copyright (c) 1998 Massachusetts Institute of Technology
- * Copyright (c) The c-ares project and its contributors
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- * SPDX-License-Identifier: MIT
- */
-
-#include "ares_setup.h"
-
-#include "ares.h"
-#include "ares_nowarn.h"
-#include "ares_private.h"
-
-/* This is an internal function. Its contract is to read a line from
- * a file into a dynamically allocated buffer, zeroing the trailing
- * newline if there is one. The calling routine may call
- * ares__read_line multiple times with the same buf and bufsize
- * pointers; *buf will be reallocated and *bufsize adjusted as
- * appropriate. The initial value of *buf should be NULL. After the
- * calling routine is done reading lines, it should free *buf.
- */
-int ares__read_line(FILE *fp, char **buf, size_t *bufsize)
-{
- char *newbuf;
- size_t offset = 0;
- size_t len;
-
- if (*buf == NULL)
- {
- *buf = ares_malloc(128);
- if (!*buf)
- return ARES_ENOMEM;
- *bufsize = 128;
- }
-
- for (;;)
- {
- int bytestoread = aresx_uztosi(*bufsize - offset);
-
- if (!fgets(*buf + offset, bytestoread, fp))
- return (offset != 0) ? 0 : (ferror(fp)) ? ARES_EFILE : ARES_EOF;
- len = offset + strlen(*buf + offset);
- if ((*buf)[len - 1] == '\n')
- {
- (*buf)[len - 1] = 0;
- break;
- }
- offset = len;
- if(len < *bufsize - 1)
- continue;
-
- /* Allocate more space. */
- newbuf = ares_realloc(*buf, *bufsize * 2);
- if (!newbuf)
- {
- ares_free(*buf);
- *buf = NULL;
- return ARES_ENOMEM;
- }
- *buf = newbuf;
- *bufsize *= 2;
- }
- return ARES_SUCCESS;
-}
diff --git a/contrib/libs/c-ares/src/lib/ares__readaddrinfo.c b/contrib/libs/c-ares/src/lib/ares__readaddrinfo.c
deleted file mode 100644
index fe99946782..0000000000
--- a/contrib/libs/c-ares/src/lib/ares__readaddrinfo.c
+++ /dev/null
@@ -1,265 +0,0 @@
-/* MIT License
- *
- * Copyright (c) 2019 Andrew Selivanov
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- * SPDX-License-Identifier: MIT
- */
-
-#include "ares_setup.h"
-
-#ifdef HAVE_NETINET_IN_H
-# include <netinet/in.h>
-#endif
-#ifdef HAVE_NETDB_H
-# include <netdb.h>
-#endif
-#ifdef HAVE_ARPA_INET_H
-# include <arpa/inet.h>
-#endif
-
-#include "ares.h"
-#include "ares_inet_net_pton.h"
-#include "ares_nowarn.h"
-#include "ares_private.h"
-
-#define MAX_ALIASES 40
-
-int ares__readaddrinfo(FILE *fp,
- const char *name,
- unsigned short port,
- const struct ares_addrinfo_hints *hints,
- struct ares_addrinfo *ai)
-{
- char *line = NULL, *p, *q;
- char *txtaddr, *txthost, *txtalias;
- char *aliases[MAX_ALIASES];
- unsigned int i, alias_count;
- int status = ARES_SUCCESS;
- size_t linesize;
- struct ares_addrinfo_cname *cname = NULL, *cnames = NULL;
- struct ares_addrinfo_node *nodes = NULL;
- int match_with_alias, match_with_canonical;
- int want_cname = hints->ai_flags & ARES_AI_CANONNAME;
-
- /* Validate family */
- switch (hints->ai_family) {
- case AF_INET:
- case AF_INET6:
- case AF_UNSPEC:
- break;
- default:
- return ARES_EBADFAMILY;
- }
-
- ai->name = ares_strdup(name);
- if(!ai->name)
- {
- status = ARES_ENOMEM;
- goto fail;
- }
-
- while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS)
- {
- match_with_alias = 0;
- match_with_canonical = 0;
- alias_count = 0;
- /* Trim line comment. */
- p = line;
- while (*p && (*p != '#'))
- p++;
- *p = '\0';
-
- /* Trim trailing whitespace. */
- q = p - 1;
- while ((q >= line) && ISSPACE(*q))
- q--;
- *++q = '\0';
-
- /* Skip leading whitespace. */
- p = line;
- while (*p && ISSPACE(*p))
- p++;
- if (!*p)
- /* Ignore line if empty. */
- continue;
-
- /* Pointer to start of IPv4 or IPv6 address part. */
- txtaddr = p;
-
- /* Advance past address part. */
- while (*p && !ISSPACE(*p))
- p++;
- if (!*p)
- /* Ignore line if reached end of line. */
- continue;
-
- /* Null terminate address part. */
- *p = '\0';
-
- /* Advance to host name */
- p++;
- while (*p && ISSPACE(*p))
- p++;
- if (!*p)
- /* Ignore line if reached end of line. */
- continue; /* LCOV_EXCL_LINE: trailing whitespace already stripped */
-
- /* Pointer to start of host name. */
- txthost = p;
-
- /* Advance past host name. */
- while (*p && !ISSPACE(*p))
- p++;
-
- /* Pointer to start of first alias. */
- txtalias = NULL;
- if (*p)
- {
- q = p + 1;
- while (*q && ISSPACE(*q))
- q++;
- if (*q)
- txtalias = q;
- }
-
- /* Null terminate host name. */
- *p = '\0';
-
- /* Find out if host name matches with canonical host name. */
- if (strcasecmp(txthost, name) == 0)
- {
- match_with_canonical = 1;
- }
-
- /* Find out if host name matches with one of the aliases. */
- while (txtalias)
- {
- p = txtalias;
- while (*p && !ISSPACE(*p))
- p++;
- q = p;
- while (*q && ISSPACE(*q))
- q++;
- *p = '\0';
- if (strcasecmp(txtalias, name) == 0)
- {
- match_with_alias = 1;
- if (!want_cname)
- break;
- }
- if (alias_count < MAX_ALIASES)
- {
- aliases[alias_count++] = txtalias;
- }
- txtalias = *q ? q : NULL;
- }
-
- /* Try next line if host does not match. */
- if (!match_with_alias && !match_with_canonical)
- {
- continue;
- }
-
- /*
- * Convert address string to network address for the requested families.
- * Actual address family possible values are AF_INET and AF_INET6 only.
- */
- if ((hints->ai_family == AF_INET) || (hints->ai_family == AF_UNSPEC))
- {
- struct in_addr addr4;
- if (ares_inet_pton(AF_INET, txtaddr, &addr4) == 1)
- {
- status = ares_append_ai_node(AF_INET, port, 0, &addr4, &nodes);
- if (status != ARES_SUCCESS)
- {
- goto fail;
- }
- }
- }
- if ((hints->ai_family == AF_INET6) || (hints->ai_family == AF_UNSPEC))
- {
- struct ares_in6_addr addr6;
- if (ares_inet_pton(AF_INET6, txtaddr, &addr6) == 1)
- {
- status = ares_append_ai_node(AF_INET6, port, 0, &addr6, &nodes);
- if (status != ARES_SUCCESS)
- {
- goto fail;
- }
- }
- }
-
- if (want_cname)
- {
- for (i = 0; i < alias_count; ++i)
- {
- cname = ares__append_addrinfo_cname(&cnames);
- if (!cname)
- {
- status = ARES_ENOMEM;
- goto fail;
- }
- cname->alias = ares_strdup(aliases[i]);
- cname->name = ares_strdup(txthost);
- }
- /* No aliases, cname only. */
- if(!alias_count)
- {
- cname = ares__append_addrinfo_cname(&cnames);
- if (!cname)
- {
- status = ARES_ENOMEM;
- goto fail;
- }
- cname->name = ares_strdup(txthost);
- }
- }
- }
-
- /* Last read failed. */
- if (status == ARES_ENOMEM)
- {
- goto fail;
- }
-
- /* If no results, its a failure */
- if (!nodes)
- {
- status = ARES_ENOTFOUND;
- goto fail;
- }
-
- /* Free line buffer. */
- ares_free(line);
- ares__addrinfo_cat_cnames(&ai->cnames, cnames);
- ares__addrinfo_cat_nodes(&ai->nodes, nodes);
-
- return ARES_SUCCESS;
-
-fail:
- ares_free(line);
- ares__freeaddrinfo_cnames(cnames);
- ares__freeaddrinfo_nodes(nodes);
- ares_free(ai->name);
- ai->name = NULL;
- return status;
-}
diff --git a/contrib/libs/c-ares/src/lib/ares__slist.c b/contrib/libs/c-ares/src/lib/ares__slist.c
index 9974bc045a..5b80984355 100644
--- a/contrib/libs/c-ares/src/lib/ares__slist.c
+++ b/contrib/libs/c-ares/src/lib/ares__slist.c
@@ -32,14 +32,13 @@
#define ARES__SLIST_START_LEVELS 4
-
struct ares__slist {
ares_rand_state *rand_state;
unsigned char rand_data[8];
size_t rand_bits;
ares__slist_node_t **head;
- size_t levels;
+ size_t levels;
ares__slist_node_t *tail;
ares__slist_cmp_t cmp;
@@ -47,7 +46,6 @@ struct ares__slist {
size_t cnt;
};
-
struct ares__slist_node {
void *data;
ares__slist_node_t **prev;
@@ -56,41 +54,37 @@ struct ares__slist_node {
ares__slist_t *parent;
};
-
-ares__slist_t *ares__slist_create(ares_rand_state *rand_state,
- ares__slist_cmp_t cmp,
+ares__slist_t *ares__slist_create(ares_rand_state *rand_state,
+ ares__slist_cmp_t cmp,
ares__slist_destructor_t destruct)
{
ares__slist_t *list;
- if (rand_state == NULL || cmp == NULL)
+ if (rand_state == NULL || cmp == NULL) {
return NULL;
+ }
- list = ares_malloc(sizeof(*list));
+ list = ares_malloc_zero(sizeof(*list));
- if (list == NULL)
+ if (list == NULL) {
return NULL;
-
- memset(list, 0, sizeof(*list));
+ }
list->rand_state = rand_state;
list->cmp = cmp;
list->destruct = destruct;
- list->levels = ARES__SLIST_START_LEVELS;
- list->head = ares_malloc(sizeof(*list->head) * list->levels);
+ list->levels = ARES__SLIST_START_LEVELS;
+ list->head = ares_malloc_zero(sizeof(*list->head) * list->levels);
if (list->head == NULL) {
ares_free(list);
return NULL;
}
- memset(list->head, 0, sizeof(*list->head) * list->levels);
-
return list;
}
-
-static unsigned int ares__slist_coin_flip(ares__slist_t *list)
+static ares_bool_t ares__slist_coin_flip(ares__slist_t *list)
{
size_t total_bits = sizeof(list->rand_data) * 8;
size_t bit;
@@ -108,149 +102,59 @@ static unsigned int ares__slist_coin_flip(ares__slist_t *list)
bit = total_bits - list->rand_bits;
list->rand_bits--;
- return (list->rand_data[bit / 8] & (1 << (bit % 8)))?1:0;
+ return (list->rand_data[bit / 8] & (1 << (bit % 8))) ? ARES_TRUE : ARES_FALSE;
}
-
-void ares__slist_replace_destructor(ares__slist_t *list,
+void ares__slist_replace_destructor(ares__slist_t *list,
ares__slist_destructor_t destruct)
{
- if (list == NULL)
+ if (list == NULL) {
return;
+ }
list->destruct = destruct;
}
-/* Uses public domain code snipets from http://graphics.stanford.edu/~seander/bithacks.html */
-
-static size_t ares__round_up_pow2(size_t n)
-{
- n--;
- n |= n >> 1;
- n |= n >> 2;
- n |= n >> 4;
- n |= n >> 8;
- n |= n >> 16;
- if (sizeof(size_t) > 4)
- n |= n >> 32;
- n++;
- return n;
-}
-
-
-static size_t ares__log2(size_t n)
-{
- static const unsigned char tab32[32] = {
- 0, 1, 28, 2, 29, 14, 24, 3,
- 30, 22, 20, 15, 25, 17, 4, 8,
- 31, 27, 13, 23, 21, 19, 16, 7,
- 26, 12, 18, 6, 11, 5, 10, 9
- };
- static const unsigned char tab64[64] = {
- 63, 0, 58, 1, 59, 47, 53, 2,
- 60, 39, 48, 27, 54, 33, 42, 3,
- 61, 51, 37, 40, 49, 18, 28, 20,
- 55, 30, 34, 11, 43, 14, 22, 4,
- 62, 57, 46, 52, 38, 26, 32, 41,
- 50, 36, 17, 19, 29, 10, 13, 21,
- 56, 45, 25, 31, 35, 16, 9, 12,
- 44, 24, 15, 8, 23, 7, 6, 5
- };
-
- if (sizeof(size_t) == 4)
- return tab32[(size_t)(n*0x077CB531) >> 27];
-
- return tab64[((size_t)(n*0x07EDD5E59A4E28C2)) >> 58];
-}
-
-
-static size_t ares__slist_max_level(ares__slist_t *list)
+static size_t ares__slist_max_level(const ares__slist_t *list)
{
size_t max_level = 0;
- if (list->cnt+1 <= (1 << ARES__SLIST_START_LEVELS)) {
+ if (list->cnt + 1 <= (1 << ARES__SLIST_START_LEVELS)) {
max_level = ARES__SLIST_START_LEVELS;
} else {
- max_level = ares__log2(ares__round_up_pow2(list->cnt+1));
+ max_level = ares__log2(ares__round_up_pow2(list->cnt + 1));
}
- if (list->levels > max_level)
+ if (list->levels > max_level) {
max_level = list->levels;
+ }
return max_level;
}
-
static size_t ares__slist_calc_level(ares__slist_t *list)
{
size_t max_level = ares__slist_max_level(list);
size_t level;
- for (level=1; ares__slist_coin_flip(list) && level < max_level; level++)
+ for (level = 1; ares__slist_coin_flip(list) && level < max_level; level++)
;
return level;
}
-
-ares__slist_node_t *ares__slist_insert(ares__slist_t *list, void *val)
+static void ares__slist_node_push(ares__slist_t *list, ares__slist_node_t *node)
{
- ares__slist_node_t *node = NULL;
- ares__slist_node_t *left = NULL;
size_t i;
-
- if (list == NULL || val == NULL)
- return NULL;
-
- node = ares_malloc(sizeof(*node));
-
- if (node == NULL)
- goto fail;
-
- memset(node, 0, sizeof(*node));
- node->data = val;
- node->parent = list;
-
- /* Randomly determine the number of levels we want to use */
- node->levels = ares__slist_calc_level(list);
-
- /* Allocate array of next and prev nodes for linking each level */
- node->next = ares_malloc(sizeof(*node->next) * node->levels);
- if (node->next == NULL)
- goto fail;
-
- memset(node->next, 0, sizeof(*node->next) * node->levels);
-
- node->prev = ares_malloc(sizeof(*node->prev) * node->levels);
- if (node->prev == NULL)
- goto fail;
-
- memset(node->prev, 0, sizeof(*node->prev) * node->levels);
-
- /* If the number of levels is greater than we currently support in the slist,
- * increase the count */
- if (list->levels < node->levels) {
- size_t zero_len = sizeof(*list->head) * (node->levels - list->levels);
- size_t offset = sizeof(*list->head) * list->levels;
- void *ptr = ares_realloc(list->head, sizeof(*list->head) * node->levels);
- if (ptr == NULL)
- goto fail;
-
- memset((unsigned char *)ptr + offset, 0, zero_len);
- list->head = ptr;
- list->levels = node->levels;
- }
-
+ ares__slist_node_t *left = NULL;
/* Scan from highest level in the slist, even if we're not using that number
* of levels for this entry as this is what makes it O(log n) */
- for (i=list->levels; i-- > 0; ) {
- /* set left if left is NULL and the current node value is greater than the
+ for (i = list->levels; i-- > 0;) {
+ /* set left if left is NULL and the current node value is greater than the
* head at this level */
- if (left == NULL &&
- list->head[i] != NULL &&
- list->cmp(node->data, list->head[i]->data) > 0
- ) {
+ if (left == NULL && list->head[i] != NULL &&
+ list->cmp(node->data, list->head[i]->data) > 0) {
left = list->head[i];
}
@@ -263,9 +167,10 @@ ares__slist_node_t *ares__slist_insert(ares__slist_t *list, void *val)
}
/* search only as we didn't randomly select this number of levels */
- if (i >= node->levels)
+ if (i >= node->levels) {
continue;
-
+ }
+
if (left == NULL) {
/* head insertion */
node->next[i] = list->head[i];
@@ -288,6 +193,54 @@ ares__slist_node_t *ares__slist_insert(ares__slist_t *list, void *val)
}
}
}
+}
+
+ares__slist_node_t *ares__slist_insert(ares__slist_t *list, void *val)
+{
+ ares__slist_node_t *node = NULL;
+
+ if (list == NULL || val == NULL) {
+ return NULL;
+ }
+
+ node = ares_malloc_zero(sizeof(*node));
+
+ if (node == NULL) {
+ goto fail;
+ }
+
+ node->data = val;
+ node->parent = list;
+
+ /* Randomly determine the number of levels we want to use */
+ node->levels = ares__slist_calc_level(list);
+
+ /* Allocate array of next and prev nodes for linking each level */
+ node->next = ares_malloc_zero(sizeof(*node->next) * node->levels);
+ if (node->next == NULL) {
+ goto fail;
+ }
+
+ node->prev = ares_malloc_zero(sizeof(*node->prev) * node->levels);
+ if (node->prev == NULL) {
+ goto fail;
+ }
+
+ /* If the number of levels is greater than we currently support in the slist,
+ * increase the count */
+ if (list->levels < node->levels) {
+ void *ptr =
+ ares_realloc_zero(list->head, sizeof(*list->head) * list->levels,
+ sizeof(*list->head) * node->levels);
+ if (ptr == NULL) {
+ goto fail;
+ }
+
+ list->head = ptr;
+ list->levels = node->levels;
+ }
+
+ ares__slist_node_push(list, node);
list->cnt++;
@@ -302,25 +255,90 @@ fail:
return NULL;
}
+static void ares__slist_node_pop(ares__slist_node_t *node)
+{
+ ares__slist_t *list = node->parent;
+ size_t i;
+
+ /* relink each node at each level */
+ for (i = node->levels; i-- > 0;) {
+ if (node->next[i] == NULL) {
+ if (i == 0) {
+ list->tail = node->prev[0];
+ }
+ } else {
+ node->next[i]->prev[i] = node->prev[i];
+ }
+
+ if (node->prev[i] == NULL) {
+ list->head[i] = node->next[i];
+ } else {
+ node->prev[i]->next[i] = node->next[i];
+ }
+ }
+
+ memset(node->next, 0, sizeof(*node->next) * node->levels);
+ memset(node->prev, 0, sizeof(*node->prev) * node->levels);
+}
+
+void *ares__slist_node_claim(ares__slist_node_t *node)
+{
+ ares__slist_t *list;
+ void *val;
+
+ if (node == NULL) {
+ return NULL;
+ }
+
+ list = node->parent;
+ val = node->data;
+
+ ares__slist_node_pop(node);
+
+ ares_free(node->next);
+ ares_free(node->prev);
+ ares_free(node);
+
+ list->cnt--;
+
+ return val;
+}
+
+void ares__slist_node_reinsert(ares__slist_node_t *node)
+{
+ ares__slist_t *list;
+
+ if (node == NULL) {
+ return;
+ }
+
+ list = node->parent;
+
+ ares__slist_node_pop(node);
+ ares__slist_node_push(list, node);
+}
ares__slist_node_t *ares__slist_node_find(ares__slist_t *list, const void *val)
{
size_t i;
ares__slist_node_t *node = NULL;
- int rv = -1;
+ int rv = -1;
- if (list == NULL || val == NULL)
+ if (list == NULL || val == NULL) {
return NULL;
+ }
/* Scan nodes starting at the highest level. For each level scan forward
* until the value is between the prior and next node, or if equal quit
* as we found a match */
- for (i=list->levels; i-- > 0; ) {
- if (node == NULL)
+ for (i = list->levels; i-- > 0;) {
+ if (node == NULL) {
node = list->head[i];
+ }
- if (node == NULL)
+ if (node == NULL) {
continue;
+ }
do {
rv = list->cmp(val, node->data);
@@ -359,138 +377,98 @@ ares__slist_node_t *ares__slist_node_find(ares__slist_t *list, const void *val)
return node;
}
-
ares__slist_node_t *ares__slist_node_first(ares__slist_t *list)
{
- if (list == NULL)
+ if (list == NULL) {
return NULL;
+ }
return list->head[0];
}
-
ares__slist_node_t *ares__slist_node_last(ares__slist_t *list)
{
- if (list == NULL)
+ if (list == NULL) {
return NULL;
+ }
return list->tail;
}
-
ares__slist_node_t *ares__slist_node_next(ares__slist_node_t *node)
{
- if (node == NULL)
+ if (node == NULL) {
return NULL;
+ }
return node->next[0];
}
-
ares__slist_node_t *ares__slist_node_prev(ares__slist_node_t *node)
{
- if (node == NULL)
+ if (node == NULL) {
return NULL;
+ }
return node->prev[0];
}
-
void *ares__slist_node_val(ares__slist_node_t *node)
{
- if (node == NULL)
+ if (node == NULL) {
return NULL;
+ }
return node->data;
}
-
-size_t ares__slist_len(ares__slist_t *list)
+size_t ares__slist_len(const ares__slist_t *list)
{
- if (list == NULL)
+ if (list == NULL) {
return 0;
+ }
return list->cnt;
}
-
ares__slist_t *ares__slist_node_parent(ares__slist_node_t *node)
{
- if (node == NULL)
+ if (node == NULL) {
return NULL;
+ }
return node->parent;
}
-
void *ares__slist_first_val(ares__slist_t *list)
{
return ares__slist_node_val(ares__slist_node_first(list));
}
-
void *ares__slist_last_val(ares__slist_t *list)
{
return ares__slist_node_val(ares__slist_node_last(list));
}
-
-void *ares__slist_node_claim(ares__slist_node_t *node)
-{
- void *val;
- ares__slist_t *list;
- size_t i;
-
- if (node == NULL)
- return NULL;
-
- list = node->parent;
- val = node->data;
-
- /* relink each node at each level */
- for (i=node->levels; i-- > 0; ) {
- if (node->next[i] == NULL) {
- if (i == 0) {
- list->tail = node->prev[0];
- }
- } else {
- node->next[i]->prev[i] = node->prev[i];
- }
-
- if (node->prev[i] == NULL) {
- list->head[i] = node->next[i];
- } else {
- node->prev[i]->next[i] = node->next[i];
- }
- }
-
- ares_free(node->next);
- ares_free(node->prev);
- ares_free(node);
-
- list->cnt--;
-
- return val;
-}
-
-
void ares__slist_node_destroy(ares__slist_node_t *node)
{
ares__slist_destructor_t destruct;
void *val;
- if (node == NULL)
+ if (node == NULL) {
return;
+ }
destruct = node->parent->destruct;
- val = ares__slist_node_claim(node);
+ val = ares__slist_node_claim(node);
- if (val != NULL && destruct != NULL)
+ if (val != NULL && destruct != NULL) {
destruct(val);
+ }
}
-
void ares__slist_destroy(ares__slist_t *list)
{
ares__slist_node_t *node;
- if (list == NULL)
+ if (list == NULL) {
return;
+ }
while ((node = ares__slist_node_first(list)) != NULL) {
ares__slist_node_destroy(node);
diff --git a/contrib/libs/c-ares/src/lib/ares__slist.h b/contrib/libs/c-ares/src/lib/ares__slist.h
index 2cce217164..26af88fa78 100644
--- a/contrib/libs/c-ares/src/lib/ares__slist.h
+++ b/contrib/libs/c-ares/src/lib/ares__slist.h
@@ -60,13 +60,13 @@ struct ares__slist_node;
typedef struct ares__slist_node ares__slist_node_t;
/*! SkipList Node Value destructor callback
- *
+ *
* \param[in] data User-defined data to destroy
*/
typedef void (*ares__slist_destructor_t)(void *data);
/*! SkipList comparison function
- *
+ *
* \param[in] data1 First user-defined data object
* \param[in] data2 Second user-defined data object
* \return < 0 if data1 < data1, > 0 if data1 > data2, 0 if data1 == data2
@@ -74,26 +74,26 @@ typedef void (*ares__slist_destructor_t)(void *data);
typedef int (*ares__slist_cmp_t)(const void *data1, const void *data2);
/*! Create SkipList
- *
+ *
* \param[in] rand_state Initialized ares random state.
* \param[in] cmp SkipList comparison function
* \param[in] destruct SkipList Node Value Destructor. Optional, use NULL.
* \return Initialized SkipList Object or NULL on misuse or ENOMEM
- */
-ares__slist_t *ares__slist_create(ares_rand_state *rand_state,
- ares__slist_cmp_t cmp,
- ares__slist_destructor_t destruct);
+ */
+ares__slist_t *ares__slist_create(ares_rand_state *rand_state,
+ ares__slist_cmp_t cmp,
+ ares__slist_destructor_t destruct);
/*! Replace SkipList Node Value Destructor
- *
+ *
* \param[in] list Initialized SkipList Object
* \param[in] destruct Replacement destructor. May be NULL.
*/
-void ares__slist_replace_destructor(ares__slist_t *list,
- ares__slist_destructor_t destruct);
+void ares__slist_replace_destructor(ares__slist_t *list,
+ ares__slist_destructor_t destruct);
/*! Insert Value into SkipList
- *
+ *
* \param[in] list Initialized SkipList Object
* \param[in] val Node Value. Must not be NULL. Function takes ownership
* and will have destructor called.
@@ -102,35 +102,35 @@ void ares__slist_replace_destructor(ares__slist_t *list,
ares__slist_node_t *ares__slist_insert(ares__slist_t *list, void *val);
/*! Fetch first node in SkipList
- *
+ *
* \param[in] list Initialized SkipList Object
* \return SkipList Node Object or NULL if none
*/
ares__slist_node_t *ares__slist_node_first(ares__slist_t *list);
/*! Fetch last node in SkipList
- *
+ *
* \param[in] list Initialized SkipList Object
* \return SkipList Node Object or NULL if none
*/
ares__slist_node_t *ares__slist_node_last(ares__slist_t *list);
/*! Fetch next node in SkipList
- *
+ *
* \param[in] node SkipList Node Object
* \return SkipList Node Object or NULL if none
*/
ares__slist_node_t *ares__slist_node_next(ares__slist_node_t *node);
/*! Fetch previous node in SkipList
- *
+ *
* \param[in] node SkipList Node Object
* \return SkipList Node Object or NULL if none
*/
ares__slist_node_t *ares__slist_node_prev(ares__slist_node_t *node);
/*! Fetch SkipList Node Object by Value
- *
+ *
* \param[in] list Initialized SkipList Object
* \param[in] val Object to use for comparison
* \return SkipList Node Object or NULL if not found
@@ -139,58 +139,67 @@ ares__slist_node_t *ares__slist_node_find(ares__slist_t *list, const void *val);
/*! Fetch Node Value
- *
+ *
* \param[in] node SkipList Node Object
* \return user defined node value
*/
-void *ares__slist_node_val(ares__slist_node_t *node);
+void *ares__slist_node_val(ares__slist_node_t *node);
/*! Fetch number of entries in SkipList Object
- *
+ *
* \param[in] list Initialized SkipList Object
* \return number of entries
*/
-size_t ares__slist_len(ares__slist_t *list);
+size_t ares__slist_len(const ares__slist_t *list);
-/*! Fetch SkipList Object from SkipList Node
- *
+/*! Fetch SkipList Object from SkipList Node
+ *
* \param[in] node SkipList Node Object
* \return SkipList Object
*/
-ares__slist_t *ares__slist_node_parent(ares__slist_node_t *node);
+ares__slist_t *ares__slist_node_parent(ares__slist_node_t *node);
/*! Fetch first Node Value in SkipList
- *
+ *
* \param[in] list Initialized SkipList Object
* \return user defined node value or NULL if none
*/
-void *ares__slist_first_val(ares__slist_t *list);
+void *ares__slist_first_val(ares__slist_t *list);
/*! Fetch last Node Value in SkipList
- *
+ *
* \param[in] list Initialized SkipList Object
* \return user defined node value or NULL if none
*/
-void *ares__slist_last_val(ares__slist_t *list);
+void *ares__slist_last_val(ares__slist_t *list);
/*! Take back ownership of Node Value in SkipList, remove from SkipList.
- *
+ *
* \param[in] node SkipList Node Object
* \return user defined node value
*/
-void *ares__slist_node_claim(ares__slist_node_t *node);
+void *ares__slist_node_claim(ares__slist_node_t *node);
+
+/*! The internals of the node have changed, thus its position in the sorted
+ * list is no longer valid. This function will remove it and re-add it to
+ * the proper position without needing to perform any memory allocations
+ * and thus cannot fail.
+ *
+ * \param[in] node SkipList Node Object
+ */
+void ares__slist_node_reinsert(ares__slist_node_t *node);
/*! Remove Node from SkipList, calling destructor for Node Value.
- *
+ *
* \param[in] node SkipList Node Object
*/
-void ares__slist_node_destroy(ares__slist_node_t *node);
+void ares__slist_node_destroy(ares__slist_node_t *node);
/*! Destroy SkipList Object. If there are any nodes, they will be destroyed.
- *
+ *
* \param[in] list Initialized SkipList Object
*/
-void ares__slist_destroy(ares__slist_t *list);
+void ares__slist_destroy(ares__slist_t *list);
/*! @} */
diff --git a/contrib/libs/c-ares/src/lib/ares__socket.c b/contrib/libs/c-ares/src/lib/ares__socket.c
new file mode 100644
index 0000000000..da03755a50
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares__socket.c
@@ -0,0 +1,480 @@
+/* MIT License
+ *
+ * Copyright (c) Massachusetts Institute of Technology
+ * Copyright (c) The c-ares project and its contributors
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#include "ares_setup.h"
+
+#ifdef HAVE_SYS_UIO_H
+# include <sys/uio.h>
+#endif
+#ifdef HAVE_NETINET_IN_H
+# include <netinet/in.h>
+#endif
+#ifdef HAVE_NETINET_TCP_H
+# include <netinet/tcp.h>
+#endif
+#ifdef HAVE_NETDB_H
+# include <netdb.h>
+#endif
+#ifdef HAVE_ARPA_INET_H
+# include <arpa/inet.h>
+#endif
+
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_SYS_IOCTL_H
+# include <sys/ioctl.h>
+#endif
+#ifdef NETWARE
+# include <sys/filio.h>
+#endif
+
+#include <assert.h>
+#include <fcntl.h>
+#include <limits.h>
+
+#include "ares.h"
+#include "ares_private.h"
+
+ares_ssize_t ares__socket_recvfrom(ares_channel_t *channel, ares_socket_t s,
+ void *data, size_t data_len, int flags,
+ struct sockaddr *from,
+ ares_socklen_t *from_len)
+{
+ if (channel->sock_funcs && channel->sock_funcs->arecvfrom) {
+ return channel->sock_funcs->arecvfrom(s, data, data_len, flags, from,
+ from_len, channel->sock_func_cb_data);
+ }
+
+#ifdef HAVE_RECVFROM
+ return (ares_ssize_t)recvfrom(s, data, (RECVFROM_TYPE_ARG3)data_len, flags,
+ from, from_len);
+#else
+ return sread(s, data, data_len);
+#endif
+}
+
+ares_ssize_t ares__socket_recv(ares_channel_t *channel, ares_socket_t s,
+ void *data, size_t data_len)
+{
+ if (channel->sock_funcs && channel->sock_funcs->arecvfrom) {
+ return channel->sock_funcs->arecvfrom(s, data, data_len, 0, 0, 0,
+ channel->sock_func_cb_data);
+ }
+
+ /* sread() is a wrapper for read() or recv() depending on the system */
+ return sread(s, data, data_len);
+}
+
+/*
+ * setsocknonblock sets the given socket to either blocking or non-blocking
+ * mode based on the 'nonblock' boolean argument. This function is highly
+ * portable.
+ */
+static int setsocknonblock(ares_socket_t sockfd, /* operate on this */
+ int nonblock /* TRUE or FALSE */)
+{
+#if defined(USE_BLOCKING_SOCKETS)
+
+ return 0; /* returns success */
+
+#elif defined(HAVE_FCNTL_O_NONBLOCK)
+
+ /* most recent unix versions */
+ int flags;
+ flags = fcntl(sockfd, F_GETFL, 0);
+ if (nonblock) {
+ return fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
+ } else {
+ return fcntl(sockfd, F_SETFL, flags & (~O_NONBLOCK)); /* LCOV_EXCL_LINE */
+ }
+
+#elif defined(HAVE_IOCTL_FIONBIO)
+
+ /* older unix versions */
+ int flags = nonblock ? 1 : 0;
+ return ioctl(sockfd, FIONBIO, &flags);
+
+#elif defined(HAVE_IOCTLSOCKET_FIONBIO)
+
+# ifdef WATT32
+ char flags = nonblock ? 1 : 0;
+# else
+ /* Windows */
+ unsigned long flags = nonblock ? 1UL : 0UL;
+# endif
+ return ioctlsocket(sockfd, (long)FIONBIO, &flags);
+
+#elif defined(HAVE_IOCTLSOCKET_CAMEL_FIONBIO)
+
+ /* Amiga */
+ long flags = nonblock ? 1L : 0L;
+ return IoctlSocket(sockfd, FIONBIO, flags);
+
+#elif defined(HAVE_SETSOCKOPT_SO_NONBLOCK)
+
+ /* BeOS */
+ long b = nonblock ? 1L : 0L;
+ return setsockopt(sockfd, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b));
+
+#else
+# error "no non-blocking method was found/used/set"
+#endif
+}
+
+#if defined(IPV6_V6ONLY) && defined(WIN32)
+/* It makes support for IPv4-mapped IPv6 addresses.
+ * Linux kernel, NetBSD, FreeBSD and Darwin: default is off;
+ * Windows Vista and later: default is on;
+ * DragonFly BSD: acts like off, and dummy setting;
+ * OpenBSD and earlier Windows: unsupported.
+ * Linux: controlled by /proc/sys/net/ipv6/bindv6only.
+ */
+static void set_ipv6_v6only(ares_socket_t sockfd, int on)
+{
+ (void)setsockopt(sockfd, IPPROTO_IPV6, IPV6_V6ONLY, (void *)&on, sizeof(on));
+}
+#else
+# define set_ipv6_v6only(s, v)
+#endif
+
+static int configure_socket(ares_socket_t s, struct server_state *server)
+{
+ union {
+ struct sockaddr sa;
+ struct sockaddr_in sa4;
+ struct sockaddr_in6 sa6;
+ } local;
+
+ ares_socklen_t bindlen = 0;
+ ares_channel_t *channel = server->channel;
+
+ /* do not set options for user-managed sockets */
+ if (channel->sock_funcs && channel->sock_funcs->asocket) {
+ return 0;
+ }
+
+ (void)setsocknonblock(s, 1);
+
+#if defined(FD_CLOEXEC) && !defined(MSDOS)
+ /* Configure the socket fd as close-on-exec. */
+ if (fcntl(s, F_SETFD, FD_CLOEXEC) == -1) {
+ return -1; /* LCOV_EXCL_LINE */
+ }
+#endif
+
+ /* Set the socket's send and receive buffer sizes. */
+ if ((channel->socket_send_buffer_size > 0) &&
+ setsockopt(s, SOL_SOCKET, SO_SNDBUF,
+ (void *)&channel->socket_send_buffer_size,
+ sizeof(channel->socket_send_buffer_size)) == -1) {
+ return -1;
+ }
+
+ if ((channel->socket_receive_buffer_size > 0) &&
+ setsockopt(s, SOL_SOCKET, SO_RCVBUF,
+ (void *)&channel->socket_receive_buffer_size,
+ sizeof(channel->socket_receive_buffer_size)) == -1) {
+ return -1;
+ }
+
+#ifdef SO_BINDTODEVICE
+ if (channel->local_dev_name[0] &&
+ setsockopt(s, SOL_SOCKET, SO_BINDTODEVICE, channel->local_dev_name,
+ sizeof(channel->local_dev_name))) {
+ /* Only root can do this, and usually not fatal if it doesn't work, so */
+ /* just continue on. */
+ }
+#endif
+
+ if (server->addr.family == AF_INET && channel->local_ip4) {
+ memset(&local.sa4, 0, sizeof(local.sa4));
+ local.sa4.sin_family = AF_INET;
+ local.sa4.sin_addr.s_addr = htonl(channel->local_ip4);
+ bindlen = sizeof(local.sa4);
+ } else if (server->addr.family == AF_INET6 && server->ll_scope == 0 &&
+ memcmp(channel->local_ip6, ares_in6addr_any._S6_un._S6_u8,
+ sizeof(channel->local_ip6)) != 0) {
+ /* Only if not link-local and an ip other than "::" is specified */
+ memset(&local.sa6, 0, sizeof(local.sa6));
+ local.sa6.sin6_family = AF_INET6;
+ memcpy(&local.sa6.sin6_addr, channel->local_ip6,
+ sizeof(channel->local_ip6));
+ bindlen = sizeof(local.sa6);
+ }
+
+ if (bindlen && bind(s, &local.sa, bindlen) < 0) {
+ return -1;
+ }
+
+ if (server->addr.family == AF_INET6) {
+ set_ipv6_v6only(s, 0);
+ }
+
+ return 0;
+}
+
+ares_status_t ares__open_connection(ares_channel_t *channel,
+ struct server_state *server,
+ ares_bool_t is_tcp)
+{
+ ares_socket_t s;
+ int opt;
+ ares_socklen_t salen;
+
+ union {
+ struct sockaddr_in sa4;
+ struct sockaddr_in6 sa6;
+ } saddr;
+ struct sockaddr *sa;
+ struct server_connection *conn;
+ ares__llist_node_t *node;
+ int type = is_tcp ? SOCK_STREAM : SOCK_DGRAM;
+#ifdef __OpenBSD__
+ if ((is_tcp && server->tcp_port == 53) ||
+ (!is_tcp && server->udp_port == 53)) {
+ type |= SOCK_DNS;
+ }
+#endif
+
+ switch (server->addr.family) {
+ case AF_INET:
+ sa = (void *)&saddr.sa4;
+ salen = sizeof(saddr.sa4);
+ memset(sa, 0, (size_t)salen);
+ saddr.sa4.sin_family = AF_INET;
+ saddr.sa4.sin_port = htons(is_tcp ? server->tcp_port : server->udp_port);
+ memcpy(&saddr.sa4.sin_addr, &server->addr.addr.addr4,
+ sizeof(saddr.sa4.sin_addr));
+ break;
+ case AF_INET6:
+ sa = (void *)&saddr.sa6;
+ salen = sizeof(saddr.sa6);
+ memset(sa, 0, (size_t)salen);
+ saddr.sa6.sin6_family = AF_INET6;
+ saddr.sa6.sin6_port = htons(is_tcp ? server->tcp_port : server->udp_port);
+ memcpy(&saddr.sa6.sin6_addr, &server->addr.addr.addr6,
+ sizeof(saddr.sa6.sin6_addr));
+#ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID
+ saddr.sa6.sin6_scope_id = server->ll_scope;
+#endif
+ break;
+ default:
+ return ARES_EBADFAMILY; /* LCOV_EXCL_LINE */
+ }
+
+ /* Acquire a socket. */
+ s = ares__open_socket(channel, server->addr.family, type, 0);
+ if (s == ARES_SOCKET_BAD) {
+ return ARES_ECONNREFUSED;
+ }
+
+ /* Configure it. */
+ if (configure_socket(s, server) < 0) {
+ ares__close_socket(channel, s);
+ return ARES_ECONNREFUSED;
+ }
+
+#ifdef TCP_NODELAY
+ if (is_tcp) {
+ /*
+ * Disable the Nagle algorithm (only relevant for TCP sockets, and thus not
+ * in configure_socket). In general, in DNS lookups we're pretty much
+ * interested in firing off a single request and then waiting for a reply,
+ * so batching isn't very interesting.
+ */
+ opt = 1;
+ if ((!channel->sock_funcs || !channel->sock_funcs->asocket) &&
+ setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (void *)&opt, sizeof(opt)) ==
+ -1) {
+ ares__close_socket(channel, s);
+ return ARES_ECONNREFUSED;
+ }
+ }
+#endif
+
+ if (channel->sock_config_cb) {
+ int err = channel->sock_config_cb(s, type, channel->sock_config_cb_data);
+ if (err < 0) {
+ ares__close_socket(channel, s);
+ return ARES_ECONNREFUSED;
+ }
+ }
+
+ /* Connect to the server. */
+ if (ares__connect_socket(channel, s, sa, salen) == -1) {
+ int err = SOCKERRNO;
+
+ if (err != EINPROGRESS && err != EWOULDBLOCK) {
+ ares__close_socket(channel, s);
+ return ARES_ECONNREFUSED;
+ }
+ }
+
+ if (channel->sock_create_cb) {
+ int err = channel->sock_create_cb(s, type, channel->sock_create_cb_data);
+ if (err < 0) {
+ ares__close_socket(channel, s);
+ return ARES_ECONNREFUSED;
+ }
+ }
+
+ conn = ares_malloc(sizeof(*conn));
+ if (conn == NULL) {
+ ares__close_socket(channel, s);
+ return ARES_ENOMEM;
+ }
+ memset(conn, 0, sizeof(*conn));
+ conn->fd = s;
+ conn->server = server;
+ conn->queries_to_conn = ares__llist_create(NULL);
+ conn->is_tcp = is_tcp;
+ if (conn->queries_to_conn == NULL) {
+ ares__close_socket(channel, s);
+ ares_free(conn);
+ return ARES_ENOMEM;
+ }
+
+ /* TCP connections are thrown to the end as we don't spawn multiple TCP
+ * connections. UDP connections are put on front where the newest connection
+ * can be quickly pulled */
+ if (is_tcp) {
+ node = ares__llist_insert_last(server->connections, conn);
+ } else {
+ node = ares__llist_insert_first(server->connections, conn);
+ }
+ if (node == NULL) {
+ ares__close_socket(channel, s);
+ ares__llist_destroy(conn->queries_to_conn);
+ ares_free(conn);
+ return ARES_ENOMEM;
+ }
+
+ /* Register globally to quickly map event on file descriptor to connection
+ * node object */
+ if (!ares__htable_asvp_insert(channel->connnode_by_socket, s, node)) {
+ ares__close_socket(channel, s);
+ ares__llist_destroy(conn->queries_to_conn);
+ ares__llist_node_claim(node);
+ ares_free(conn);
+ return ARES_ENOMEM;
+ }
+
+ SOCK_STATE_CALLBACK(channel, s, 1, 0);
+
+ if (is_tcp) {
+ server->tcp_conn = conn;
+ }
+
+ return ARES_SUCCESS;
+}
+
+ares_socket_t ares__open_socket(ares_channel_t *channel, int af, int type,
+ int protocol)
+{
+ if (channel->sock_funcs && channel->sock_funcs->asocket) {
+ return channel->sock_funcs->asocket(af, type, protocol,
+ channel->sock_func_cb_data);
+ }
+
+ return socket(af, type, protocol);
+}
+
+int ares__connect_socket(ares_channel_t *channel, ares_socket_t sockfd,
+ const struct sockaddr *addr, ares_socklen_t addrlen)
+{
+ if (channel->sock_funcs && channel->sock_funcs->aconnect) {
+ return channel->sock_funcs->aconnect(sockfd, addr, addrlen,
+ channel->sock_func_cb_data);
+ }
+
+ return connect(sockfd, addr, addrlen);
+}
+
+void ares__close_socket(ares_channel_t *channel, ares_socket_t s)
+{
+ if (s == ARES_SOCKET_BAD) {
+ return;
+ }
+
+ if (channel->sock_funcs && channel->sock_funcs->aclose) {
+ channel->sock_funcs->aclose(s, channel->sock_func_cb_data);
+ } else {
+ sclose(s);
+ }
+}
+
+#ifndef HAVE_WRITEV
+/* Structure for scatter/gather I/O. */
+struct iovec {
+ void *iov_base; /* Pointer to data. */
+ size_t iov_len; /* Length of data. */
+};
+#endif
+
+ares_ssize_t ares__socket_write(ares_channel_t *channel, ares_socket_t s,
+ const void *data, size_t len)
+{
+ if (channel->sock_funcs && channel->sock_funcs->asendv) {
+ struct iovec vec;
+ vec.iov_base = (void *)((size_t)data); /* Cast off const */
+ vec.iov_len = len;
+ return channel->sock_funcs->asendv(s, &vec, 1, channel->sock_func_cb_data);
+ }
+ return swrite(s, data, len);
+}
+
+void ares_set_socket_callback(ares_channel_t *channel,
+ ares_sock_create_callback cb, void *data)
+{
+ if (channel == NULL) {
+ return;
+ }
+ channel->sock_create_cb = cb;
+ channel->sock_create_cb_data = data;
+}
+
+void ares_set_socket_configure_callback(ares_channel_t *channel,
+ ares_sock_config_callback cb,
+ void *data)
+{
+ if (channel == NULL || channel->optmask & ARES_OPT_EVENT_THREAD) {
+ return;
+ }
+ channel->sock_config_cb = cb;
+ channel->sock_config_cb_data = data;
+}
+
+void ares_set_socket_functions(ares_channel_t *channel,
+ const struct ares_socket_functions *funcs,
+ void *data)
+{
+ if (channel == NULL || channel->optmask & ARES_OPT_EVENT_THREAD) {
+ return;
+ }
+ channel->sock_funcs = funcs;
+ channel->sock_func_cb_data = data;
+}
diff --git a/contrib/libs/c-ares/src/lib/ares__sortaddrinfo.c b/contrib/libs/c-ares/src/lib/ares__sortaddrinfo.c
index 78d8891614..155cc8caf4 100644
--- a/contrib/libs/c-ares/src/lib/ares__sortaddrinfo.c
+++ b/contrib/libs/c-ares/src/lib/ares__sortaddrinfo.c
@@ -54,151 +54,118 @@
#include "ares.h"
#include "ares_private.h"
-struct addrinfo_sort_elem
-{
+struct addrinfo_sort_elem {
struct ares_addrinfo_node *ai;
- int has_src_addr;
- ares_sockaddr src_addr;
- int original_order;
+ ares_bool_t has_src_addr;
+ ares_sockaddr src_addr;
+ size_t original_order;
};
#define ARES_IPV6_ADDR_MC_SCOPE(a) ((a)->s6_addr[1] & 0x0f)
-#define ARES_IPV6_ADDR_SCOPE_NODELOCAL 0x01
-#define ARES_IPV6_ADDR_SCOPE_INTFACELOCAL 0x01
-#define ARES_IPV6_ADDR_SCOPE_LINKLOCAL 0x02
-#define ARES_IPV6_ADDR_SCOPE_SITELOCAL 0x05
-#define ARES_IPV6_ADDR_SCOPE_ORGLOCAL 0x08
-#define ARES_IPV6_ADDR_SCOPE_GLOBAL 0x0e
+#define ARES_IPV6_ADDR_SCOPE_NODELOCAL 0x01
+#define ARES_IPV6_ADDR_SCOPE_INTFACELOCAL 0x01
+#define ARES_IPV6_ADDR_SCOPE_LINKLOCAL 0x02
+#define ARES_IPV6_ADDR_SCOPE_SITELOCAL 0x05
+#define ARES_IPV6_ADDR_SCOPE_ORGLOCAL 0x08
+#define ARES_IPV6_ADDR_SCOPE_GLOBAL 0x0e
-#define ARES_IN_LOOPBACK(a) ((((long int)(a)) & 0xff000000) == 0x7f000000)
+#define ARES_IN_LOOPBACK(a) \
+ ((((long unsigned int)(a)) & 0xff000000) == 0x7f000000)
/* RFC 4193. */
#define ARES_IN6_IS_ADDR_ULA(a) (((a)->s6_addr[0] & 0xfe) == 0xfc)
/* These macros are modelled after the ones in <netinet/in6.h>. */
/* RFC 4380, section 2.6 */
-#define ARES_IN6_IS_ADDR_TEREDO(a) \
- ((*(const unsigned int *)(const void *)(&(a)->s6_addr[0]) == ntohl(0x20010000)))
+#define ARES_IN6_IS_ADDR_TEREDO(a) \
+ ((*(const unsigned int *)(const void *)(&(a)->s6_addr[0]) == \
+ ntohl(0x20010000)))
/* RFC 3056, section 2. */
-#define ARES_IN6_IS_ADDR_6TO4(a) \
- (((a)->s6_addr[0] == 0x20) && ((a)->s6_addr[1] == 0x02))
+#define ARES_IN6_IS_ADDR_6TO4(a) \
+ (((a)->s6_addr[0] == 0x20) && ((a)->s6_addr[1] == 0x02))
/* 6bone testing address area (3ffe::/16), deprecated in RFC 3701. */
-#define ARES_IN6_IS_ADDR_6BONE(a) \
- (((a)->s6_addr[0] == 0x3f) && ((a)->s6_addr[1] == 0xfe))
-
+#define ARES_IN6_IS_ADDR_6BONE(a) \
+ (((a)->s6_addr[0] == 0x3f) && ((a)->s6_addr[1] == 0xfe))
static int get_scope(const struct sockaddr *addr)
{
- if (addr->sa_family == AF_INET6)
- {
- const struct sockaddr_in6 *addr6 = CARES_INADDR_CAST(const struct sockaddr_in6 *, addr);
- if (IN6_IS_ADDR_MULTICAST(&addr6->sin6_addr))
- {
- return ARES_IPV6_ADDR_MC_SCOPE(&addr6->sin6_addr);
- }
- else if (IN6_IS_ADDR_LOOPBACK(&addr6->sin6_addr) ||
- IN6_IS_ADDR_LINKLOCAL(&addr6->sin6_addr))
- {
- /*
- * RFC 4291 section 2.5.3 says loopback is to be treated as having
- * link-local scope.
- */
- return ARES_IPV6_ADDR_SCOPE_LINKLOCAL;
- }
- else if (IN6_IS_ADDR_SITELOCAL(&addr6->sin6_addr))
- {
- return ARES_IPV6_ADDR_SCOPE_SITELOCAL;
- }
- else
- {
- return ARES_IPV6_ADDR_SCOPE_GLOBAL;
- }
- }
- else if (addr->sa_family == AF_INET)
- {
- const struct sockaddr_in *addr4 = CARES_INADDR_CAST(const struct sockaddr_in *, addr);
- unsigned long int na = ntohl(addr4->sin_addr.s_addr);
- if (ARES_IN_LOOPBACK(na) || /* 127.0.0.0/8 */
- (na & 0xffff0000) == 0xa9fe0000) /* 169.254.0.0/16 */
- {
- return ARES_IPV6_ADDR_SCOPE_LINKLOCAL;
- }
- else
- {
- /*
- * RFC 6724 section 3.2. Other IPv4 addresses, including private
- * addresses and shared addresses (100.64.0.0/10), are assigned global
- * scope.
- */
- return ARES_IPV6_ADDR_SCOPE_GLOBAL;
- }
+ if (addr->sa_family == AF_INET6) {
+ const struct sockaddr_in6 *addr6 =
+ CARES_INADDR_CAST(const struct sockaddr_in6 *, addr);
+ if (IN6_IS_ADDR_MULTICAST(&addr6->sin6_addr)) {
+ return ARES_IPV6_ADDR_MC_SCOPE(&addr6->sin6_addr);
+ } else if (IN6_IS_ADDR_LOOPBACK(&addr6->sin6_addr) ||
+ IN6_IS_ADDR_LINKLOCAL(&addr6->sin6_addr)) {
+ /*
+ * RFC 4291 section 2.5.3 says loopback is to be treated as having
+ * link-local scope.
+ */
+ return ARES_IPV6_ADDR_SCOPE_LINKLOCAL;
+ } else if (IN6_IS_ADDR_SITELOCAL(&addr6->sin6_addr)) {
+ return ARES_IPV6_ADDR_SCOPE_SITELOCAL;
+ } else {
+ return ARES_IPV6_ADDR_SCOPE_GLOBAL;
}
- else
+ } else if (addr->sa_family == AF_INET) {
+ const struct sockaddr_in *addr4 =
+ CARES_INADDR_CAST(const struct sockaddr_in *, addr);
+ unsigned long int na = ntohl(addr4->sin_addr.s_addr);
+ if (ARES_IN_LOOPBACK(na) || /* 127.0.0.0/8 */
+ (na & 0xffff0000) == 0xa9fe0000) /* 169.254.0.0/16 */
{
+ return ARES_IPV6_ADDR_SCOPE_LINKLOCAL;
+ } else {
/*
- * This should never happen.
- * Return a scope with low priority as a last resort.
+ * RFC 6724 section 3.2. Other IPv4 addresses, including private
+ * addresses and shared addresses (100.64.0.0/10), are assigned global
+ * scope.
*/
- return ARES_IPV6_ADDR_SCOPE_NODELOCAL;
+ return ARES_IPV6_ADDR_SCOPE_GLOBAL;
}
+ } else {
+ /*
+ * This should never happen.
+ * Return a scope with low priority as a last resort.
+ */
+ return ARES_IPV6_ADDR_SCOPE_NODELOCAL;
+ }
}
static int get_label(const struct sockaddr *addr)
{
- if (addr->sa_family == AF_INET)
- {
+ if (addr->sa_family == AF_INET) {
+ return 4;
+ } else if (addr->sa_family == AF_INET6) {
+ const struct sockaddr_in6 *addr6 =
+ CARES_INADDR_CAST(const struct sockaddr_in6 *, addr);
+ if (IN6_IS_ADDR_LOOPBACK(&addr6->sin6_addr)) {
+ return 0;
+ } else if (IN6_IS_ADDR_V4MAPPED(&addr6->sin6_addr)) {
return 4;
- }
- else if (addr->sa_family == AF_INET6)
- {
- const struct sockaddr_in6 *addr6 = CARES_INADDR_CAST(const struct sockaddr_in6 *, addr);
- if (IN6_IS_ADDR_LOOPBACK(&addr6->sin6_addr))
- {
- return 0;
- }
- else if (IN6_IS_ADDR_V4MAPPED(&addr6->sin6_addr))
- {
- return 4;
- }
- else if (ARES_IN6_IS_ADDR_6TO4(&addr6->sin6_addr))
- {
- return 2;
- }
- else if (ARES_IN6_IS_ADDR_TEREDO(&addr6->sin6_addr))
- {
- return 5;
- }
- else if (ARES_IN6_IS_ADDR_ULA(&addr6->sin6_addr))
- {
- return 13;
- }
- else if (IN6_IS_ADDR_V4COMPAT(&addr6->sin6_addr))
- {
- return 3;
- }
- else if (IN6_IS_ADDR_SITELOCAL(&addr6->sin6_addr))
- {
- return 11;
- }
- else if (ARES_IN6_IS_ADDR_6BONE(&addr6->sin6_addr))
- {
- return 12;
- }
- else
- {
- /* All other IPv6 addresses, including global unicast addresses. */
- return 1;
- }
- }
- else
- {
- /*
- * This should never happen.
- * Return a semi-random label as a last resort.
- */
+ } else if (ARES_IN6_IS_ADDR_6TO4(&addr6->sin6_addr)) {
+ return 2;
+ } else if (ARES_IN6_IS_ADDR_TEREDO(&addr6->sin6_addr)) {
+ return 5;
+ } else if (ARES_IN6_IS_ADDR_ULA(&addr6->sin6_addr)) {
+ return 13;
+ } else if (IN6_IS_ADDR_V4COMPAT(&addr6->sin6_addr)) {
+ return 3;
+ } else if (IN6_IS_ADDR_SITELOCAL(&addr6->sin6_addr)) {
+ return 11;
+ } else if (ARES_IN6_IS_ADDR_6BONE(&addr6->sin6_addr)) {
+ return 12;
+ } else {
+ /* All other IPv6 addresses, including global unicast addresses. */
return 1;
}
+ } else {
+ /*
+ * This should never happen.
+ * Return a semi-random label as a last resort.
+ */
+ return 1;
+ }
}
/*
@@ -207,77 +174,57 @@ static int get_label(const struct sockaddr *addr)
*/
static int get_precedence(const struct sockaddr *addr)
{
- if (addr->sa_family == AF_INET)
- {
+ if (addr->sa_family == AF_INET) {
+ return 35;
+ } else if (addr->sa_family == AF_INET6) {
+ const struct sockaddr_in6 *addr6 =
+ CARES_INADDR_CAST(const struct sockaddr_in6 *, addr);
+ if (IN6_IS_ADDR_LOOPBACK(&addr6->sin6_addr)) {
+ return 50;
+ } else if (IN6_IS_ADDR_V4MAPPED(&addr6->sin6_addr)) {
return 35;
- }
- else if (addr->sa_family == AF_INET6)
- {
- const struct sockaddr_in6 *addr6 = CARES_INADDR_CAST(const struct sockaddr_in6 *, addr);
- if (IN6_IS_ADDR_LOOPBACK(&addr6->sin6_addr))
- {
- return 50;
- }
- else if (IN6_IS_ADDR_V4MAPPED(&addr6->sin6_addr))
- {
- return 35;
- }
- else if (ARES_IN6_IS_ADDR_6TO4(&addr6->sin6_addr))
- {
- return 30;
- }
- else if (ARES_IN6_IS_ADDR_TEREDO(&addr6->sin6_addr))
- {
- return 5;
- }
- else if (ARES_IN6_IS_ADDR_ULA(&addr6->sin6_addr))
- {
- return 3;
- }
- else if (IN6_IS_ADDR_V4COMPAT(&addr6->sin6_addr) ||
+ } else if (ARES_IN6_IS_ADDR_6TO4(&addr6->sin6_addr)) {
+ return 30;
+ } else if (ARES_IN6_IS_ADDR_TEREDO(&addr6->sin6_addr)) {
+ return 5;
+ } else if (ARES_IN6_IS_ADDR_ULA(&addr6->sin6_addr)) {
+ return 3;
+ } else if (IN6_IS_ADDR_V4COMPAT(&addr6->sin6_addr) ||
IN6_IS_ADDR_SITELOCAL(&addr6->sin6_addr) ||
- ARES_IN6_IS_ADDR_6BONE(&addr6->sin6_addr))
- {
- return 1;
- }
- else
- {
- /* All other IPv6 addresses, including global unicast addresses. */
- return 40;
- }
- }
- else
- {
+ ARES_IN6_IS_ADDR_6BONE(&addr6->sin6_addr)) {
return 1;
+ } else {
+ /* All other IPv6 addresses, including global unicast addresses. */
+ return 40;
}
+ } else {
+ return 1;
+ }
}
/*
* Find number of matching initial bits between the two addresses a1 and a2.
*/
-static int common_prefix_len(const struct in6_addr *a1,
- const struct in6_addr *a2)
+static size_t common_prefix_len(const struct in6_addr *a1,
+ const struct in6_addr *a2)
{
- const char *p1 = (const char *)a1;
- const char *p2 = (const char *)a2;
- unsigned i;
- for (i = 0; i < sizeof(*a1); ++i)
- {
- int x, j;
- if (p1[i] == p2[i])
- {
- continue;
- }
- x = p1[i] ^ p2[i];
- for (j = 0; j < CHAR_BIT; ++j)
- {
- if (x & (1 << (CHAR_BIT - 1)))
- {
- return i * CHAR_BIT + j;
- }
- x <<= 1;
- }
+ const unsigned char *p1 = (const unsigned char *)a1;
+ const unsigned char *p2 = (const unsigned char *)a2;
+ size_t i;
+ for (i = 0; i < sizeof(*a1); ++i) {
+ unsigned char x;
+ size_t j;
+ if (p1[i] == p2[i]) {
+ continue;
}
+ x = p1[i] ^ p2[i];
+ for (j = 0; j < CHAR_BIT; ++j) {
+ if (x & (1 << (CHAR_BIT - 1))) {
+ return i * CHAR_BIT + j;
+ }
+ x <<= 1;
+ }
+ }
return sizeof(*a1) * CHAR_BIT;
}
@@ -289,36 +236,46 @@ static int rfc6724_compare(const void *ptr1, const void *ptr2)
{
const struct addrinfo_sort_elem *a1 = (const struct addrinfo_sort_elem *)ptr1;
const struct addrinfo_sort_elem *a2 = (const struct addrinfo_sort_elem *)ptr2;
- int scope_src1, scope_dst1, scope_match1;
- int scope_src2, scope_dst2, scope_match2;
- int label_src1, label_dst1, label_match1;
- int label_src2, label_dst2, label_match2;
- int precedence1, precedence2;
- int prefixlen1, prefixlen2;
+ int scope_src1;
+ int scope_dst1;
+ int scope_match1;
+ int scope_src2;
+ int scope_dst2;
+ int scope_match2;
+ int label_src1;
+ int label_dst1;
+ int label_match1;
+ int label_src2;
+ int label_dst2;
+ int label_match2;
+ int precedence1;
+ int precedence2;
+ size_t prefixlen1;
+ size_t prefixlen2;
/* Rule 1: Avoid unusable destinations. */
- if (a1->has_src_addr != a2->has_src_addr)
- {
- return a2->has_src_addr - a1->has_src_addr;
- }
+ if (a1->has_src_addr != a2->has_src_addr) {
+ return ((int)a2->has_src_addr) - ((int)a1->has_src_addr);
+ }
/* Rule 2: Prefer matching scope. */
scope_src1 = ARES_IPV6_ADDR_SCOPE_NODELOCAL;
- if (a1->has_src_addr)
+ if (a1->has_src_addr) {
scope_src1 = get_scope(&a1->src_addr.sa);
- scope_dst1 = get_scope(a1->ai->ai_addr);
+ }
+ scope_dst1 = get_scope(a1->ai->ai_addr);
scope_match1 = (scope_src1 == scope_dst1);
scope_src2 = ARES_IPV6_ADDR_SCOPE_NODELOCAL;
- if (a2->has_src_addr)
+ if (a2->has_src_addr) {
scope_src2 = get_scope(&a2->src_addr.sa);
- scope_dst2 = get_scope(a2->ai->ai_addr);
+ }
+ scope_dst2 = get_scope(a2->ai->ai_addr);
scope_match2 = (scope_src2 == scope_dst2);
- if (scope_match1 != scope_match2)
- {
- return scope_match2 - scope_match1;
- }
+ if (scope_match1 != scope_match2) {
+ return scope_match2 - scope_match1;
+ }
/* Rule 3: Avoid deprecated addresses. */
@@ -326,81 +283,76 @@ static int rfc6724_compare(const void *ptr1, const void *ptr2)
/* Rule 5: Prefer matching label. */
label_src1 = 1;
- if (a1->has_src_addr)
+ if (a1->has_src_addr) {
label_src1 = get_label(&a1->src_addr.sa);
- label_dst1 = get_label(a1->ai->ai_addr);
+ }
+ label_dst1 = get_label(a1->ai->ai_addr);
label_match1 = (label_src1 == label_dst1);
label_src2 = 1;
- if (a2->has_src_addr)
+ if (a2->has_src_addr) {
label_src2 = get_label(&a2->src_addr.sa);
- label_dst2 = get_label(a2->ai->ai_addr);
+ }
+ label_dst2 = get_label(a2->ai->ai_addr);
label_match2 = (label_src2 == label_dst2);
- if (label_match1 != label_match2)
- {
- return label_match2 - label_match1;
- }
+ if (label_match1 != label_match2) {
+ return label_match2 - label_match1;
+ }
/* Rule 6: Prefer higher precedence. */
precedence1 = get_precedence(a1->ai->ai_addr);
precedence2 = get_precedence(a2->ai->ai_addr);
- if (precedence1 != precedence2)
- {
- return precedence2 - precedence1;
- }
+ if (precedence1 != precedence2) {
+ return precedence2 - precedence1;
+ }
/* Rule 7: Prefer native transport. */
/* Rule 8: Prefer smaller scope. */
- if (scope_dst1 != scope_dst2)
- {
- return scope_dst1 - scope_dst2;
- }
+ if (scope_dst1 != scope_dst2) {
+ return scope_dst1 - scope_dst2;
+ }
/* Rule 9: Use longest matching prefix. */
if (a1->has_src_addr && a1->ai->ai_addr->sa_family == AF_INET6 &&
- a2->has_src_addr && a2->ai->ai_addr->sa_family == AF_INET6)
- {
- const struct sockaddr_in6 *a1_src = &a1->src_addr.sa6;
- const struct sockaddr_in6 *a1_dst =
- CARES_INADDR_CAST(const struct sockaddr_in6 *, a1->ai->ai_addr);
- const struct sockaddr_in6 *a2_src = &a2->src_addr.sa6;
- const struct sockaddr_in6 *a2_dst =
- CARES_INADDR_CAST(const struct sockaddr_in6 *, a2->ai->ai_addr);
- prefixlen1 = common_prefix_len(&a1_src->sin6_addr, &a1_dst->sin6_addr);
- prefixlen2 = common_prefix_len(&a2_src->sin6_addr, &a2_dst->sin6_addr);
- if (prefixlen1 != prefixlen2)
- {
- return prefixlen2 - prefixlen1;
- }
+ a2->has_src_addr && a2->ai->ai_addr->sa_family == AF_INET6) {
+ const struct sockaddr_in6 *a1_src = &a1->src_addr.sa6;
+ const struct sockaddr_in6 *a1_dst =
+ CARES_INADDR_CAST(const struct sockaddr_in6 *, a1->ai->ai_addr);
+ const struct sockaddr_in6 *a2_src = &a2->src_addr.sa6;
+ const struct sockaddr_in6 *a2_dst =
+ CARES_INADDR_CAST(const struct sockaddr_in6 *, a2->ai->ai_addr);
+ prefixlen1 = common_prefix_len(&a1_src->sin6_addr, &a1_dst->sin6_addr);
+ prefixlen2 = common_prefix_len(&a2_src->sin6_addr, &a2_dst->sin6_addr);
+ if (prefixlen1 != prefixlen2) {
+ return (int)prefixlen2 - (int)prefixlen1;
}
+ }
/*
* Rule 10: Leave the order unchanged.
* We need this since qsort() is not necessarily stable.
*/
- return a1->original_order - a2->original_order;
+ return ((int)a1->original_order) - ((int)a2->original_order);
}
/*
* Find the source address that will be used if trying to connect to the given
* address.
*
- * Returns 1 if a source address was found, 0 if the address is unreachable,
+ * Returns 1 if a source address was found, 0 if the address is unreachable
* and -1 if a fatal error occurred. If 0 or 1, the contents of src_addr are
* undefined.
*/
-static int find_src_addr(ares_channel channel,
- const struct sockaddr *addr,
+static int find_src_addr(ares_channel_t *channel, const struct sockaddr *addr,
struct sockaddr *src_addr)
{
- ares_socket_t sock;
- int ret;
+ ares_socket_t sock;
+ int ret;
ares_socklen_t len;
- switch (addr->sa_family)
- {
+ switch (addr->sa_family) {
case AF_INET:
len = sizeof(struct sockaddr_in);
break;
@@ -410,38 +362,30 @@ static int find_src_addr(ares_channel channel,
default:
/* No known usable source address for non-INET families. */
return 0;
- }
+ }
sock = ares__open_socket(channel, addr->sa_family, SOCK_DGRAM, IPPROTO_UDP);
- if (sock == ARES_SOCKET_BAD)
- {
- if (errno == EAFNOSUPPORT)
- {
- return 0;
- }
- else
- {
- return -1;
- }
+ if (sock == ARES_SOCKET_BAD) {
+ if (errno == EAFNOSUPPORT) {
+ return 0;
+ } else {
+ return -1;
}
+ }
- do
- {
- ret = ares__connect_socket(channel, sock, addr, len);
- }
- while (ret == -1 && errno == EINTR);
+ do {
+ ret = ares__connect_socket(channel, sock, addr, len);
+ } while (ret == -1 && errno == EINTR);
- if (ret == -1)
- {
- ares__close_socket(channel, sock);
- return 0;
- }
+ if (ret == -1) {
+ ares__close_socket(channel, sock);
+ return 0;
+ }
- if (getsockname(sock, src_addr, &len) != 0)
- {
- ares__close_socket(channel, sock);
- return -1;
- }
+ if (getsockname(sock, src_addr, &len) != 0) {
+ ares__close_socket(channel, sock);
+ return -1;
+ }
ares__close_socket(channel, sock);
return 1;
}
@@ -450,47 +394,47 @@ static int find_src_addr(ares_channel channel,
* Sort the linked list starting at sentinel->ai_next in RFC6724 order.
* Will leave the list unchanged if an error occurs.
*/
-int ares__sortaddrinfo(ares_channel channel, struct ares_addrinfo_node *list_sentinel)
+ares_status_t ares__sortaddrinfo(ares_channel_t *channel,
+ struct ares_addrinfo_node *list_sentinel)
{
struct ares_addrinfo_node *cur;
- int nelem = 0, i;
- int has_src_addr;
+ size_t nelem = 0;
+ size_t i;
+ int has_src_addr;
struct addrinfo_sort_elem *elems;
cur = list_sentinel->ai_next;
- while (cur)
- {
- ++nelem;
- cur = cur->ai_next;
- }
+ while (cur) {
+ ++nelem;
+ cur = cur->ai_next;
+ }
- if (!nelem)
- return ARES_ENODATA;
+ if (!nelem) {
+ return ARES_ENODATA;
+ }
elems = (struct addrinfo_sort_elem *)ares_malloc(
- nelem * sizeof(struct addrinfo_sort_elem));
- if (!elems)
- {
- return ARES_ENOMEM;
- }
+ nelem * sizeof(struct addrinfo_sort_elem));
+ if (!elems) {
+ return ARES_ENOMEM;
+ }
/*
* Convert the linked list to an array that also contains the candidate
* source address for each destination address.
*/
- for (i = 0, cur = list_sentinel->ai_next; i < nelem; ++i, cur = cur->ai_next)
- {
- assert(cur != NULL);
- elems[i].ai = cur;
- elems[i].original_order = i;
- has_src_addr = find_src_addr(channel, cur->ai_addr, &elems[i].src_addr.sa);
- if (has_src_addr == -1)
- {
- ares_free(elems);
- return ARES_ENOTFOUND;
- }
- elems[i].has_src_addr = has_src_addr;
+ for (i = 0, cur = list_sentinel->ai_next; i < nelem;
+ ++i, cur = cur->ai_next) {
+ assert(cur != NULL);
+ elems[i].ai = cur;
+ elems[i].original_order = i;
+ has_src_addr = find_src_addr(channel, cur->ai_addr, &elems[i].src_addr.sa);
+ if (has_src_addr == -1) {
+ ares_free(elems);
+ return ARES_ENOTFOUND;
}
+ elems[i].has_src_addr = (has_src_addr == 1) ? ARES_TRUE : ARES_FALSE;
+ }
/* Sort the addresses, and rearrange the linked list so it matches the sorted
* order. */
@@ -498,10 +442,9 @@ int ares__sortaddrinfo(ares_channel channel, struct ares_addrinfo_node *list_sen
rfc6724_compare);
list_sentinel->ai_next = elems[0].ai;
- for (i = 0; i < nelem - 1; ++i)
- {
- elems[i].ai->ai_next = elems[i + 1].ai;
- }
+ for (i = 0; i < nelem - 1; ++i) {
+ elems[i].ai->ai_next = elems[i + 1].ai;
+ }
elems[nelem - 1].ai->ai_next = NULL;
ares_free(elems);
diff --git a/contrib/libs/c-ares/src/lib/ares__threads.c b/contrib/libs/c-ares/src/lib/ares__threads.c
new file mode 100644
index 0000000000..f6de8c698e
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares__threads.c
@@ -0,0 +1,607 @@
+/* MIT License
+ *
+ * Copyright (c) 2023 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#include "ares_setup.h"
+#include "ares.h"
+#include "ares_private.h"
+
+#ifdef CARES_THREADS
+# ifdef _WIN32
+
+struct ares__thread_mutex {
+ CRITICAL_SECTION mutex;
+};
+
+ares__thread_mutex_t *ares__thread_mutex_create(void)
+{
+ ares__thread_mutex_t *mut = ares_malloc_zero(sizeof(*mut));
+ if (mut == NULL) {
+ return NULL;
+ }
+
+ InitializeCriticalSection(&mut->mutex);
+ return mut;
+}
+
+void ares__thread_mutex_destroy(ares__thread_mutex_t *mut)
+{
+ if (mut == NULL) {
+ return;
+ }
+ DeleteCriticalSection(&mut->mutex);
+ ares_free(mut);
+}
+
+void ares__thread_mutex_lock(ares__thread_mutex_t *mut)
+{
+ if (mut == NULL) {
+ return;
+ }
+ EnterCriticalSection(&mut->mutex);
+}
+
+void ares__thread_mutex_unlock(ares__thread_mutex_t *mut)
+{
+ if (mut == NULL) {
+ return;
+ }
+ LeaveCriticalSection(&mut->mutex);
+}
+
+struct ares__thread_cond {
+ CONDITION_VARIABLE cond;
+};
+
+ares__thread_cond_t *ares__thread_cond_create(void)
+{
+ ares__thread_cond_t *cond = ares_malloc_zero(sizeof(*cond));
+ if (cond == NULL) {
+ return NULL;
+ }
+ InitializeConditionVariable(&cond->cond);
+ return cond;
+}
+
+void ares__thread_cond_destroy(ares__thread_cond_t *cond)
+{
+ if (cond == NULL) {
+ return;
+ }
+ ares_free(cond);
+}
+
+void ares__thread_cond_signal(ares__thread_cond_t *cond)
+{
+ if (cond == NULL) {
+ return;
+ }
+ WakeConditionVariable(&cond->cond);
+}
+
+void ares__thread_cond_broadcast(ares__thread_cond_t *cond)
+{
+ if (cond == NULL) {
+ return;
+ }
+ WakeAllConditionVariable(&cond->cond);
+}
+
+ares_status_t ares__thread_cond_wait(ares__thread_cond_t *cond,
+ ares__thread_mutex_t *mut)
+{
+ if (cond == NULL || mut == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ SleepConditionVariableCS(&cond->cond, &mut->mutex, INFINITE);
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares__thread_cond_timedwait(ares__thread_cond_t *cond,
+ ares__thread_mutex_t *mut,
+ unsigned long timeout_ms)
+{
+ if (cond == NULL || mut == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ if (!SleepConditionVariableCS(&cond->cond, &mut->mutex, timeout_ms)) {
+ return ARES_ETIMEOUT;
+ }
+
+ return ARES_SUCCESS;
+}
+
+struct ares__thread {
+ HANDLE thread;
+ DWORD id;
+
+ void *(*func)(void *arg);
+ void *arg;
+ void *rv;
+};
+
+/* Wrap for pthread compatibility */
+static DWORD WINAPI ares__thread_func(LPVOID lpParameter)
+{
+ ares__thread_t *thread = lpParameter;
+
+ thread->rv = thread->func(thread->arg);
+ return 0;
+}
+
+ares_status_t ares__thread_create(ares__thread_t **thread,
+ ares__thread_func_t func, void *arg)
+{
+ ares__thread_t *thr = NULL;
+
+ if (func == NULL || thread == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ thr = ares_malloc_zero(sizeof(*thr));
+ if (thr == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ thr->func = func;
+ thr->arg = arg;
+ thr->thread = CreateThread(NULL, 0, ares__thread_func, thr, 0, &thr->id);
+ if (thr->thread == NULL) {
+ ares_free(thr);
+ return ARES_ESERVFAIL;
+ }
+
+ *thread = thr;
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares__thread_join(ares__thread_t *thread, void **rv)
+{
+ ares_status_t status = ARES_SUCCESS;
+
+ if (thread == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ if (WaitForSingleObject(thread->thread, INFINITE) != WAIT_OBJECT_0) {
+ status = ARES_ENOTFOUND;
+ } else {
+ CloseHandle(thread->thread);
+ }
+
+ if (status == ARES_SUCCESS && rv != NULL) {
+ *rv = thread->rv;
+ }
+ ares_free(thread);
+
+ return status;
+}
+
+# else /* !WIN32 == PTHREAD */
+# include <pthread.h>
+
+/* for clock_gettime() */
+# ifdef HAVE_TIME_H
+# include <time.h>
+# endif
+
+/* for gettimeofday() */
+# ifdef HAVE_SYS_TIME_H
+# include <sys/time.h>
+# endif
+
+struct ares__thread_mutex {
+ pthread_mutex_t mutex;
+};
+
+ares__thread_mutex_t *ares__thread_mutex_create(void)
+{
+ pthread_mutexattr_t attr;
+ ares__thread_mutex_t *mut = ares_malloc_zero(sizeof(*mut));
+ if (mut == NULL) {
+ return NULL;
+ }
+
+ if (pthread_mutexattr_init(&attr) != 0) {
+ ares_free(mut);
+ return NULL;
+ }
+
+ if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE) != 0) {
+ goto fail;
+ }
+
+ if (pthread_mutex_init(&mut->mutex, &attr) != 0) {
+ goto fail;
+ }
+
+ pthread_mutexattr_destroy(&attr);
+ return mut;
+
+fail:
+ pthread_mutexattr_destroy(&attr);
+ ares_free(mut);
+ return NULL;
+}
+
+void ares__thread_mutex_destroy(ares__thread_mutex_t *mut)
+{
+ if (mut == NULL) {
+ return;
+ }
+ pthread_mutex_destroy(&mut->mutex);
+ ares_free(mut);
+}
+
+void ares__thread_mutex_lock(ares__thread_mutex_t *mut)
+{
+ if (mut == NULL) {
+ return;
+ }
+ pthread_mutex_lock(&mut->mutex);
+}
+
+void ares__thread_mutex_unlock(ares__thread_mutex_t *mut)
+{
+ if (mut == NULL) {
+ return;
+ }
+ pthread_mutex_unlock(&mut->mutex);
+}
+
+struct ares__thread_cond {
+ pthread_cond_t cond;
+};
+
+ares__thread_cond_t *ares__thread_cond_create(void)
+{
+ ares__thread_cond_t *cond = ares_malloc_zero(sizeof(*cond));
+ if (cond == NULL) {
+ return NULL;
+ }
+ pthread_cond_init(&cond->cond, NULL);
+ return cond;
+}
+
+void ares__thread_cond_destroy(ares__thread_cond_t *cond)
+{
+ if (cond == NULL) {
+ return;
+ }
+ pthread_cond_destroy(&cond->cond);
+ ares_free(cond);
+}
+
+void ares__thread_cond_signal(ares__thread_cond_t *cond)
+{
+ if (cond == NULL) {
+ return;
+ }
+ pthread_cond_signal(&cond->cond);
+}
+
+void ares__thread_cond_broadcast(ares__thread_cond_t *cond)
+{
+ if (cond == NULL) {
+ return;
+ }
+ pthread_cond_broadcast(&cond->cond);
+}
+
+ares_status_t ares__thread_cond_wait(ares__thread_cond_t *cond,
+ ares__thread_mutex_t *mut)
+{
+ if (cond == NULL || mut == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ pthread_cond_wait(&cond->cond, &mut->mutex);
+ return ARES_SUCCESS;
+}
+
+static void ares__timespec_timeout(struct timespec *ts, unsigned long add_ms)
+{
+# if defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_REALTIME)
+ clock_gettime(CLOCK_REALTIME, ts);
+# elif defined(HAVE_GETTIMEOFDAY)
+ struct timeval tv;
+ gettimeofday(&tv, NULL);
+ ts->tv_sec = tv.tv_sec;
+ ts->tv_nsec = tv.tv_usec * 1000;
+# else
+# error cannot determine current system time
+# endif
+
+ ts->tv_sec += (time_t)(add_ms / 1000);
+ ts->tv_nsec += (long)((add_ms % 1000) * 1000000);
+
+ /* Normalize if needed */
+ if (ts->tv_nsec >= 1000000000) {
+ ts->tv_sec += ts->tv_nsec / 1000000000;
+ ts->tv_nsec %= 1000000000;
+ }
+}
+
+ares_status_t ares__thread_cond_timedwait(ares__thread_cond_t *cond,
+ ares__thread_mutex_t *mut,
+ unsigned long timeout_ms)
+{
+ struct timespec ts;
+
+ if (cond == NULL || mut == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ ares__timespec_timeout(&ts, timeout_ms);
+
+ if (pthread_cond_timedwait(&cond->cond, &mut->mutex, &ts) != 0) {
+ return ARES_ETIMEOUT;
+ }
+
+ return ARES_SUCCESS;
+}
+
+struct ares__thread {
+ pthread_t thread;
+};
+
+ares_status_t ares__thread_create(ares__thread_t **thread,
+ ares__thread_func_t func, void *arg)
+{
+ ares__thread_t *thr = NULL;
+
+ if (func == NULL || thread == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ thr = ares_malloc_zero(sizeof(*thr));
+ if (thr == NULL) {
+ return ARES_ENOMEM;
+ }
+ if (pthread_create(&thr->thread, NULL, func, arg) != 0) {
+ ares_free(thr);
+ return ARES_ESERVFAIL;
+ }
+
+ *thread = thr;
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares__thread_join(ares__thread_t *thread, void **rv)
+{
+ void *ret = NULL;
+ ares_status_t status = ARES_SUCCESS;
+
+ if (thread == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ if (pthread_join(thread->thread, &ret) != 0) {
+ status = ARES_ENOTFOUND;
+ }
+ ares_free(thread);
+
+ if (status == ARES_SUCCESS && rv != NULL) {
+ *rv = ret;
+ }
+ return status;
+}
+
+# endif
+
+ares_bool_t ares_threadsafety(void)
+{
+ return ARES_TRUE;
+}
+
+#else /* !CARES_THREADS */
+
+/* NoOp */
+ares__thread_mutex_t *ares__thread_mutex_create(void)
+{
+ return NULL;
+}
+
+void ares__thread_mutex_destroy(ares__thread_mutex_t *mut)
+{
+ (void)mut;
+}
+
+void ares__thread_mutex_lock(ares__thread_mutex_t *mut)
+{
+ (void)mut;
+}
+
+void ares__thread_mutex_unlock(ares__thread_mutex_t *mut)
+{
+ (void)mut;
+}
+
+ares__thread_cond_t *ares__thread_cond_create(void)
+{
+ return NULL;
+}
+
+void ares__thread_cond_destroy(ares__thread_cond_t *cond)
+{
+ (void)cond;
+}
+
+void ares__thread_cond_signal(ares__thread_cond_t *cond)
+{
+ (void)cond;
+}
+
+void ares__thread_cond_broadcast(ares__thread_cond_t *cond)
+{
+ (void)cond;
+}
+
+ares_status_t ares__thread_cond_wait(ares__thread_cond_t *cond,
+ ares__thread_mutex_t *mut)
+{
+ (void)cond;
+ (void)mut;
+ return ARES_ENOTIMP;
+}
+
+ares_status_t ares__thread_cond_timedwait(ares__thread_cond_t *cond,
+ ares__thread_mutex_t *mut,
+ unsigned long timeout_ms)
+{
+ (void)cond;
+ (void)mut;
+ (void)timeout_ms;
+ return ARES_ENOTIMP;
+}
+
+ares_status_t ares__thread_create(ares__thread_t **thread,
+ ares__thread_func_t func, void *arg)
+{
+ (void)thread;
+ (void)func;
+ (void)arg;
+ return ARES_ENOTIMP;
+}
+
+ares_status_t ares__thread_join(ares__thread_t *thread, void **rv)
+{
+ (void)thread;
+ (void)rv;
+ return ARES_ENOTIMP;
+}
+
+ares_bool_t ares_threadsafety(void)
+{
+ return ARES_FALSE;
+}
+#endif
+
+
+ares_status_t ares__channel_threading_init(ares_channel_t *channel)
+{
+ ares_status_t status = ARES_SUCCESS;
+
+ /* Threading is optional! */
+ if (!ares_threadsafety()) {
+ return ARES_SUCCESS;
+ }
+
+ channel->lock = ares__thread_mutex_create();
+ if (channel->lock == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ channel->cond_empty = ares__thread_cond_create();
+ if (channel->cond_empty == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+done:
+ if (status != ARES_SUCCESS) {
+ ares__channel_threading_destroy(channel);
+ }
+ return status;
+}
+
+void ares__channel_threading_destroy(ares_channel_t *channel)
+{
+ ares__thread_mutex_destroy(channel->lock);
+ channel->lock = NULL;
+ ares__thread_cond_destroy(channel->cond_empty);
+ channel->cond_empty = NULL;
+}
+
+void ares__channel_lock(ares_channel_t *channel)
+{
+ ares__thread_mutex_lock(channel->lock);
+}
+
+void ares__channel_unlock(ares_channel_t *channel)
+{
+ ares__thread_mutex_unlock(channel->lock);
+}
+
+/* Must not be holding a channel lock already, public function only */
+ares_status_t ares_queue_wait_empty(ares_channel_t *channel, int timeout_ms)
+{
+ ares_status_t status = ARES_SUCCESS;
+ struct timeval tout;
+
+ if (!ares_threadsafety()) {
+ return ARES_ENOTIMP;
+ }
+
+ if (channel == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ if (timeout_ms >= 0) {
+ tout = ares__tvnow();
+ tout.tv_sec += timeout_ms / 1000;
+ tout.tv_usec += (timeout_ms % 1000) * 1000;
+ }
+
+ ares__thread_mutex_lock(channel->lock);
+ while (ares__llist_len(channel->all_queries)) {
+ if (timeout_ms < 0) {
+ ares__thread_cond_wait(channel->cond_empty, channel->lock);
+ } else {
+ struct timeval tv_remaining;
+ struct timeval tv_now = ares__tvnow();
+ unsigned long tms;
+
+ ares__timeval_remaining(&tv_remaining, &tv_now, &tout);
+ tms = (unsigned long)((tv_remaining.tv_sec * 1000) +
+ (tv_remaining.tv_usec / 1000));
+ if (tms == 0) {
+ status = ARES_ETIMEOUT;
+ } else {
+ status =
+ ares__thread_cond_timedwait(channel->cond_empty, channel->lock, tms);
+ }
+ }
+ }
+ ares__thread_mutex_unlock(channel->lock);
+ return status;
+}
+
+void ares_queue_notify_empty(ares_channel_t *channel)
+{
+ if (channel == NULL) {
+ return;
+ }
+
+ /* We are guaranteed to be holding a channel lock already */
+ if (ares__llist_len(channel->all_queries)) {
+ return;
+ }
+
+ /* Notify all waiters of the conditional */
+ ares__thread_cond_broadcast(channel->cond_empty);
+}
diff --git a/contrib/libs/c-ares/src/lib/ares__threads.h b/contrib/libs/c-ares/src/lib/ares__threads.h
new file mode 100644
index 0000000000..108354dfc1
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares__threads.h
@@ -0,0 +1,60 @@
+/* MIT License
+ *
+ * Copyright (c) 2023 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#ifndef __ARES__THREADS_H
+#define __ARES__THREADS_H
+
+struct ares__thread_mutex;
+typedef struct ares__thread_mutex ares__thread_mutex_t;
+
+ares__thread_mutex_t *ares__thread_mutex_create(void);
+void ares__thread_mutex_destroy(ares__thread_mutex_t *mut);
+void ares__thread_mutex_lock(ares__thread_mutex_t *mut);
+void ares__thread_mutex_unlock(ares__thread_mutex_t *mut);
+
+
+struct ares__thread_cond;
+typedef struct ares__thread_cond ares__thread_cond_t;
+
+ares__thread_cond_t *ares__thread_cond_create(void);
+void ares__thread_cond_destroy(ares__thread_cond_t *cond);
+void ares__thread_cond_signal(ares__thread_cond_t *cond);
+void ares__thread_cond_broadcast(ares__thread_cond_t *cond);
+ares_status_t ares__thread_cond_wait(ares__thread_cond_t *cond,
+ ares__thread_mutex_t *mut);
+ares_status_t ares__thread_cond_timedwait(ares__thread_cond_t *cond,
+ ares__thread_mutex_t *mut,
+ unsigned long timeout_ms);
+
+
+struct ares__thread;
+typedef struct ares__thread ares__thread_t;
+
+typedef void *(*ares__thread_func_t)(void *arg);
+ares_status_t ares__thread_create(ares__thread_t **thread,
+ ares__thread_func_t func, void *arg);
+ares_status_t ares__thread_join(ares__thread_t *thread, void **rv);
+
+#endif
diff --git a/contrib/libs/c-ares/src/lib/ares__timeval.c b/contrib/libs/c-ares/src/lib/ares__timeval.c
index 5716c53e50..11996f9f11 100644
--- a/contrib/libs/c-ares/src/lib/ares__timeval.c
+++ b/contrib/libs/c-ares/src/lib/ares__timeval.c
@@ -38,9 +38,9 @@ struct timeval ares__tvnow(void)
** increases monotonically and wraps once 49.7 days have elapsed.
*/
struct timeval now;
- DWORD milliseconds = GetTickCount();
- now.tv_sec = milliseconds / 1000;
- now.tv_usec = (milliseconds % 1000) * 1000;
+ DWORD milliseconds = GetTickCount();
+ now.tv_sec = (long)milliseconds / 1000;
+ now.tv_usec = (long)(milliseconds % 1000) * 1000;
return now;
}
@@ -55,26 +55,26 @@ struct timeval ares__tvnow(void)
** in any case the time starting point does not change once that the
** system has started up.
*/
- struct timeval now;
+ struct timeval now;
struct timespec tsnow;
- if(0 == clock_gettime(CLOCK_MONOTONIC, &tsnow)) {
- now.tv_sec = tsnow.tv_sec;
- now.tv_usec = tsnow.tv_nsec / 1000;
+ if (0 == clock_gettime(CLOCK_MONOTONIC, &tsnow)) {
+ now.tv_sec = tsnow.tv_sec;
+ now.tv_usec = (int)(tsnow.tv_nsec / 1000);
}
/*
** Even when the configure process has truly detected monotonic clock
** availability, it might happen that it is not actually available at
** run-time. When this occurs simply fallback to other time source.
*/
-#ifdef HAVE_GETTIMEOFDAY
+# ifdef HAVE_GETTIMEOFDAY
else
- (void)gettimeofday(&now, NULL); /* LCOV_EXCL_LINE */
-#else
+ (void)gettimeofday(&now, NULL); /* LCOV_EXCL_LINE */
+# else
else {
- now.tv_sec = (long)time(NULL);
+ now.tv_sec = (long)time(NULL);
now.tv_usec = 0;
}
-#endif
+# endif
return now;
}
@@ -100,24 +100,9 @@ struct timeval ares__tvnow(void)
** time() returns the value of time in seconds since the Epoch.
*/
struct timeval now;
- now.tv_sec = (long)time(NULL);
+ now.tv_sec = (long)time(NULL);
now.tv_usec = 0;
return now;
}
#endif
-
-#if 0 /* Not used */
-/*
- * Make sure that the first argument is the more recent time, as otherwise
- * we'll get a weird negative time-diff back...
- *
- * Returns: the time difference in number of milliseconds.
- */
-long ares__tvdiff(struct timeval newer, struct timeval older)
-{
- return (newer.tv_sec-older.tv_sec)*1000+
- (newer.tv_usec-older.tv_usec)/1000;
-}
-#endif
-
diff --git a/contrib/libs/c-ares/src/lib/ares_android.c b/contrib/libs/c-ares/src/lib/ares_android.c
index ec0a33872d..778d4d1060 100644
--- a/contrib/libs/c-ares/src/lib/ares_android.c
+++ b/contrib/libs/c-ares/src/lib/ares_android.c
@@ -25,15 +25,15 @@
*/
#if defined(ANDROID) || defined(__ANDROID__)
-#include <jni.h>
+# include <jni.h>
-#include "ares_setup.h"
-#include "ares.h"
-#include "ares_android.h"
-#include "ares_private.h"
+# include "ares_setup.h"
+# include "ares.h"
+# include "ares_android.h"
+# include "ares_private.h"
-static JavaVM *android_jvm = NULL;
-static jobject android_connectivity_manager = NULL;
+static JavaVM *android_jvm = NULL;
+static jobject android_connectivity_manager = NULL;
/* ConnectivityManager.getActiveNetwork */
static jmethodID android_cm_active_net_mid = NULL;
@@ -50,12 +50,13 @@ static jmethodID android_list_get_mid = NULL;
/* InetAddress.getHostAddress */
static jmethodID android_ia_host_addr_mid = NULL;
-static jclass jni_get_class(JNIEnv *env, const char *path)
+static jclass jni_get_class(JNIEnv *env, const char *path)
{
jclass cls = NULL;
- if (env == NULL || path == NULL || *path == '\0')
+ if (env == NULL || path == NULL || *path == '\0') {
return NULL;
+ }
cls = (*env)->FindClass(env, path);
if ((*env)->ExceptionOccurred(env)) {
@@ -71,14 +72,12 @@ static jmethodID jni_get_method_id(JNIEnv *env, jclass cls,
jmethodID mid = NULL;
if (env == NULL || cls == NULL || func_name == NULL || *func_name == '\0' ||
- signature == NULL || *signature == '\0')
- {
+ signature == NULL || *signature == '\0') {
return NULL;
}
mid = (*env)->GetMethodID(env, cls, func_name, signature);
- if ((*env)->ExceptionOccurred(env))
- {
+ if ((*env)->ExceptionOccurred(env)) {
(*env)->ExceptionClear(env);
return NULL;
}
@@ -93,29 +92,31 @@ void ares_library_init_jvm(JavaVM *jvm)
int ares_library_init_android(jobject connectivity_manager)
{
- JNIEnv *env = NULL;
- int need_detatch = 0;
- int res;
- int ret = ARES_ENOTINITIALIZED;
- jclass obj_cls = NULL;
+ JNIEnv *env = NULL;
+ int need_detatch = 0;
+ int res;
+ ares_status_t ret = ARES_ENOTINITIALIZED;
+ jclass obj_cls = NULL;
- if (android_jvm == NULL)
+ if (android_jvm == NULL) {
goto cleanup;
+ }
res = (*android_jvm)->GetEnv(android_jvm, (void **)&env, JNI_VERSION_1_6);
- if (res == JNI_EDETACHED)
- {
- env = NULL;
- res = (*android_jvm)->AttachCurrentThread(android_jvm, &env, NULL);
+ if (res == JNI_EDETACHED) {
+ env = NULL;
+ res = (*android_jvm)->AttachCurrentThread(android_jvm, &env, NULL);
need_detatch = 1;
}
- if (res != JNI_OK || env == NULL)
+ if (res != JNI_OK || env == NULL) {
goto cleanup;
+ }
android_connectivity_manager =
- (*env)->NewGlobalRef(env, connectivity_manager);
- if (android_connectivity_manager == NULL)
+ (*env)->NewGlobalRef(env, connectivity_manager);
+ if (android_connectivity_manager == NULL) {
goto cleanup;
+ }
/* Initialization has succeeded. Now attempt to cache the methods that will be
* called by ares_get_android_server_list. */
@@ -123,166 +124,178 @@ int ares_library_init_android(jobject connectivity_manager)
/* ConnectivityManager in API 1. */
obj_cls = jni_get_class(env, "android/net/ConnectivityManager");
- if (obj_cls == NULL)
+ if (obj_cls == NULL) {
goto cleanup;
+ }
/* ConnectivityManager.getActiveNetwork in API 23. */
- android_cm_active_net_mid =
- jni_get_method_id(env, obj_cls, "getActiveNetwork",
- "()Landroid/net/Network;");
- if (android_cm_active_net_mid == NULL)
+ android_cm_active_net_mid = jni_get_method_id(
+ env, obj_cls, "getActiveNetwork", "()Landroid/net/Network;");
+ if (android_cm_active_net_mid == NULL) {
goto cleanup;
+ }
/* ConnectivityManager.getLinkProperties in API 21. */
android_cm_link_props_mid =
- jni_get_method_id(env, obj_cls, "getLinkProperties",
- "(Landroid/net/Network;)Landroid/net/LinkProperties;");
- if (android_cm_link_props_mid == NULL)
+ jni_get_method_id(env, obj_cls, "getLinkProperties",
+ "(Landroid/net/Network;)Landroid/net/LinkProperties;");
+ if (android_cm_link_props_mid == NULL) {
goto cleanup;
+ }
/* LinkProperties in API 21. */
(*env)->DeleteLocalRef(env, obj_cls);
obj_cls = jni_get_class(env, "android/net/LinkProperties");
- if (obj_cls == NULL)
+ if (obj_cls == NULL) {
goto cleanup;
+ }
/* getDnsServers in API 21. */
- android_lp_dns_servers_mid = jni_get_method_id(env, obj_cls, "getDnsServers",
- "()Ljava/util/List;");
- if (android_lp_dns_servers_mid == NULL)
+ android_lp_dns_servers_mid =
+ jni_get_method_id(env, obj_cls, "getDnsServers", "()Ljava/util/List;");
+ if (android_lp_dns_servers_mid == NULL) {
goto cleanup;
+ }
/* getDomains in API 21. */
- android_lp_domains_mid = jni_get_method_id(env, obj_cls, "getDomains",
- "()Ljava/lang/String;");
- if (android_lp_domains_mid == NULL)
+ android_lp_domains_mid =
+ jni_get_method_id(env, obj_cls, "getDomains", "()Ljava/lang/String;");
+ if (android_lp_domains_mid == NULL) {
goto cleanup;
+ }
(*env)->DeleteLocalRef(env, obj_cls);
obj_cls = jni_get_class(env, "java/util/List");
- if (obj_cls == NULL)
+ if (obj_cls == NULL) {
goto cleanup;
+ }
android_list_size_mid = jni_get_method_id(env, obj_cls, "size", "()I");
- if (android_list_size_mid == NULL)
+ if (android_list_size_mid == NULL) {
goto cleanup;
+ }
- android_list_get_mid = jni_get_method_id(env, obj_cls, "get",
- "(I)Ljava/lang/Object;");
- if (android_list_get_mid == NULL)
+ android_list_get_mid =
+ jni_get_method_id(env, obj_cls, "get", "(I)Ljava/lang/Object;");
+ if (android_list_get_mid == NULL) {
goto cleanup;
+ }
(*env)->DeleteLocalRef(env, obj_cls);
obj_cls = jni_get_class(env, "java/net/InetAddress");
- if (obj_cls == NULL)
+ if (obj_cls == NULL) {
goto cleanup;
+ }
- android_ia_host_addr_mid = jni_get_method_id(env, obj_cls, "getHostAddress",
- "()Ljava/lang/String;");
- if (android_ia_host_addr_mid == NULL)
+ android_ia_host_addr_mid =
+ jni_get_method_id(env, obj_cls, "getHostAddress", "()Ljava/lang/String;");
+ if (android_ia_host_addr_mid == NULL) {
goto cleanup;
+ }
(*env)->DeleteLocalRef(env, obj_cls);
goto done;
cleanup:
- if (obj_cls != NULL)
+ if (obj_cls != NULL) {
(*env)->DeleteLocalRef(env, obj_cls);
+ }
- android_cm_active_net_mid = NULL;
- android_cm_link_props_mid = NULL;
+ android_cm_active_net_mid = NULL;
+ android_cm_link_props_mid = NULL;
android_lp_dns_servers_mid = NULL;
- android_lp_domains_mid = NULL;
- android_list_size_mid = NULL;
- android_list_get_mid = NULL;
- android_ia_host_addr_mid = NULL;
+ android_lp_domains_mid = NULL;
+ android_list_size_mid = NULL;
+ android_list_get_mid = NULL;
+ android_ia_host_addr_mid = NULL;
done:
- if (need_detatch)
+ if (need_detatch) {
(*android_jvm)->DetachCurrentThread(android_jvm);
+ }
return ret;
}
int ares_library_android_initialized(void)
{
- if (android_jvm == NULL || android_connectivity_manager == NULL)
+ if (android_jvm == NULL || android_connectivity_manager == NULL) {
return ARES_ENOTINITIALIZED;
+ }
return ARES_SUCCESS;
}
void ares_library_cleanup_android(void)
{
- JNIEnv *env = NULL;
- int need_detatch = 0;
- int res;
+ JNIEnv *env = NULL;
+ int need_detatch = 0;
+ int res;
- if (android_jvm == NULL || android_connectivity_manager == NULL)
+ if (android_jvm == NULL || android_connectivity_manager == NULL) {
return;
+ }
res = (*android_jvm)->GetEnv(android_jvm, (void **)&env, JNI_VERSION_1_6);
- if (res == JNI_EDETACHED)
- {
- env = NULL;
- res = (*android_jvm)->AttachCurrentThread(android_jvm, &env, NULL);
+ if (res == JNI_EDETACHED) {
+ env = NULL;
+ res = (*android_jvm)->AttachCurrentThread(android_jvm, &env, NULL);
need_detatch = 1;
}
- if (res != JNI_OK || env == NULL)
+ if (res != JNI_OK || env == NULL) {
return;
+ }
- android_cm_active_net_mid = NULL;
- android_cm_link_props_mid = NULL;
+ android_cm_active_net_mid = NULL;
+ android_cm_link_props_mid = NULL;
android_lp_dns_servers_mid = NULL;
- android_lp_domains_mid = NULL;
- android_list_size_mid = NULL;
- android_list_get_mid = NULL;
- android_ia_host_addr_mid = NULL;
+ android_lp_domains_mid = NULL;
+ android_list_size_mid = NULL;
+ android_list_get_mid = NULL;
+ android_ia_host_addr_mid = NULL;
(*env)->DeleteGlobalRef(env, android_connectivity_manager);
android_connectivity_manager = NULL;
- if (need_detatch)
+ if (need_detatch) {
(*android_jvm)->DetachCurrentThread(android_jvm);
+ }
}
-char **ares_get_android_server_list(size_t max_servers,
- size_t *num_servers)
+char **ares_get_android_server_list(size_t max_servers, size_t *num_servers)
{
- JNIEnv *env = NULL;
- jobject active_network = NULL;
- jobject link_properties = NULL;
- jobject server_list = NULL;
- jobject server = NULL;
- jstring str = NULL;
- jint nserv;
+ JNIEnv *env = NULL;
+ jobject active_network = NULL;
+ jobject link_properties = NULL;
+ jobject server_list = NULL;
+ jobject server = NULL;
+ jstring str = NULL;
+ jint nserv;
const char *ch_server_address;
- int res;
- size_t i;
- char **dns_list = NULL;
- int need_detatch = 0;
+ int res;
+ size_t i;
+ char **dns_list = NULL;
+ int need_detatch = 0;
if (android_jvm == NULL || android_connectivity_manager == NULL ||
- max_servers == 0 || num_servers == NULL)
- {
+ max_servers == 0 || num_servers == NULL) {
return NULL;
}
if (android_cm_active_net_mid == NULL || android_cm_link_props_mid == NULL ||
android_lp_dns_servers_mid == NULL || android_list_size_mid == NULL ||
- android_list_get_mid == NULL || android_ia_host_addr_mid == NULL)
- {
+ android_list_get_mid == NULL || android_ia_host_addr_mid == NULL) {
return NULL;
}
res = (*android_jvm)->GetEnv(android_jvm, (void **)&env, JNI_VERSION_1_6);
- if (res == JNI_EDETACHED)
- {
- env = NULL;
- res = (*android_jvm)->AttachCurrentThread(android_jvm, &env, NULL);
+ if (res == JNI_EDETACHED) {
+ env = NULL;
+ res = (*android_jvm)->AttachCurrentThread(android_jvm, &env, NULL);
need_detatch = 1;
}
- if (res != JNI_OK || env == NULL)
+ if (res != JNI_OK || env == NULL) {
goto done;
+ }
/* JNI below is equivalent to this Java code.
import android.content.Context;
@@ -307,93 +320,100 @@ char **ares_get_android_server_list(size_t max_servers,
active_network = (*env)->CallObjectMethod(env, android_connectivity_manager,
android_cm_active_net_mid);
- if (active_network == NULL)
+ if (active_network == NULL) {
goto done;
+ }
link_properties =
- (*env)->CallObjectMethod(env, android_connectivity_manager,
- android_cm_link_props_mid, active_network);
- if (link_properties == NULL)
+ (*env)->CallObjectMethod(env, android_connectivity_manager,
+ android_cm_link_props_mid, active_network);
+ if (link_properties == NULL) {
goto done;
+ }
- server_list = (*env)->CallObjectMethod(env, link_properties,
- android_lp_dns_servers_mid);
- if (server_list == NULL)
+ server_list =
+ (*env)->CallObjectMethod(env, link_properties, android_lp_dns_servers_mid);
+ if (server_list == NULL) {
goto done;
+ }
nserv = (*env)->CallIntMethod(env, server_list, android_list_size_mid);
- if (nserv > (jint)max_servers)
+ if (nserv > (jint)max_servers) {
nserv = (jint)max_servers;
- if (nserv <= 0)
+ }
+ if (nserv <= 0) {
goto done;
+ }
*num_servers = (size_t)nserv;
- dns_list = ares_malloc(sizeof(*dns_list)*(*num_servers));
- for (i=0; i<*num_servers; i++)
- {
- server = (*env)->CallObjectMethod(env, server_list, android_list_get_mid,
- (jint)i);
- dns_list[i] = ares_malloc(64);
+ dns_list = ares_malloc(sizeof(*dns_list) * (*num_servers));
+ for (i = 0; i < *num_servers; i++) {
+ size_t len = 64;
+ server =
+ (*env)->CallObjectMethod(env, server_list, android_list_get_mid, (jint)i);
+ dns_list[i] = ares_malloc(len);
dns_list[i][0] = 0;
- if (server == NULL)
- {
+ if (server == NULL) {
continue;
}
str = (*env)->CallObjectMethod(env, server, android_ia_host_addr_mid);
ch_server_address = (*env)->GetStringUTFChars(env, str, 0);
- strncpy(dns_list[i], ch_server_address, 64);
+ ares_strcpy(dns_list[i], ch_server_address, len);
(*env)->ReleaseStringUTFChars(env, str, ch_server_address);
(*env)->DeleteLocalRef(env, str);
(*env)->DeleteLocalRef(env, server);
}
done:
- if ((*env)->ExceptionOccurred(env))
+ if ((*env)->ExceptionOccurred(env)) {
(*env)->ExceptionClear(env);
+ }
- if (server_list != NULL)
+ if (server_list != NULL) {
(*env)->DeleteLocalRef(env, server_list);
- if (link_properties != NULL)
+ }
+ if (link_properties != NULL) {
(*env)->DeleteLocalRef(env, link_properties);
- if (active_network != NULL)
+ }
+ if (active_network != NULL) {
(*env)->DeleteLocalRef(env, active_network);
+ }
- if (need_detatch)
+ if (need_detatch) {
(*android_jvm)->DetachCurrentThread(android_jvm);
+ }
return dns_list;
}
char *ares_get_android_search_domains_list(void)
{
- JNIEnv *env = NULL;
- jobject active_network = NULL;
- jobject link_properties = NULL;
- jstring domains = NULL;
+ JNIEnv *env = NULL;
+ jobject active_network = NULL;
+ jobject link_properties = NULL;
+ jstring domains = NULL;
const char *domain;
- int res;
- char *domain_list = NULL;
- int need_detatch = 0;
+ int res;
+ char *domain_list = NULL;
+ int need_detatch = 0;
- if (android_jvm == NULL || android_connectivity_manager == NULL)
- {
+ if (android_jvm == NULL || android_connectivity_manager == NULL) {
return NULL;
}
if (android_cm_active_net_mid == NULL || android_cm_link_props_mid == NULL ||
- android_lp_domains_mid == NULL)
- {
+ android_lp_domains_mid == NULL) {
return NULL;
}
res = (*android_jvm)->GetEnv(android_jvm, (void **)&env, JNI_VERSION_1_6);
- if (res == JNI_EDETACHED)
- {
- env = NULL;
- res = (*android_jvm)->AttachCurrentThread(android_jvm, &env, NULL);
+ if (res == JNI_EDETACHED) {
+ env = NULL;
+ res = (*android_jvm)->AttachCurrentThread(android_jvm, &env, NULL);
need_detatch = 1;
}
- if (res != JNI_OK || env == NULL)
+ if (res != JNI_OK || env == NULL) {
goto done;
+ }
/* JNI below is equivalent to this Java code.
import android.content.Context;
@@ -404,7 +424,7 @@ char *ares_get_android_search_domains_list(void)
.getSystemService(Context.CONNECTIVITY_SERVICE);
Network an = cm.getActiveNetwork();
LinkProperties lp = cm.getLinkProperties(an);
- String domains = lp.getDomains();
+ String domains = lp.getDomains();
for (String domain: domains.split(",")) {
String d = domain;
}
@@ -415,38 +435,45 @@ char *ares_get_android_search_domains_list(void)
active_network = (*env)->CallObjectMethod(env, android_connectivity_manager,
android_cm_active_net_mid);
- if (active_network == NULL)
+ if (active_network == NULL) {
goto done;
+ }
link_properties =
- (*env)->CallObjectMethod(env, android_connectivity_manager,
- android_cm_link_props_mid, active_network);
- if (link_properties == NULL)
+ (*env)->CallObjectMethod(env, android_connectivity_manager,
+ android_cm_link_props_mid, active_network);
+ if (link_properties == NULL) {
goto done;
+ }
/* Get the domains. It is a common separated list of domains to search. */
- domains = (*env)->CallObjectMethod(env, link_properties,
- android_lp_domains_mid);
- if (domains == NULL)
+ domains =
+ (*env)->CallObjectMethod(env, link_properties, android_lp_domains_mid);
+ if (domains == NULL) {
goto done;
+ }
/* Split on , */
- domain = (*env)->GetStringUTFChars(env, domains, 0);
+ domain = (*env)->GetStringUTFChars(env, domains, 0);
domain_list = ares_strdup(domain);
(*env)->ReleaseStringUTFChars(env, domains, domain);
(*env)->DeleteLocalRef(env, domains);
done:
- if ((*env)->ExceptionOccurred(env))
+ if ((*env)->ExceptionOccurred(env)) {
(*env)->ExceptionClear(env);
+ }
- if (link_properties != NULL)
+ if (link_properties != NULL) {
(*env)->DeleteLocalRef(env, link_properties);
- if (active_network != NULL)
+ }
+ if (active_network != NULL) {
(*env)->DeleteLocalRef(env, active_network);
+ }
- if (need_detatch)
+ if (need_detatch) {
(*android_jvm)->DetachCurrentThread(android_jvm);
+ }
return domain_list;
}
#else
diff --git a/contrib/libs/c-ares/src/lib/ares_android.h b/contrib/libs/c-ares/src/lib/ares_android.h
index 73b8d8ee83..5caadb4fe4 100644
--- a/contrib/libs/c-ares/src/lib/ares_android.h
+++ b/contrib/libs/c-ares/src/lib/ares_android.h
@@ -30,8 +30,8 @@
#if defined(ANDROID) || defined(__ANDROID__)
char **ares_get_android_server_list(size_t max_servers, size_t *num_servers);
-char *ares_get_android_search_domains_list(void);
-void ares_library_cleanup_android(void);
+char *ares_get_android_search_domains_list(void);
+void ares_library_cleanup_android(void);
#endif
diff --git a/contrib/libs/c-ares/src/lib/ares_cancel.c b/contrib/libs/c-ares/src/lib/ares_cancel.c
index 353624a111..5a9fb722cb 100644
--- a/contrib/libs/c-ares/src/lib/ares_cancel.c
+++ b/contrib/libs/c-ares/src/lib/ares_cancel.c
@@ -35,10 +35,15 @@
* on the given channel. It does NOT kill the channel, use ares_destroy() for
* that.
*/
-void ares_cancel(ares_channel channel)
+void ares_cancel(ares_channel_t *channel)
{
- if (ares__llist_len(channel->all_queries) > 0)
- {
+ if (channel == NULL) {
+ return;
+ }
+
+ ares__channel_lock(channel);
+
+ if (ares__llist_len(channel->all_queries) > 0) {
ares__llist_node_t *node = NULL;
ares__llist_node_t *next = NULL;
@@ -46,42 +51,43 @@ void ares_cancel(ares_channel channel)
* into this function are cancelled. New queries added by callbacks of
* queries being cancelled will not be cancelled themselves.
*/
- ares__llist_t *list_copy = channel->all_queries;
- channel->all_queries = ares__llist_create(NULL);
+ ares__llist_t *list_copy = channel->all_queries;
+ channel->all_queries = ares__llist_create(NULL);
/* Out of memory, this function doesn't return a result code though so we
* can't report to caller */
if (channel->all_queries == NULL) {
channel->all_queries = list_copy;
- return;
+ goto done;
}
node = ares__llist_node_first(list_copy);
while (node != NULL) {
- struct query *query;
- ares_socket_t fd = ARES_SOCKET_BAD;
+ struct query *query;
+ struct server_connection *conn;
/* Cache next since this node is being deleted */
next = ares__llist_node_next(node);
- query = ares__llist_node_claim(node);
+ query = ares__llist_node_claim(node);
+ conn = query->conn;
query->node_all_queries = NULL;
- /* Cache file descriptor for connection so we can clean it up possibly */
- if (query->conn)
- fd = query->conn->fd;
-
/* NOTE: its possible this may enqueue new queries */
- query->callback(query->arg, ARES_ECANCELLED, 0, NULL, 0);
+ query->callback(query->arg, ARES_ECANCELLED, 0, NULL);
ares__free_query(query);
/* See if the connection should be cleaned up */
- if (fd != ARES_SOCKET_BAD)
- ares__check_cleanup_conn(channel, fd);
+ ares__check_cleanup_conn(channel, conn);
node = next;
}
ares__llist_destroy(list_copy);
}
+
+ ares_queue_notify_empty(channel);
+
+done:
+ ares__channel_unlock(channel);
}
diff --git a/contrib/libs/c-ares/src/lib/ares_config-linux.h b/contrib/libs/c-ares/src/lib/ares_config-linux.h
index fb69cd17c3..ff485b0d38 100644
--- a/contrib/libs/c-ares/src/lib/ares_config-linux.h
+++ b/contrib/libs/c-ares/src/lib/ares_config-linux.h
@@ -7,20 +7,8 @@
/* Define if building universal (internal helper macro) */
#undef AC_APPLE_UNIVERSAL_BUILD
-/* define this if ares is built for a big endian system */
-#undef ARES_BIG_ENDIAN
-
-/* when building as static part of libcurl */
-#undef BUILDING_LIBCURL
-
-/* Defined for build that exposes internal static functions for testing. */
-#undef CARES_EXPOSE_STATICS
-
/* Defined for build with symbol hiding. */
-#undef CARES_SYMBOL_HIDING
-
-/* Definition to make a library symbol externally visible. */
-#undef CARES_SYMBOL_SCOPE_EXTERN
+/* #undef CARES_SYMBOL_HIDING */
/* Use resolver library to configure cares */
/* #undef CARES_USE_LIBRESOLV */
@@ -67,12 +55,6 @@
/* Define to 1 if you have the <assert.h> header file. */
#define HAVE_ASSERT_H
-/* Define to 1 if you have the `bitncmp' function. */
-/* #undef HAVE_BITNCMP */
-
-/* Define to 1 if bool is an available type. */
-#define HAVE_BOOL_T
-
/* Define to 1 if you have the clock_gettime function and monotonic timer. */
#define HAVE_CLOCK_GETTIME_MONOTONIC
@@ -94,6 +76,24 @@
/* Define to 1 if you have the <errno.h> header file. */
#define HAVE_ERRNO_H
+/* Define to 1 if you have the <poll.h> header file. */
+#define HAVE_POLL_H
+
+/* Define to 1 if you have the poll function. */
+#define HAVE_POLL
+
+/* Define to 1 if you have the pipe function. */
+#define HAVE_PIPE
+
+/* Define to 1 if you have the pipe2 function. */
+#define HAVE_PIPE2
+
+/* Define to 1 if you have the kqueue function. */
+/* #undef HAVE_KQUEUE */
+
+/* Define to 1 if you have the epoll{_create,ctl,wait} functions. */
+#define HAVE_EPOLL
+
/* Define to 1 if you have the fcntl function. */
#define HAVE_FCNTL
@@ -115,12 +115,6 @@
/* Define to 1 if you have the getenv function. */
#define HAVE_GETENV
-/* Define to 1 if you have the gethostbyaddr function. */
-#define HAVE_GETHOSTBYADDR
-
-/* Define to 1 if you have the gethostbyname function. */
-#define HAVE_GETHOSTBYNAME
-
/* Define to 1 if you have the gethostname function. */
#define HAVE_GETHOSTNAME
@@ -142,6 +136,15 @@
/* Define to 1 if you have the `if_indextoname' function. */
#define HAVE_IF_INDEXTONAME
+/* Define to 1 if you have the `if_nametoindex' function. */
+#define HAVE_IF_NAMETOINDEX
+
+/* Define to 1 if you have the `ConvertInterfaceIndexToLuid' function. */
+/* #undef HAVE_CONVERTINTERFACEINDEXTOLUID */
+
+/* Define to 1 if you have the `ConvertInterfaceLuidToNameA' function. */
+/* #undef HAVE_CONVERTINTERFACELUIDTONAMEA */
+
/* Define to 1 if you have a IPv6 capable working inet_net_pton function. */
/* #undef HAVE_INET_NET_PTON */
@@ -179,12 +182,15 @@
/* Define to 1 if you have the `resolve' library (-lresolve). */
/* #undef HAVE_LIBRESOLV */
+/* Define to 1 if you have iphlpapi.h */
+/* #undef HAVE_IPHLPAPI_H */
+
+/* Define to 1 if you have netioapi.h */
+/* #undef HAVE_NETIOAPI_H */
+
/* Define to 1 if you have the <limits.h> header file. */
#define HAVE_LIMITS_H
-/* if your compiler supports LL */
-#define HAVE_LL
-
/* Define to 1 if the compiler supports the 'long long' data type. */
#define HAVE_LONGLONG
@@ -194,6 +200,9 @@
/* Define to 1 if you have the memory.h header file. */
#define HAVE_MEMORY_H
+/* Define to 1 if you have the AvailabilityMacros.h header file. */
+/* #undef HAVE_AVAILABILITYMACROS_H */
+
/* Define to 1 if you have the MSG_NOSIGNAL flag. */
#define HAVE_MSG_NOSIGNAL
@@ -203,6 +212,9 @@
/* Define to 1 if you have the <netinet/in.h> header file. */
#define HAVE_NETINET_IN_H
+/* Define to 1 if you have the <netinet6/in6.h> header file. */
+/* #undef HAVE_NETINET6_IN6_H */
+
/* Define to 1 if you have the <netinet/tcp.h> header file. */
#define HAVE_NETINET_TCP_H
@@ -230,14 +242,8 @@
/* Define to 1 if you have the <signal.h> header file. */
#define HAVE_SIGNAL_H
-/* Define to 1 if sig_atomic_t is an available typedef. */
-#define HAVE_SIG_ATOMIC_T
-
-/* Define to 1 if sig_atomic_t is already defined as volatile. */
-/* #undef HAVE_SIG_ATOMIC_T_VOLATILE */
-
/* Define to 1 if your struct sockaddr_in6 has sin6_scope_id. */
-#define HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID
+#define HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID
/* Define to 1 if you have the socket function. */
#define HAVE_SOCKET
@@ -305,6 +311,15 @@
/* Define to 1 if you have the <sys/param.h> header file. */
#define HAVE_SYS_PARAM_H
+/* Define to 1 if you have the <sys/random.h> header file. */
+#define HAVE_SYS_RANDOM_H
+
+/* Define to 1 if you have the <sys/event.h> header file. */
+/* #undef HAVE_SYS_EVENT_H */
+
+/* Define to 1 if you have the <sys/epoll.h> header file. */
+#define HAVE_SYS_EPOLL_H
+
/* Define to 1 if you have the <sys/select.h> header file. */
#define HAVE_SYS_SELECT_H
@@ -326,6 +341,9 @@
/* Define to 1 if you have the <time.h> header file. */
#define HAVE_TIME_H
+/* Define to 1 if you have the <ifaddrs.h> header file. */
+#define HAVE_IFADDRS_H
+
/* Define to 1 if you have the <unistd.h> header file. */
#define HAVE_UNISTD_H
@@ -338,6 +356,18 @@
/* Define to 1 if you have the winsock.h header file. */
/* #undef HAVE_WINSOCK_H */
+/* Define to 1 if you have the mswsock.h header file. */
+/* #undef HAVE_MSWSOCK_H */
+
+/* Define to 1 if you have the winternl.h header file. */
+/* #undef HAVE_WINTERNL_H */
+
+/* Define to 1 if you have the ntstatus.h header file. */
+/* #undef HAVE_NTSTATUS_H */
+
+/* Define to 1 if you have the ntdef.h header file. */
+/* #undef HAVE_NTDEF_H */
+
/* Define to 1 if you have the writev function. */
#define HAVE_WRITEV
@@ -356,6 +386,12 @@
/* Define if have arc4random_buf() */
/* #undef HAVE_ARC4RANDOM_BUF */
+/* Define if have getifaddrs() */
+#define HAVE_GETIFADDRS
+
+/* Define if have stat() */
+#define HAVE_STAT
+
/* a suitable file/device to read random data from */
#define CARES_RANDOM_FILE "/dev/urandom"
@@ -407,9 +443,6 @@
/* Define to the function return type for recv. */
#define RECV_TYPE_RETV ssize_t
-/* Define as the return type of signal handlers (`int' or `void'). */
-#define RETSIGTYPE
-
/* Define to the type qualifier of arg 2 for send. */
#define SEND_QUAL_ARG2
@@ -428,15 +461,21 @@
/* Define to the function return type for send. */
#define SEND_TYPE_RETV ssize_t
-/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
-#define TIME_WITH_SYS_TIME
-
/* Define to disable non-blocking sockets. */
#undef USE_BLOCKING_SOCKETS
/* Define to avoid automatic inclusion of winsock.h */
#undef WIN32_LEAN_AND_MEAN
-/* Type to use in place of in_addr_t when system does not provide it. */
-#undef in_addr_t
+/* Define to 1 if you have the pthread.h header file. */
+#define HAVE_PTHREAD_H
+
+/* Define to 1 if you have the pthread_np.h header file. */
+/* #undef HAVE_PTHREAD_NP_H */
+
+/* Define to 1 if threads are enabled */
+#define CARES_THREADS
+
+/* Define to 1 if pthread_init() exists */
+/* #undef HAVE_PTHREAD_INIT */
diff --git a/contrib/libs/c-ares/src/lib/ares_create_query.c b/contrib/libs/c-ares/src/lib/ares_create_query.c
index 21c6be08bd..a2f2caac6e 100644
--- a/contrib/libs/c-ares/src/lib/ares_create_query.c
+++ b/contrib/libs/c-ares/src/lib/ares_create_query.c
@@ -1,7 +1,6 @@
/* MIT License
*
- * Copyright (c) Massachusetts Institute of Technology
- * Copyright (c) The c-ares project and its contributors
+ * Copyright (c) 2023 Brad House
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -26,183 +25,56 @@
*/
#include "ares_setup.h"
-
-#ifdef HAVE_NETINET_IN_H
-# include <netinet/in.h>
-#endif
-
-#include "ares_nameser.h"
-
#include "ares.h"
-#include "ares_dns.h"
#include "ares_private.h"
-
-/* Header format, from RFC 1035:
- * 1 1 1 1 1 1
- * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
- * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- * | ID |
- * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- * |QR| Opcode |AA|TC|RD|RA| Z | RCODE |
- * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- * | QDCOUNT |
- * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- * | ANCOUNT |
- * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- * | NSCOUNT |
- * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- * | ARCOUNT |
- * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- *
- * AA, TC, RA, and RCODE are only set in responses. Brief description
- * of the remaining fields:
- * ID Identifier to match responses with queries
- * QR Query (0) or response (1)
- * Opcode For our purposes, always O_QUERY
- * RD Recursion desired
- * Z Reserved (zero)
- * QDCOUNT Number of queries
- * ANCOUNT Number of answers
- * NSCOUNT Number of name server records
- * ARCOUNT Number of additional records
- *
- * Question format, from RFC 1035:
- * 1 1 1 1 1 1
- * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
- * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- * | |
- * / QNAME /
- * / /
- * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- * | QTYPE |
- * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- * | QCLASS |
- * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- *
- * The query name is encoded as a series of labels, each represented
- * as a one-byte length (maximum 63) followed by the text of the
- * label. The list is terminated by a label of length zero (which can
- * be thought of as the root domain).
- */
-
-int ares_create_query(const char *name, int dnsclass, int type,
- unsigned short id, int rd, unsigned char **bufp,
- int *buflenp, int max_udp_size)
+static int ares_create_query_int(const char *name, int dnsclass, int type,
+ unsigned short id, int rd,
+ unsigned char **bufp, int *buflenp,
+ int max_udp_size)
{
- size_t len;
- unsigned char *q;
- const char *p;
- size_t buflen;
- unsigned char *buf;
+ ares_status_t status;
+ ares_dns_record_t *dnsrec = NULL;
+ size_t len;
+ ares_dns_flags_t rd_flag = rd ? ARES_FLAG_RD : 0;
+
+ if (name == NULL || bufp == NULL || buflenp == NULL) {
+ status = ARES_EFORMERR;
+ goto done;
+ }
- /* Set our results early, in case we bail out early with an error. */
+ *bufp = NULL;
*buflenp = 0;
- *bufp = NULL;
-
- /* Per RFC 7686, reject queries for ".onion" domain names with NXDOMAIN. */
- if (ares__is_onion_domain(name))
- return ARES_ENOTFOUND;
- /* Allocate a memory area for the maximum size this packet might need. +2
- * is for the length byte and zero termination if no dots or ecscaping is
- * used.
- */
- len = strlen(name) + 2 + HFIXEDSZ + QFIXEDSZ +
- (max_udp_size ? EDNSFIXEDSZ : 0);
- buf = ares_malloc(len);
- if (!buf)
- return ARES_ENOMEM;
-
- /* Set up the header. */
- q = buf;
- memset(q, 0, HFIXEDSZ);
- DNS_HEADER_SET_QID(q, id);
- DNS_HEADER_SET_OPCODE(q, O_QUERY);
- if (rd) {
- DNS_HEADER_SET_RD(q, 1);
- }
- else {
- DNS_HEADER_SET_RD(q, 0);
+ status = ares_dns_record_create_query(
+ &dnsrec, name, (ares_dns_class_t)dnsclass, (ares_dns_rec_type_t)type, id,
+ rd_flag, (size_t)max_udp_size);
+ if (status != ARES_SUCCESS) {
+ goto done;
}
- DNS_HEADER_SET_QDCOUNT(q, 1);
- if (max_udp_size) {
- DNS_HEADER_SET_ARCOUNT(q, 1);
+ status = ares_dns_write(dnsrec, bufp, &len);
+ if (status != ARES_SUCCESS) {
+ goto done;
}
- /* A name of "." is a screw case for the loop below, so adjust it. */
- if (strcmp(name, ".") == 0)
- name++;
+ *buflenp = (int)len;
- /* Start writing out the name after the header. */
- q += HFIXEDSZ;
- while (*name)
- {
- if (*name == '.') {
- ares_free (buf);
- return ARES_EBADNAME;
- }
-
- /* Count the number of bytes in this label. */
- len = 0;
- for (p = name; *p && *p != '.'; p++)
- {
- if (*p == '\\' && *(p + 1) != 0)
- p++;
- len++;
- }
- if (len > MAXLABEL) {
- ares_free (buf);
- return ARES_EBADNAME;
- }
-
- /* Encode the length and copy the data. */
- *q++ = (unsigned char)len;
- for (p = name; *p && *p != '.'; p++)
- {
- if (*p == '\\' && *(p + 1) != 0)
- p++;
- *q++ = *p;
- }
-
- /* Go to the next label and repeat, unless we hit the end. */
- if (!*p)
- break;
- name = p + 1;
- }
-
- /* Add the zero-length label at the end. */
- *q++ = 0;
-
- /* Finish off the question with the type and class. */
- DNS_QUESTION_SET_TYPE(q, type);
- DNS_QUESTION_SET_CLASS(q, dnsclass);
-
- q += QFIXEDSZ;
- if (max_udp_size)
- {
- memset(q, 0, EDNSFIXEDSZ);
- q++;
- DNS_RR_SET_TYPE(q, T_OPT);
- DNS_RR_SET_CLASS(q, max_udp_size);
- q += (EDNSFIXEDSZ-1);
- }
- buflen = (q - buf);
-
- /* Reject names that are longer than the maximum of 255 bytes that's
- * specified in RFC 1035 ("To simplify implementations, the total length of
- * a domain name (i.e., label octets and label length octets) is restricted
- * to 255 octets or less."). */
- if (buflen > (size_t)(MAXCDNAME + HFIXEDSZ + QFIXEDSZ +
- (max_udp_size ? EDNSFIXEDSZ : 0))) {
- ares_free (buf);
- return ARES_EBADNAME;
- }
+done:
+ ares_dns_record_destroy(dnsrec);
+ return (int)status;
+}
- /* we know this fits in an int at this point */
- *buflenp = (int) buflen;
- *bufp = buf;
+int ares_create_query(const char *name, int dnsclass, int type,
+ unsigned short id, int rd, unsigned char **bufp,
+ int *buflenp, int max_udp_size)
+{
+ return ares_create_query_int(name, dnsclass, type, id, rd, bufp, buflenp,
+ max_udp_size);
+}
- return ARES_SUCCESS;
+int ares_mkquery(const char *name, int dnsclass, int type, unsigned short id,
+ int rd, unsigned char **buf, int *buflen)
+{
+ return ares_create_query_int(name, dnsclass, type, id, rd, buf, buflen, 0);
}
diff --git a/contrib/libs/c-ares/src/lib/ares_data.c b/contrib/libs/c-ares/src/lib/ares_data.c
index 9e22339327..e37088283b 100644
--- a/contrib/libs/c-ares/src/lib/ares_data.c
+++ b/contrib/libs/c-ares/src/lib/ares_data.c
@@ -33,7 +33,6 @@
#include "ares_data.h"
#include "ares_private.h"
-
/*
** ares_free_data() - c-ares external API function.
**
@@ -52,12 +51,12 @@ void ares_free_data(void *dataptr)
{
while (dataptr != NULL) {
struct ares_data *ptr;
- void *next_data = NULL;
+ void *next_data = NULL;
#ifdef __INTEL_COMPILER
# pragma warning(push)
-# pragma warning(disable:1684)
- /* 1684: conversion from pointer to same-sized integral type */
+# pragma warning(disable : 1684)
+ /* 1684: conversion from pointer to same-sized integral type */
#endif
ptr = (void *)((char *)dataptr - offsetof(struct ares_data, data));
@@ -66,97 +65,68 @@ void ares_free_data(void *dataptr)
# pragma warning(pop)
#endif
- if (ptr->mark != ARES_DATATYPE_MARK)
+ if (ptr->mark != ARES_DATATYPE_MARK) {
return;
+ }
- switch (ptr->type)
- {
- case ARES_DATATYPE_MX_REPLY:
-
- if (ptr->data.mx_reply.next)
- next_data = ptr->data.mx_reply.next;
- if (ptr->data.mx_reply.host)
- ares_free(ptr->data.mx_reply.host);
- break;
-
- case ARES_DATATYPE_SRV_REPLY:
-
- if (ptr->data.srv_reply.next)
- next_data = ptr->data.srv_reply.next;
- if (ptr->data.srv_reply.host)
- ares_free(ptr->data.srv_reply.host);
- break;
-
- case ARES_DATATYPE_URI_REPLY:
-
- if (ptr->data.uri_reply.next)
- next_data = ptr->data.uri_reply.next;
- if (ptr->data.uri_reply.uri)
- ares_free(ptr->data.uri_reply.uri);
- break;
-
- case ARES_DATATYPE_TXT_REPLY:
- case ARES_DATATYPE_TXT_EXT:
-
- if (ptr->data.txt_reply.next)
- next_data = ptr->data.txt_reply.next;
- if (ptr->data.txt_reply.txt)
- ares_free(ptr->data.txt_reply.txt);
- break;
+ switch (ptr->type) {
+ case ARES_DATATYPE_MX_REPLY:
+ next_data = ptr->data.mx_reply.next;
+ ares_free(ptr->data.mx_reply.host);
+ break;
- case ARES_DATATYPE_ADDR_NODE:
+ case ARES_DATATYPE_SRV_REPLY:
+ next_data = ptr->data.srv_reply.next;
+ ares_free(ptr->data.srv_reply.host);
+ break;
- if (ptr->data.addr_node.next)
- next_data = ptr->data.addr_node.next;
- break;
+ case ARES_DATATYPE_URI_REPLY:
+ next_data = ptr->data.uri_reply.next;
+ ares_free(ptr->data.uri_reply.uri);
+ break;
- case ARES_DATATYPE_ADDR_PORT_NODE:
+ case ARES_DATATYPE_TXT_REPLY:
+ case ARES_DATATYPE_TXT_EXT:
+ next_data = ptr->data.txt_reply.next;
+ ares_free(ptr->data.txt_reply.txt);
+ break;
- if (ptr->data.addr_port_node.next)
- next_data = ptr->data.addr_port_node.next;
- break;
+ case ARES_DATATYPE_ADDR_NODE:
+ next_data = ptr->data.addr_node.next;
+ break;
- case ARES_DATATYPE_NAPTR_REPLY:
+ case ARES_DATATYPE_ADDR_PORT_NODE:
+ next_data = ptr->data.addr_port_node.next;
+ break;
- if (ptr->data.naptr_reply.next)
- next_data = ptr->data.naptr_reply.next;
- if (ptr->data.naptr_reply.flags)
- ares_free(ptr->data.naptr_reply.flags);
- if (ptr->data.naptr_reply.service)
- ares_free(ptr->data.naptr_reply.service);
- if (ptr->data.naptr_reply.regexp)
- ares_free(ptr->data.naptr_reply.regexp);
- if (ptr->data.naptr_reply.replacement)
- ares_free(ptr->data.naptr_reply.replacement);
- break;
+ case ARES_DATATYPE_NAPTR_REPLY:
+ next_data = ptr->data.naptr_reply.next;
+ ares_free(ptr->data.naptr_reply.flags);
+ ares_free(ptr->data.naptr_reply.service);
+ ares_free(ptr->data.naptr_reply.regexp);
+ ares_free(ptr->data.naptr_reply.replacement);
+ break;
- case ARES_DATATYPE_SOA_REPLY:
- if (ptr->data.soa_reply.nsname)
- ares_free(ptr->data.soa_reply.nsname);
- if (ptr->data.soa_reply.hostmaster)
- ares_free(ptr->data.soa_reply.hostmaster);
- break;
+ case ARES_DATATYPE_SOA_REPLY:
+ ares_free(ptr->data.soa_reply.nsname);
+ ares_free(ptr->data.soa_reply.hostmaster);
+ break;
- case ARES_DATATYPE_CAA_REPLY:
-
- if (ptr->data.caa_reply.next)
- next_data = ptr->data.caa_reply.next;
- if (ptr->data.caa_reply.property)
- ares_free(ptr->data.caa_reply.property);
- if (ptr->data.caa_reply.value)
- ares_free(ptr->data.caa_reply.value);
- break;
+ case ARES_DATATYPE_CAA_REPLY:
+ next_data = ptr->data.caa_reply.next;
+ ares_free(ptr->data.caa_reply.property);
+ ares_free(ptr->data.caa_reply.value);
+ break;
- default:
- return;
- }
+ default:
+ return;
+ }
ares_free(ptr);
dataptr = next_data;
}
}
-
/*
** ares_malloc_data() - c-ares internal helper function.
**
@@ -172,92 +142,28 @@ void *ares_malloc_data(ares_datatype type)
{
struct ares_data *ptr;
- ptr = ares_malloc(sizeof(struct ares_data));
- if (!ptr)
+ ptr = ares_malloc_zero(sizeof(*ptr));
+ if (!ptr) {
return NULL;
+ }
- switch (type)
- {
- case ARES_DATATYPE_MX_REPLY:
- ptr->data.mx_reply.next = NULL;
- ptr->data.mx_reply.host = NULL;
- ptr->data.mx_reply.priority = 0;
- break;
-
- case ARES_DATATYPE_SRV_REPLY:
- ptr->data.srv_reply.next = NULL;
- ptr->data.srv_reply.host = NULL;
- ptr->data.srv_reply.priority = 0;
- ptr->data.srv_reply.weight = 0;
- ptr->data.srv_reply.port = 0;
- break;
-
- case ARES_DATATYPE_URI_REPLY:
- ptr->data.uri_reply.next = NULL;
- ptr->data.uri_reply.priority = 0;
- ptr->data.uri_reply.weight = 0;
- ptr->data.uri_reply.uri = NULL;
- ptr->data.uri_reply.ttl = 0;
- break;
-
- case ARES_DATATYPE_TXT_EXT:
- ptr->data.txt_ext.record_start = 0;
- /* FALLTHROUGH */
-
- case ARES_DATATYPE_TXT_REPLY:
- ptr->data.txt_reply.next = NULL;
- ptr->data.txt_reply.txt = NULL;
- ptr->data.txt_reply.length = 0;
- break;
-
- case ARES_DATATYPE_CAA_REPLY:
- ptr->data.caa_reply.next = NULL;
- ptr->data.caa_reply.plength = 0;
- ptr->data.caa_reply.property = NULL;
- ptr->data.caa_reply.length = 0;
- ptr->data.caa_reply.value = NULL;
- break;
-
- case ARES_DATATYPE_ADDR_NODE:
- ptr->data.addr_node.next = NULL;
- ptr->data.addr_node.family = 0;
- memset(&ptr->data.addr_node.addrV6, 0,
- sizeof(ptr->data.addr_node.addrV6));
- break;
-
- case ARES_DATATYPE_ADDR_PORT_NODE:
- ptr->data.addr_port_node.next = NULL;
- ptr->data.addr_port_node.family = 0;
- ptr->data.addr_port_node.udp_port = 0;
- ptr->data.addr_port_node.tcp_port = 0;
- memset(&ptr->data.addr_port_node.addrV6, 0,
- sizeof(ptr->data.addr_port_node.addrV6));
- break;
-
- case ARES_DATATYPE_NAPTR_REPLY:
- ptr->data.naptr_reply.next = NULL;
- ptr->data.naptr_reply.flags = NULL;
- ptr->data.naptr_reply.service = NULL;
- ptr->data.naptr_reply.regexp = NULL;
- ptr->data.naptr_reply.replacement = NULL;
- ptr->data.naptr_reply.order = 0;
- ptr->data.naptr_reply.preference = 0;
- break;
-
- case ARES_DATATYPE_SOA_REPLY:
- ptr->data.soa_reply.nsname = NULL;
- ptr->data.soa_reply.hostmaster = NULL;
- ptr->data.soa_reply.serial = 0;
- ptr->data.soa_reply.refresh = 0;
- ptr->data.soa_reply.retry = 0;
- ptr->data.soa_reply.expire = 0;
- ptr->data.soa_reply.minttl = 0;
- break;
-
- default:
- ares_free(ptr);
- return NULL;
- }
+ switch (type) {
+ case ARES_DATATYPE_MX_REPLY:
+ case ARES_DATATYPE_SRV_REPLY:
+ case ARES_DATATYPE_URI_REPLY:
+ case ARES_DATATYPE_TXT_EXT:
+ case ARES_DATATYPE_TXT_REPLY:
+ case ARES_DATATYPE_CAA_REPLY:
+ case ARES_DATATYPE_ADDR_NODE:
+ case ARES_DATATYPE_ADDR_PORT_NODE:
+ case ARES_DATATYPE_NAPTR_REPLY:
+ case ARES_DATATYPE_SOA_REPLY:
+ break;
+
+ default:
+ ares_free(ptr);
+ return NULL;
+ }
ptr->mark = ARES_DATATYPE_MARK;
ptr->type = type;
diff --git a/contrib/libs/c-ares/src/lib/ares_data.h b/contrib/libs/c-ares/src/lib/ares_data.h
index 6965cf2a73..b2c4d22b86 100644
--- a/contrib/libs/c-ares/src/lib/ares_data.h
+++ b/contrib/libs/c-ares/src/lib/ares_data.h
@@ -27,24 +27,25 @@
#define __ARES_DATA_H
typedef enum {
- ARES_DATATYPE_UNKNOWN = 1, /* unknown data type - introduced in 1.7.0 */
- ARES_DATATYPE_SRV_REPLY, /* struct ares_srv_reply - introduced in 1.7.0 */
- ARES_DATATYPE_TXT_REPLY, /* struct ares_txt_reply - introduced in 1.7.0 */
- ARES_DATATYPE_TXT_EXT, /* struct ares_txt_ext - introduced in 1.11.0 */
- ARES_DATATYPE_ADDR_NODE, /* struct ares_addr_node - introduced in 1.7.1 */
+ ARES_DATATYPE_UNKNOWN = 1, /* unknown data type - introduced in 1.7.0 */
+ ARES_DATATYPE_SRV_REPLY, /* struct ares_srv_reply - introduced in 1.7.0 */
+ ARES_DATATYPE_TXT_REPLY, /* struct ares_txt_reply - introduced in 1.7.0 */
+ ARES_DATATYPE_TXT_EXT, /* struct ares_txt_ext - introduced in 1.11.0 */
+ ARES_DATATYPE_ADDR_NODE, /* struct ares_addr_node - introduced in 1.7.1 */
ARES_DATATYPE_MX_REPLY, /* struct ares_mx_reply - introduced in 1.7.2 */
- ARES_DATATYPE_NAPTR_REPLY,/* struct ares_naptr_reply - introduced in 1.7.6 */
- ARES_DATATYPE_SOA_REPLY, /* struct ares_soa_reply - introduced in 1.9.0 */
- ARES_DATATYPE_URI_REPLY, /* struct ares_uri_reply */
+ ARES_DATATYPE_NAPTR_REPLY, /* struct ares_naptr_reply - introduced in 1.7.6 */
+ ARES_DATATYPE_SOA_REPLY, /* struct ares_soa_reply - introduced in 1.9.0 */
+ ARES_DATATYPE_URI_REPLY, /* struct ares_uri_reply */
#if 0
ARES_DATATYPE_ADDR6TTL, /* struct ares_addrttl */
ARES_DATATYPE_ADDRTTL, /* struct ares_addr6ttl */
ARES_DATATYPE_HOSTENT, /* struct hostent */
ARES_DATATYPE_OPTIONS, /* struct ares_options */
#endif
- ARES_DATATYPE_ADDR_PORT_NODE, /* struct ares_addr_port_node - introduced in 1.11.0 */
- ARES_DATATYPE_CAA_REPLY, /* struct ares_caa_reply - introduced in 1.17 */
- ARES_DATATYPE_LAST /* not used - introduced in 1.7.0 */
+ ARES_DATATYPE_ADDR_PORT_NODE, /* struct ares_addr_port_node - introduced
+ in 1.11.0 */
+ ARES_DATATYPE_CAA_REPLY, /* struct ares_caa_reply - introduced in 1.17 */
+ ARES_DATATYPE_LAST /* not used - introduced in 1.7.0 */
} ares_datatype;
#define ARES_DATATYPE_MARK 0xbead
@@ -68,19 +69,20 @@ typedef enum {
*/
struct ares_data {
- ares_datatype type; /* Actual data type identifier. */
- unsigned int mark; /* Private ares_data signature. */
+ ares_datatype type; /* Actual data type identifier. */
+ unsigned int mark; /* Private ares_data signature. */
+
union {
- struct ares_txt_reply txt_reply;
- struct ares_txt_ext txt_ext;
- struct ares_srv_reply srv_reply;
- struct ares_addr_node addr_node;
- struct ares_addr_port_node addr_port_node;
- struct ares_mx_reply mx_reply;
- struct ares_naptr_reply naptr_reply;
- struct ares_soa_reply soa_reply;
- struct ares_caa_reply caa_reply;
- struct ares_uri_reply uri_reply;
+ struct ares_txt_reply txt_reply;
+ struct ares_txt_ext txt_ext;
+ struct ares_srv_reply srv_reply;
+ struct ares_addr_node addr_node;
+ struct ares_addr_port_node addr_port_node;
+ struct ares_mx_reply mx_reply;
+ struct ares_naptr_reply naptr_reply;
+ struct ares_soa_reply soa_reply;
+ struct ares_caa_reply caa_reply;
+ struct ares_uri_reply uri_reply;
} data;
};
diff --git a/contrib/libs/c-ares/src/lib/ares_destroy.c b/contrib/libs/c-ares/src/lib/ares_destroy.c
index 560082fd0c..6965b601e7 100644
--- a/contrib/libs/c-ares/src/lib/ares_destroy.c
+++ b/contrib/libs/c-ares/src/lib/ares_destroy.c
@@ -32,33 +32,17 @@
#include "ares.h"
#include "ares_private.h"
-void ares_destroy_options(struct ares_options *options)
+void ares_destroy(ares_channel_t *channel)
{
- int i;
-
- if(options->servers)
- ares_free(options->servers);
- for (i = 0; i < options->ndomains; i++)
- ares_free(options->domains[i]);
- if(options->domains)
- ares_free(options->domains);
- if(options->sortlist)
- ares_free(options->sortlist);
- if(options->lookups)
- ares_free(options->lookups);
- if(options->resolvconf_path)
- ares_free(options->resolvconf_path);
- if(options->hosts_path)
- ares_free(options->hosts_path);
-}
-
-void ares_destroy(ares_channel channel)
-{
- int i;
+ size_t i;
ares__llist_node_t *node = NULL;
- if (!channel)
+ if (channel == NULL) {
return;
+ }
+
+ /* Lock because callbacks will be triggered */
+ ares__channel_lock(channel);
/* Destroy all queries */
node = ares__llist_node_first(channel->all_queries);
@@ -67,19 +51,20 @@ void ares_destroy(ares_channel channel)
struct query *query = ares__llist_node_claim(node);
query->node_all_queries = NULL;
- query->callback(query->arg, ARES_EDESTRUCTION, 0, NULL, 0);
+ query->callback(query->arg, ARES_EDESTRUCTION, 0, NULL);
ares__free_query(query);
node = next;
}
+ ares_queue_notify_empty(channel);
#ifndef NDEBUG
/* Freeing the query should remove it from all the lists in which it sits,
* so all query lists should be empty now.
*/
assert(ares__llist_len(channel->all_queries) == 0);
- assert(ares__htable_stvp_num_keys(channel->queries_by_qid) == 0);
+ assert(ares__htable_szvp_num_keys(channel->queries_by_qid) == 0);
assert(ares__slist_len(channel->queries_by_timeout) == 0);
#endif
@@ -89,52 +74,63 @@ void ares_destroy(ares_channel channel)
assert(ares__htable_asvp_num_keys(channel->connnode_by_socket) == 0);
#endif
+ /* No more callbacks will be triggered after this point, unlock */
+ ares__channel_unlock(channel);
+
+ /* Shut down the event thread */
+ if (channel->optmask & ARES_OPT_EVENT_THREAD) {
+ ares_event_thread_destroy(channel);
+ }
+
if (channel->domains) {
- for (i = 0; i < channel->ndomains; i++)
+ for (i = 0; i < channel->ndomains; i++) {
ares_free(channel->domains[i]);
+ }
ares_free(channel->domains);
}
ares__llist_destroy(channel->all_queries);
ares__slist_destroy(channel->queries_by_timeout);
- ares__htable_stvp_destroy(channel->queries_by_qid);
+ ares__htable_szvp_destroy(channel->queries_by_qid);
ares__htable_asvp_destroy(channel->connnode_by_socket);
- if(channel->sortlist)
- ares_free(channel->sortlist);
-
- if (channel->lookups)
- ares_free(channel->lookups);
+ ares_free(channel->sortlist);
+ ares_free(channel->lookups);
+ ares_free(channel->resolvconf_path);
+ ares_free(channel->hosts_path);
+ ares__destroy_rand_state(channel->rand_state);
- if (channel->resolvconf_path)
- ares_free(channel->resolvconf_path);
+ ares__hosts_file_destroy(channel->hf);
- if (channel->hosts_path)
- ares_free(channel->hosts_path);
+ ares__qcache_destroy(channel->qcache);
- if (channel->rand_state)
- ares__destroy_rand_state(channel->rand_state);
+ ares__channel_threading_destroy(channel);
ares_free(channel);
}
-void ares__destroy_servers_state(ares_channel channel)
+void ares__destroy_server(struct server_state *server)
{
- struct server_state *server;
- int i;
-
- if (channel->servers)
- {
- for (i = 0; i < channel->nservers; i++)
- {
- server = &channel->servers[i];
- ares__close_sockets(server);
- ares__llist_destroy(server->connections);
- ares__buf_destroy(server->tcp_parser);
- ares__buf_destroy(server->tcp_send);
- }
- ares_free(channel->servers);
- channel->servers = NULL;
- }
- channel->nservers = -1;
+ if (server == NULL) {
+ return;
+ }
+
+ ares__close_sockets(server);
+ ares__llist_destroy(server->connections);
+ ares__buf_destroy(server->tcp_parser);
+ ares__buf_destroy(server->tcp_send);
+ ares_free(server);
+}
+
+void ares__destroy_servers_state(ares_channel_t *channel)
+{
+ ares__slist_node_t *node;
+
+ while ((node = ares__slist_node_first(channel->servers)) != NULL) {
+ struct server_state *server = ares__slist_node_claim(node);
+ ares__destroy_server(server);
+ }
+
+ ares__slist_destroy(channel->servers);
+ channel->servers = NULL;
}
diff --git a/contrib/libs/c-ares/src/lib/ares_dns_mapping.c b/contrib/libs/c-ares/src/lib/ares_dns_mapping.c
new file mode 100644
index 0000000000..2b463fe831
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares_dns_mapping.c
@@ -0,0 +1,919 @@
+/* MIT License
+ *
+ * Copyright (c) 2023 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#include "ares_setup.h"
+#include "ares.h"
+#include "ares_private.h"
+
+ares_bool_t ares_dns_opcode_isvalid(ares_dns_opcode_t opcode)
+{
+ switch (opcode) {
+ case ARES_OPCODE_QUERY:
+ case ARES_OPCODE_IQUERY:
+ case ARES_OPCODE_STATUS:
+ case ARES_OPCODE_NOTIFY:
+ case ARES_OPCODE_UPDATE:
+ return ARES_TRUE;
+ }
+ return ARES_FALSE;
+}
+
+ares_bool_t ares_dns_rcode_isvalid(ares_dns_rcode_t rcode)
+{
+ switch (rcode) {
+ case ARES_RCODE_NOERROR:
+ case ARES_RCODE_FORMERR:
+ case ARES_RCODE_SERVFAIL:
+ case ARES_RCODE_NXDOMAIN:
+ case ARES_RCODE_NOTIMP:
+ case ARES_RCODE_REFUSED:
+ case ARES_RCODE_YXDOMAIN:
+ case ARES_RCODE_YXRRSET:
+ case ARES_RCODE_NXRRSET:
+ case ARES_RCODE_NOTAUTH:
+ case ARES_RCODE_NOTZONE:
+ case ARES_RCODE_DSOTYPEI:
+ case ARES_RCODE_BADSIG:
+ case ARES_RCODE_BADKEY:
+ case ARES_RCODE_BADTIME:
+ case ARES_RCODE_BADMODE:
+ case ARES_RCODE_BADNAME:
+ case ARES_RCODE_BADALG:
+ case ARES_RCODE_BADTRUNC:
+ case ARES_RCODE_BADCOOKIE:
+ return ARES_TRUE;
+ }
+ return ARES_FALSE;
+}
+
+ares_bool_t ares_dns_flags_arevalid(unsigned short flags)
+{
+ unsigned short allflags = ARES_FLAG_QR | ARES_FLAG_AA | ARES_FLAG_TC |
+ ARES_FLAG_RD | ARES_FLAG_RA | ARES_FLAG_AD |
+ ARES_FLAG_CD;
+
+ if (flags & ~allflags) {
+ return ARES_FALSE;
+ }
+
+ return ARES_TRUE;
+}
+
+ares_bool_t ares_dns_rec_type_isvalid(ares_dns_rec_type_t type,
+ ares_bool_t is_query)
+{
+ switch (type) {
+ case ARES_REC_TYPE_A:
+ case ARES_REC_TYPE_NS:
+ case ARES_REC_TYPE_CNAME:
+ case ARES_REC_TYPE_SOA:
+ case ARES_REC_TYPE_PTR:
+ case ARES_REC_TYPE_HINFO:
+ case ARES_REC_TYPE_MX:
+ case ARES_REC_TYPE_TXT:
+ case ARES_REC_TYPE_AAAA:
+ case ARES_REC_TYPE_SRV:
+ case ARES_REC_TYPE_NAPTR:
+ case ARES_REC_TYPE_OPT:
+ case ARES_REC_TYPE_TLSA:
+ case ARES_REC_TYPE_SVCB:
+ case ARES_REC_TYPE_HTTPS:
+ case ARES_REC_TYPE_ANY:
+ case ARES_REC_TYPE_URI:
+ case ARES_REC_TYPE_CAA:
+ return ARES_TRUE;
+ case ARES_REC_TYPE_RAW_RR:
+ return is_query ? ARES_FALSE : ARES_TRUE;
+ default:
+ break;
+ }
+ return is_query ? ARES_TRUE : ARES_FALSE;
+}
+
+ares_bool_t ares_dns_rec_type_allow_name_compression(ares_dns_rec_type_t type)
+{
+ /* Only record types defined in RFC1035 allow name compression within the
+ * RDATA. Otherwise nameservers that don't understand an RR may not be
+ * able to pass along the RR in a proper manner */
+ switch (type) {
+ case ARES_REC_TYPE_A:
+ case ARES_REC_TYPE_NS:
+ case ARES_REC_TYPE_CNAME:
+ case ARES_REC_TYPE_SOA:
+ case ARES_REC_TYPE_PTR:
+ case ARES_REC_TYPE_HINFO:
+ case ARES_REC_TYPE_MX:
+ case ARES_REC_TYPE_TXT:
+ return ARES_TRUE;
+ default:
+ break;
+ }
+ return ARES_FALSE;
+}
+
+ares_bool_t ares_dns_class_isvalid(ares_dns_class_t qclass,
+ ares_bool_t is_query)
+{
+ switch (qclass) {
+ case ARES_CLASS_IN:
+ case ARES_CLASS_CHAOS:
+ case ARES_CLASS_HESOID:
+ case ARES_CLASS_NONE:
+ return ARES_TRUE;
+ case ARES_CLASS_ANY:
+ return is_query ? ARES_TRUE : ARES_FALSE;
+ }
+ return ARES_FALSE;
+}
+
+ares_bool_t ares_dns_section_isvalid(ares_dns_section_t sect)
+{
+ switch (sect) {
+ case ARES_SECTION_ANSWER:
+ case ARES_SECTION_AUTHORITY:
+ case ARES_SECTION_ADDITIONAL:
+ return ARES_TRUE;
+ }
+ return ARES_FALSE;
+}
+
+ares_dns_rec_type_t ares_dns_rr_key_to_rec_type(ares_dns_rr_key_t key)
+{
+ /* NOTE: due to the way we've numerated the keys, we can simply divide by
+ * 100 to get the type rather than having to do a huge switch
+ * statement. That said, we do then validate the type returned is
+ * valid in case something completely bogus is passed in */
+ ares_dns_rec_type_t type = key / 100;
+ if (!ares_dns_rec_type_isvalid(type, ARES_FALSE)) {
+ return 0;
+ }
+ return type;
+}
+
+const char *ares_dns_rec_type_tostr(ares_dns_rec_type_t type)
+{
+ switch (type) {
+ case ARES_REC_TYPE_A:
+ return "A";
+ case ARES_REC_TYPE_NS:
+ return "NS";
+ case ARES_REC_TYPE_CNAME:
+ return "CNAME";
+ case ARES_REC_TYPE_SOA:
+ return "SOA";
+ case ARES_REC_TYPE_PTR:
+ return "PTR";
+ case ARES_REC_TYPE_HINFO:
+ return "HINFO";
+ case ARES_REC_TYPE_MX:
+ return "MX";
+ case ARES_REC_TYPE_TXT:
+ return "TXT";
+ case ARES_REC_TYPE_AAAA:
+ return "AAAA";
+ case ARES_REC_TYPE_SRV:
+ return "SRV";
+ case ARES_REC_TYPE_NAPTR:
+ return "NAPTR";
+ case ARES_REC_TYPE_OPT:
+ return "OPT";
+ case ARES_REC_TYPE_TLSA:
+ return "TLSA";
+ case ARES_REC_TYPE_SVCB:
+ return "SVCB";
+ case ARES_REC_TYPE_HTTPS:
+ return "HTTPS";
+ case ARES_REC_TYPE_ANY:
+ return "ANY";
+ case ARES_REC_TYPE_URI:
+ return "URI";
+ case ARES_REC_TYPE_CAA:
+ return "CAA";
+ case ARES_REC_TYPE_RAW_RR:
+ return "RAWRR";
+ }
+ return "UNKNOWN";
+}
+
+const char *ares_dns_class_tostr(ares_dns_class_t qclass)
+{
+ switch (qclass) {
+ case ARES_CLASS_IN:
+ return "IN";
+ case ARES_CLASS_CHAOS:
+ return "CH";
+ case ARES_CLASS_HESOID:
+ return "HS";
+ case ARES_CLASS_ANY:
+ return "ANY";
+ case ARES_CLASS_NONE:
+ return "NONE";
+ }
+ return "UNKNOWN";
+}
+
+const char *ares_dns_opcode_tostr(ares_dns_opcode_t opcode)
+{
+ switch (opcode) {
+ case ARES_OPCODE_QUERY:
+ return "QUERY";
+ case ARES_OPCODE_IQUERY:
+ return "IQUERY";
+ case ARES_OPCODE_STATUS:
+ return "STATUS";
+ case ARES_OPCODE_NOTIFY:
+ return "NOTIFY";
+ case ARES_OPCODE_UPDATE:
+ return "UPDATE";
+ }
+ return "UNKNOWN";
+}
+
+const char *ares_dns_rr_key_tostr(ares_dns_rr_key_t key)
+{
+ switch (key) {
+ case ARES_RR_A_ADDR:
+ return "ADDR";
+
+ case ARES_RR_NS_NSDNAME:
+ return "NSDNAME";
+
+ case ARES_RR_CNAME_CNAME:
+ return "CNAME";
+
+ case ARES_RR_SOA_MNAME:
+ return "MNAME";
+
+ case ARES_RR_SOA_RNAME:
+ return "RNAME";
+
+ case ARES_RR_SOA_SERIAL:
+ return "SERIAL";
+
+ case ARES_RR_SOA_REFRESH:
+ return "REFRESH";
+
+ case ARES_RR_SOA_RETRY:
+ return "RETRY";
+
+ case ARES_RR_SOA_EXPIRE:
+ return "EXPIRE";
+
+ case ARES_RR_SOA_MINIMUM:
+ return "MINIMUM";
+
+ case ARES_RR_PTR_DNAME:
+ return "DNAME";
+
+ case ARES_RR_AAAA_ADDR:
+ return "ADDR";
+
+ case ARES_RR_HINFO_CPU:
+ return "CPU";
+
+ case ARES_RR_HINFO_OS:
+ return "OS";
+
+ case ARES_RR_MX_PREFERENCE:
+ return "PREFERENCE";
+
+ case ARES_RR_MX_EXCHANGE:
+ return "EXCHANGE";
+
+ case ARES_RR_TXT_DATA:
+ return "DATA";
+
+ case ARES_RR_SRV_PRIORITY:
+ return "PRIORITY";
+
+ case ARES_RR_SRV_WEIGHT:
+ return "WEIGHT";
+
+ case ARES_RR_SRV_PORT:
+ return "PORT";
+
+ case ARES_RR_SRV_TARGET:
+ return "TARGET";
+
+ case ARES_RR_NAPTR_ORDER:
+ return "ORDER";
+
+ case ARES_RR_NAPTR_PREFERENCE:
+ return "PREFERENCE";
+
+ case ARES_RR_NAPTR_FLAGS:
+ return "FLAGS";
+
+ case ARES_RR_NAPTR_SERVICES:
+ return "SERVICES";
+
+ case ARES_RR_NAPTR_REGEXP:
+ return "REGEXP";
+
+ case ARES_RR_NAPTR_REPLACEMENT:
+ return "REPLACEMENT";
+
+ case ARES_RR_OPT_UDP_SIZE:
+ return "UDP_SIZE";
+
+ case ARES_RR_OPT_VERSION:
+ return "VERSION";
+
+ case ARES_RR_OPT_FLAGS:
+ return "FLAGS";
+
+ case ARES_RR_OPT_OPTIONS:
+ return "OPTIONS";
+
+ case ARES_RR_TLSA_CERT_USAGE:
+ return "CERT_USAGE";
+
+ case ARES_RR_TLSA_SELECTOR:
+ return "SELECTOR";
+
+ case ARES_RR_TLSA_MATCH:
+ return "MATCH";
+
+ case ARES_RR_TLSA_DATA:
+ return "DATA";
+
+ case ARES_RR_SVCB_PRIORITY:
+ return "PRIORITY";
+
+ case ARES_RR_SVCB_TARGET:
+ return "TARGET";
+
+ case ARES_RR_SVCB_PARAMS:
+ return "PARAMS";
+
+ case ARES_RR_HTTPS_PRIORITY:
+ return "PRIORITY";
+
+ case ARES_RR_HTTPS_TARGET:
+ return "TARGET";
+
+ case ARES_RR_HTTPS_PARAMS:
+ return "PARAMS";
+
+ case ARES_RR_URI_PRIORITY:
+ return "PRIORITY";
+
+ case ARES_RR_URI_WEIGHT:
+ return "WEIGHT";
+
+ case ARES_RR_URI_TARGET:
+ return "TARGET";
+
+ case ARES_RR_CAA_CRITICAL:
+ return "CRITICAL";
+
+ case ARES_RR_CAA_TAG:
+ return "TAG";
+
+ case ARES_RR_CAA_VALUE:
+ return "VALUE";
+
+ case ARES_RR_RAW_RR_TYPE:
+ return "TYPE";
+
+ case ARES_RR_RAW_RR_DATA:
+ return "DATA";
+ }
+
+ return "UNKNOWN";
+}
+
+ares_dns_datatype_t ares_dns_rr_key_datatype(ares_dns_rr_key_t key)
+{
+ switch (key) {
+ case ARES_RR_A_ADDR:
+ return ARES_DATATYPE_INADDR;
+
+ case ARES_RR_AAAA_ADDR:
+ return ARES_DATATYPE_INADDR6;
+
+ case ARES_RR_NS_NSDNAME:
+ case ARES_RR_CNAME_CNAME:
+ case ARES_RR_SOA_MNAME:
+ case ARES_RR_SOA_RNAME:
+ case ARES_RR_PTR_DNAME:
+ case ARES_RR_MX_EXCHANGE:
+ case ARES_RR_SRV_TARGET:
+ case ARES_RR_SVCB_TARGET:
+ case ARES_RR_HTTPS_TARGET:
+ case ARES_RR_NAPTR_REPLACEMENT:
+ case ARES_RR_URI_TARGET:
+ return ARES_DATATYPE_NAME;
+
+ case ARES_RR_HINFO_CPU:
+ case ARES_RR_HINFO_OS:
+ case ARES_RR_NAPTR_FLAGS:
+ case ARES_RR_NAPTR_SERVICES:
+ case ARES_RR_NAPTR_REGEXP:
+ case ARES_RR_CAA_TAG:
+ return ARES_DATATYPE_STR;
+
+ case ARES_RR_SOA_SERIAL:
+ case ARES_RR_SOA_REFRESH:
+ case ARES_RR_SOA_RETRY:
+ case ARES_RR_SOA_EXPIRE:
+ case ARES_RR_SOA_MINIMUM:
+ return ARES_DATATYPE_U32;
+
+ case ARES_RR_MX_PREFERENCE:
+ case ARES_RR_SRV_PRIORITY:
+ case ARES_RR_SRV_WEIGHT:
+ case ARES_RR_SRV_PORT:
+ case ARES_RR_NAPTR_ORDER:
+ case ARES_RR_NAPTR_PREFERENCE:
+ case ARES_RR_OPT_UDP_SIZE:
+ case ARES_RR_OPT_FLAGS:
+ case ARES_RR_SVCB_PRIORITY:
+ case ARES_RR_HTTPS_PRIORITY:
+ case ARES_RR_URI_PRIORITY:
+ case ARES_RR_URI_WEIGHT:
+ case ARES_RR_RAW_RR_TYPE:
+ return ARES_DATATYPE_U16;
+
+ case ARES_RR_OPT_VERSION:
+ case ARES_RR_TLSA_CERT_USAGE:
+ case ARES_RR_TLSA_SELECTOR:
+ case ARES_RR_TLSA_MATCH:
+ case ARES_RR_CAA_CRITICAL:
+ return ARES_DATATYPE_U8;
+
+ case ARES_RR_CAA_VALUE:
+ case ARES_RR_TXT_DATA:
+ return ARES_DATATYPE_BINP;
+
+ case ARES_RR_TLSA_DATA:
+ case ARES_RR_RAW_RR_DATA:
+ return ARES_DATATYPE_BIN;
+
+ case ARES_RR_OPT_OPTIONS:
+ case ARES_RR_SVCB_PARAMS:
+ case ARES_RR_HTTPS_PARAMS:
+ return ARES_DATATYPE_OPT;
+ }
+
+ return 0;
+}
+
+static const ares_dns_rr_key_t rr_a_keys[] = { ARES_RR_A_ADDR };
+static const ares_dns_rr_key_t rr_ns_keys[] = { ARES_RR_NS_NSDNAME };
+static const ares_dns_rr_key_t rr_cname_keys[] = { ARES_RR_CNAME_CNAME };
+static const ares_dns_rr_key_t rr_soa_keys[] = {
+ ARES_RR_SOA_MNAME, ARES_RR_SOA_RNAME, ARES_RR_SOA_SERIAL,
+ ARES_RR_SOA_REFRESH, ARES_RR_SOA_RETRY, ARES_RR_SOA_EXPIRE,
+ ARES_RR_SOA_MINIMUM
+};
+static const ares_dns_rr_key_t rr_ptr_keys[] = { ARES_RR_PTR_DNAME };
+static const ares_dns_rr_key_t rr_hinfo_keys[] = { ARES_RR_HINFO_CPU,
+ ARES_RR_HINFO_OS };
+static const ares_dns_rr_key_t rr_mx_keys[] = { ARES_RR_MX_PREFERENCE,
+ ARES_RR_MX_EXCHANGE };
+static const ares_dns_rr_key_t rr_txt_keys[] = { ARES_RR_TXT_DATA };
+static const ares_dns_rr_key_t rr_aaaa_keys[] = { ARES_RR_AAAA_ADDR };
+static const ares_dns_rr_key_t rr_srv_keys[] = {
+ ARES_RR_SRV_PRIORITY, ARES_RR_SRV_WEIGHT, ARES_RR_SRV_PORT, ARES_RR_SRV_TARGET
+};
+static const ares_dns_rr_key_t rr_naptr_keys[] = {
+ ARES_RR_NAPTR_ORDER, ARES_RR_NAPTR_PREFERENCE, ARES_RR_NAPTR_FLAGS,
+ ARES_RR_NAPTR_SERVICES, ARES_RR_NAPTR_REGEXP, ARES_RR_NAPTR_REPLACEMENT
+};
+static const ares_dns_rr_key_t rr_opt_keys[] = { ARES_RR_OPT_UDP_SIZE,
+ ARES_RR_OPT_VERSION,
+ ARES_RR_OPT_FLAGS,
+ ARES_RR_OPT_OPTIONS };
+static const ares_dns_rr_key_t rr_tlsa_keys[] = { ARES_RR_TLSA_CERT_USAGE,
+ ARES_RR_TLSA_SELECTOR,
+ ARES_RR_TLSA_MATCH,
+ ARES_RR_TLSA_DATA };
+static const ares_dns_rr_key_t rr_svcb_keys[] = { ARES_RR_SVCB_PRIORITY,
+ ARES_RR_SVCB_TARGET,
+ ARES_RR_SVCB_PARAMS };
+static const ares_dns_rr_key_t rr_https_keys[] = { ARES_RR_HTTPS_PRIORITY,
+ ARES_RR_HTTPS_TARGET,
+ ARES_RR_HTTPS_PARAMS };
+static const ares_dns_rr_key_t rr_uri_keys[] = { ARES_RR_URI_PRIORITY,
+ ARES_RR_URI_WEIGHT,
+ ARES_RR_URI_TARGET };
+static const ares_dns_rr_key_t rr_caa_keys[] = { ARES_RR_CAA_CRITICAL,
+ ARES_RR_CAA_TAG,
+ ARES_RR_CAA_VALUE };
+static const ares_dns_rr_key_t rr_raw_rr_keys[] = { ARES_RR_RAW_RR_TYPE,
+ ARES_RR_RAW_RR_DATA };
+
+const ares_dns_rr_key_t *ares_dns_rr_get_keys(ares_dns_rec_type_t type,
+ size_t *cnt)
+{
+ if (cnt == NULL) {
+ return NULL;
+ }
+
+ *cnt = 0;
+
+ switch (type) {
+ case ARES_REC_TYPE_A:
+ *cnt = sizeof(rr_a_keys) / sizeof(*rr_a_keys);
+ return rr_a_keys;
+ case ARES_REC_TYPE_NS:
+ *cnt = sizeof(rr_ns_keys) / sizeof(*rr_ns_keys);
+ return rr_ns_keys;
+ case ARES_REC_TYPE_CNAME:
+ *cnt = sizeof(rr_cname_keys) / sizeof(*rr_cname_keys);
+ return rr_cname_keys;
+ case ARES_REC_TYPE_SOA:
+ *cnt = sizeof(rr_soa_keys) / sizeof(*rr_soa_keys);
+ return rr_soa_keys;
+ case ARES_REC_TYPE_PTR:
+ *cnt = sizeof(rr_ptr_keys) / sizeof(*rr_ptr_keys);
+ return rr_ptr_keys;
+ case ARES_REC_TYPE_HINFO:
+ *cnt = sizeof(rr_hinfo_keys) / sizeof(*rr_hinfo_keys);
+ return rr_hinfo_keys;
+ case ARES_REC_TYPE_MX:
+ *cnt = sizeof(rr_mx_keys) / sizeof(*rr_mx_keys);
+ return rr_mx_keys;
+ case ARES_REC_TYPE_TXT:
+ *cnt = sizeof(rr_txt_keys) / sizeof(*rr_txt_keys);
+ return rr_txt_keys;
+ case ARES_REC_TYPE_AAAA:
+ *cnt = sizeof(rr_aaaa_keys) / sizeof(*rr_aaaa_keys);
+ return rr_aaaa_keys;
+ case ARES_REC_TYPE_SRV:
+ *cnt = sizeof(rr_srv_keys) / sizeof(*rr_srv_keys);
+ return rr_srv_keys;
+ case ARES_REC_TYPE_NAPTR:
+ *cnt = sizeof(rr_naptr_keys) / sizeof(*rr_naptr_keys);
+ return rr_naptr_keys;
+ case ARES_REC_TYPE_OPT:
+ *cnt = sizeof(rr_opt_keys) / sizeof(*rr_opt_keys);
+ return rr_opt_keys;
+ case ARES_REC_TYPE_TLSA:
+ *cnt = sizeof(rr_tlsa_keys) / sizeof(*rr_tlsa_keys);
+ return rr_tlsa_keys;
+ case ARES_REC_TYPE_SVCB:
+ *cnt = sizeof(rr_svcb_keys) / sizeof(*rr_svcb_keys);
+ return rr_svcb_keys;
+ case ARES_REC_TYPE_HTTPS:
+ *cnt = sizeof(rr_https_keys) / sizeof(*rr_https_keys);
+ return rr_https_keys;
+ case ARES_REC_TYPE_ANY:
+ /* Not real */
+ break;
+ case ARES_REC_TYPE_URI:
+ *cnt = sizeof(rr_uri_keys) / sizeof(*rr_uri_keys);
+ return rr_uri_keys;
+ case ARES_REC_TYPE_CAA:
+ *cnt = sizeof(rr_caa_keys) / sizeof(*rr_caa_keys);
+ return rr_caa_keys;
+ case ARES_REC_TYPE_RAW_RR:
+ *cnt = sizeof(rr_raw_rr_keys) / sizeof(*rr_raw_rr_keys);
+ return rr_raw_rr_keys;
+ }
+
+ return NULL;
+}
+
+ares_bool_t ares_dns_class_fromstr(ares_dns_class_t *qclass, const char *str)
+{
+ size_t i;
+
+ static const struct {
+ const char *name;
+ ares_dns_class_t qclass;
+ } list[] = {
+ {"IN", ARES_CLASS_IN },
+ { "CH", ARES_CLASS_CHAOS },
+ { "HS", ARES_CLASS_HESOID},
+ { "NONE", ARES_CLASS_NONE },
+ { "ANY", ARES_CLASS_ANY },
+ { NULL, 0 }
+ };
+
+ if (qclass == NULL || str == NULL) {
+ return ARES_FALSE;
+ }
+
+ for (i = 0; list[i].name != NULL; i++) {
+ if (strcasecmp(list[i].name, str) == 0) {
+ *qclass = list[i].qclass;
+ return ARES_TRUE;
+ }
+ }
+ return ARES_FALSE;
+}
+
+ares_bool_t ares_dns_rec_type_fromstr(ares_dns_rec_type_t *qtype,
+ const char *str)
+{
+ size_t i;
+
+ static const struct {
+ const char *name;
+ ares_dns_rec_type_t type;
+ } list[] = {
+ {"A", ARES_REC_TYPE_A },
+ { "NS", ARES_REC_TYPE_NS },
+ { "CNAME", ARES_REC_TYPE_CNAME },
+ { "SOA", ARES_REC_TYPE_SOA },
+ { "PTR", ARES_REC_TYPE_PTR },
+ { "HINFO", ARES_REC_TYPE_HINFO },
+ { "MX", ARES_REC_TYPE_MX },
+ { "TXT", ARES_REC_TYPE_TXT },
+ { "AAAA", ARES_REC_TYPE_AAAA },
+ { "SRV", ARES_REC_TYPE_SRV },
+ { "NAPTR", ARES_REC_TYPE_NAPTR },
+ { "OPT", ARES_REC_TYPE_OPT },
+ { "TLSA", ARES_REC_TYPE_TLSA },
+ { "SVCB", ARES_REC_TYPE_SVCB },
+ { "HTTPS", ARES_REC_TYPE_HTTPS },
+ { "ANY", ARES_REC_TYPE_ANY },
+ { "URI", ARES_REC_TYPE_URI },
+ { "CAA", ARES_REC_TYPE_CAA },
+ { "RAW_RR", ARES_REC_TYPE_RAW_RR},
+ { NULL, 0 }
+ };
+
+ if (qtype == NULL || str == NULL) {
+ return ARES_FALSE;
+ }
+
+ for (i = 0; list[i].name != NULL; i++) {
+ if (strcasecmp(list[i].name, str) == 0) {
+ *qtype = list[i].type;
+ return ARES_TRUE;
+ }
+ }
+ return ARES_FALSE;
+}
+
+const char *ares_dns_section_tostr(ares_dns_section_t section)
+{
+ switch (section) {
+ case ARES_SECTION_ANSWER:
+ return "ANSWER";
+ case ARES_SECTION_AUTHORITY:
+ return "AUTHORITY";
+ case ARES_SECTION_ADDITIONAL:
+ return "ADDITIONAL";
+ }
+ return "UNKNOWN";
+}
+
+static ares_dns_opt_datatype_t ares_dns_opt_get_type_opt(unsigned short opt)
+{
+ ares_opt_param_t param = (ares_opt_param_t)opt;
+ switch (param) {
+ case ARES_OPT_PARAM_LLQ:
+ /* Really it is u16 version, u16 opcode, u16 error, u64 id, u32 lease */
+ return ARES_OPT_DATATYPE_BIN;
+ case ARES_OPT_PARAM_UL:
+ return ARES_OPT_DATATYPE_U32;
+ case ARES_OPT_PARAM_NSID:
+ return ARES_OPT_DATATYPE_BIN;
+ case ARES_OPT_PARAM_DAU:
+ return ARES_OPT_DATATYPE_U8_LIST;
+ case ARES_OPT_PARAM_DHU:
+ return ARES_OPT_DATATYPE_U8_LIST;
+ case ARES_OPT_PARAM_N3U:
+ return ARES_OPT_DATATYPE_U8_LIST;
+ case ARES_OPT_PARAM_EDNS_CLIENT_SUBNET:
+ /* Really it is a u16 address family, u8 source prefix length,
+ * u8 scope prefix length, address */
+ return ARES_OPT_DATATYPE_BIN;
+ case ARES_OPT_PARAM_EDNS_EXPIRE:
+ return ARES_OPT_DATATYPE_U32;
+ case ARES_OPT_PARAM_COOKIE:
+ /* 8 bytes for client, 16-40 bytes for server */
+ return ARES_OPT_DATATYPE_BIN;
+ case ARES_OPT_PARAM_EDNS_TCP_KEEPALIVE:
+ /* Timeout in 100ms intervals */
+ return ARES_OPT_DATATYPE_U16;
+ case ARES_OPT_PARAM_PADDING:
+ /* Arbitrary padding */
+ return ARES_OPT_DATATYPE_BIN;
+ case ARES_OPT_PARAM_CHAIN:
+ return ARES_OPT_DATATYPE_NAME;
+ case ARES_OPT_PARAM_EDNS_KEY_TAG:
+ return ARES_OPT_DATATYPE_U16_LIST;
+ case ARES_OPT_PARAM_EXTENDED_DNS_ERROR:
+ /* Really 16bit code followed by textual message */
+ return ARES_OPT_DATATYPE_BIN;
+ }
+ return ARES_OPT_DATATYPE_BIN;
+}
+
+static ares_dns_opt_datatype_t ares_dns_opt_get_type_svcb(unsigned short opt)
+{
+ ares_svcb_param_t param = (ares_svcb_param_t)opt;
+ switch (param) {
+ case ARES_SVCB_PARAM_NO_DEFAULT_ALPN:
+ return ARES_OPT_DATATYPE_NONE;
+ case ARES_SVCB_PARAM_ECH:
+ return ARES_OPT_DATATYPE_BIN;
+ case ARES_SVCB_PARAM_MANDATORY:
+ return ARES_OPT_DATATYPE_U16_LIST;
+ case ARES_SVCB_PARAM_ALPN:
+ return ARES_OPT_DATATYPE_STR_LIST;
+ case ARES_SVCB_PARAM_PORT:
+ return ARES_OPT_DATATYPE_U16;
+ case ARES_SVCB_PARAM_IPV4HINT:
+ return ARES_OPT_DATATYPE_INADDR4_LIST;
+ case ARES_SVCB_PARAM_IPV6HINT:
+ return ARES_OPT_DATATYPE_INADDR6_LIST;
+ }
+ return ARES_OPT_DATATYPE_BIN;
+}
+
+ares_dns_opt_datatype_t ares_dns_opt_get_datatype(ares_dns_rr_key_t key,
+ unsigned short opt)
+{
+ switch (key) {
+ case ARES_RR_OPT_OPTIONS:
+ return ares_dns_opt_get_type_opt(opt);
+ case ARES_RR_SVCB_PARAMS:
+ case ARES_RR_HTTPS_PARAMS:
+ return ares_dns_opt_get_type_svcb(opt);
+ default:
+ break;
+ }
+ return ARES_OPT_DATATYPE_BIN;
+}
+
+static const char *ares_dns_opt_get_name_opt(unsigned short opt)
+{
+ ares_opt_param_t param = (ares_opt_param_t)opt;
+ switch (param) {
+ case ARES_OPT_PARAM_LLQ:
+ return "LLQ";
+ case ARES_OPT_PARAM_UL:
+ return "UL";
+ case ARES_OPT_PARAM_NSID:
+ return "NSID";
+ case ARES_OPT_PARAM_DAU:
+ return "DAU";
+ case ARES_OPT_PARAM_DHU:
+ return "DHU";
+ case ARES_OPT_PARAM_N3U:
+ return "N3U";
+ case ARES_OPT_PARAM_EDNS_CLIENT_SUBNET:
+ return "edns-client-subnet";
+ case ARES_OPT_PARAM_EDNS_EXPIRE:
+ return "edns-expire";
+ case ARES_OPT_PARAM_COOKIE:
+ return "COOKIE";
+ case ARES_OPT_PARAM_EDNS_TCP_KEEPALIVE:
+ return "edns-tcp-keepalive";
+ case ARES_OPT_PARAM_PADDING:
+ return "Padding";
+ case ARES_OPT_PARAM_CHAIN:
+ return "CHAIN";
+ case ARES_OPT_PARAM_EDNS_KEY_TAG:
+ return "edns-key-tag";
+ case ARES_OPT_PARAM_EXTENDED_DNS_ERROR:
+ return "extended-dns-error";
+ }
+ return NULL;
+}
+
+static const char *ares_dns_opt_get_name_svcb(unsigned short opt)
+{
+ ares_svcb_param_t param = (ares_svcb_param_t)opt;
+ switch (param) {
+ case ARES_SVCB_PARAM_NO_DEFAULT_ALPN:
+ return "no-default-alpn";
+ case ARES_SVCB_PARAM_ECH:
+ return "ech";
+ case ARES_SVCB_PARAM_MANDATORY:
+ return "mandatory";
+ case ARES_SVCB_PARAM_ALPN:
+ return "alpn";
+ case ARES_SVCB_PARAM_PORT:
+ return "port";
+ case ARES_SVCB_PARAM_IPV4HINT:
+ return "ipv4hint";
+ case ARES_SVCB_PARAM_IPV6HINT:
+ return "ipv6hint";
+ }
+ return NULL;
+}
+
+const char *ares_dns_opt_get_name(ares_dns_rr_key_t key, unsigned short opt)
+{
+ switch (key) {
+ case ARES_RR_OPT_OPTIONS:
+ return ares_dns_opt_get_name_opt(opt);
+ case ARES_RR_SVCB_PARAMS:
+ case ARES_RR_HTTPS_PARAMS:
+ return ares_dns_opt_get_name_svcb(opt);
+ default:
+ break;
+ }
+ return NULL;
+}
+
+const char *ares_dns_rcode_tostr(ares_dns_rcode_t rcode)
+{
+ switch (rcode) {
+ case ARES_RCODE_NOERROR:
+ return "NOERROR";
+ case ARES_RCODE_FORMERR:
+ return "FORMERR";
+ case ARES_RCODE_SERVFAIL:
+ return "SERVFAIL";
+ case ARES_RCODE_NXDOMAIN:
+ return "NXDOMAIN";
+ case ARES_RCODE_NOTIMP:
+ return "NOTIMP";
+ case ARES_RCODE_REFUSED:
+ return "REFUSED";
+ case ARES_RCODE_YXDOMAIN:
+ return "YXDOMAIN";
+ case ARES_RCODE_YXRRSET:
+ return "YXRRSET";
+ case ARES_RCODE_NXRRSET:
+ return "NXRRSET";
+ case ARES_RCODE_NOTAUTH:
+ return "NOTAUTH";
+ case ARES_RCODE_NOTZONE:
+ return "NOTZONE";
+ case ARES_RCODE_DSOTYPEI:
+ return "DSOTYPEI";
+ case ARES_RCODE_BADSIG:
+ return "BADSIG";
+ case ARES_RCODE_BADKEY:
+ return "BADKEY";
+ case ARES_RCODE_BADTIME:
+ return "BADTIME";
+ case ARES_RCODE_BADMODE:
+ return "BADMODE";
+ case ARES_RCODE_BADNAME:
+ return "BADNAME";
+ case ARES_RCODE_BADALG:
+ return "BADALG";
+ case ARES_RCODE_BADTRUNC:
+ return "BADTRUNC";
+ case ARES_RCODE_BADCOOKIE:
+ return "BADCOOKIE";
+ }
+
+ return "UNKNOWN";
+}
+
+/* Convert an rcode and ancount from a query reply into an ares_status_t
+ * value. Used internally by ares_search() and ares_query().
+ */
+ares_status_t ares_dns_query_reply_tostatus(ares_dns_rcode_t rcode,
+ size_t ancount)
+{
+ ares_status_t status = ARES_SUCCESS;
+
+ switch (rcode) {
+ case ARES_RCODE_NOERROR:
+ status = (ancount > 0) ? ARES_SUCCESS : ARES_ENODATA;
+ break;
+ case ARES_RCODE_FORMERR:
+ status = ARES_EFORMERR;
+ break;
+ case ARES_RCODE_SERVFAIL:
+ status = ARES_ESERVFAIL;
+ break;
+ case ARES_RCODE_NXDOMAIN:
+ status = ARES_ENOTFOUND;
+ break;
+ case ARES_RCODE_NOTIMP:
+ status = ARES_ENOTIMP;
+ break;
+ case ARES_RCODE_REFUSED:
+ status = ARES_EREFUSED;
+ break;
+ default:
+ break;
+ }
+
+ return status;
+}
diff --git a/contrib/libs/c-ares/src/lib/ares_dns_name.c b/contrib/libs/c-ares/src/lib/ares_dns_name.c
new file mode 100644
index 0000000000..f4085ab2cb
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares_dns_name.c
@@ -0,0 +1,676 @@
+/* MIT License
+ *
+ * Copyright (c) 2023 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#include "ares_setup.h"
+#include "ares.h"
+#include "ares_private.h"
+
+typedef struct {
+ char *name;
+ size_t name_len;
+ size_t idx;
+} ares_nameoffset_t;
+
+static void ares__nameoffset_free(void *arg)
+{
+ ares_nameoffset_t *off = arg;
+ if (off == NULL) {
+ return;
+ }
+ ares_free(off->name);
+ ares_free(off);
+}
+
+static ares_status_t ares__nameoffset_create(ares__llist_t **list,
+ const char *name, size_t idx)
+{
+ ares_status_t status;
+ ares_nameoffset_t *off = NULL;
+
+ if (list == NULL || name == NULL || ares_strlen(name) == 0 ||
+ ares_strlen(name) > 255) {
+ return ARES_EFORMERR;
+ }
+
+ if (*list == NULL) {
+ *list = ares__llist_create(ares__nameoffset_free);
+ }
+ if (*list == NULL) {
+ status = ARES_ENOMEM;
+ goto fail;
+ }
+
+ off = ares_malloc_zero(sizeof(*off));
+ if (off == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ off->name = ares_strdup(name);
+ off->name_len = ares_strlen(off->name);
+ off->idx = idx;
+
+ if (ares__llist_insert_last(*list, off) == NULL) {
+ status = ARES_ENOMEM;
+ goto fail;
+ }
+
+ return ARES_SUCCESS;
+
+fail:
+ ares__nameoffset_free(off);
+ return status;
+}
+
+static const ares_nameoffset_t *ares__nameoffset_find(ares__llist_t *list,
+ const char *name)
+{
+ size_t name_len = ares_strlen(name);
+ ares__llist_node_t *node;
+ const ares_nameoffset_t *longest_match = NULL;
+
+ if (list == NULL || name == NULL || name_len == 0) {
+ return NULL;
+ }
+
+ for (node = ares__llist_node_first(list); node != NULL;
+ node = ares__llist_node_next(node)) {
+ const ares_nameoffset_t *val = ares__llist_node_val(node);
+ size_t prefix_len;
+
+ /* Can't be a match if the stored name is longer */
+ if (val->name_len > name_len) {
+ continue;
+ }
+
+ /* Can't be the longest match if our existing longest match is longer */
+ if (longest_match != NULL && longest_match->name_len > val->name_len) {
+ continue;
+ }
+
+ prefix_len = name_len - val->name_len;
+
+ if (strcasecmp(val->name, name + prefix_len) != 0) {
+ continue;
+ }
+
+ /* We need to make sure if `val->name` is "example.com" that name is
+ * is separated by a label, e.g. "myexample.com" is not ok, however
+ * "my.example.com" is, so we look for the preceding "." */
+ if (prefix_len != 0 && name[prefix_len - 1] != '.') {
+ continue;
+ }
+
+ longest_match = val;
+ }
+
+ return longest_match;
+}
+
+typedef struct {
+ ares__buf_t **label;
+ size_t num;
+} ares_dns_labels_t;
+
+static void ares_dns_labels_free(ares_dns_labels_t *labels)
+{
+ size_t i;
+
+ if (labels == NULL) {
+ return;
+ }
+
+ for (i = 0; i < labels->num; i++) {
+ ares__buf_destroy(labels->label[i]);
+ labels->label[i] = NULL;
+ }
+ ares_free(labels->label);
+ labels->label = NULL;
+ labels->num = 0;
+}
+
+static ares__buf_t *ares_dns_labels_add(ares_dns_labels_t *labels)
+{
+ void *temp;
+
+ if (labels == NULL) {
+ return NULL;
+ }
+
+ temp = ares_realloc_zero(labels->label, sizeof(*labels->label) * labels->num,
+ sizeof(*labels->label) * (labels->num + 1));
+ if (temp == NULL) {
+ return NULL;
+ }
+
+ labels->label = temp;
+
+ labels->label[labels->num] = ares__buf_create();
+ if (labels->label[labels->num] == NULL) {
+ return NULL;
+ }
+
+ labels->num++;
+ return labels->label[labels->num - 1];
+}
+
+static const ares__buf_t *
+ ares_dns_labels_get_last(const ares_dns_labels_t *labels)
+{
+ if (labels == NULL || labels->num == 0) {
+ return NULL;
+ }
+
+ return labels->label[labels->num - 1];
+}
+
+static void ares_dns_name_labels_del_last(ares_dns_labels_t *labels)
+{
+ if (labels == NULL || labels->num == 0) {
+ return;
+ }
+
+ ares__buf_destroy(labels->label[labels->num - 1]);
+ labels->label[labels->num - 1] = NULL;
+ labels->num--;
+}
+
+static ares_status_t ares_parse_dns_name_escape(ares__buf_t *namebuf,
+ ares__buf_t *label,
+ ares_bool_t validate_hostname)
+{
+ ares_status_t status;
+ unsigned char c;
+
+ status = ares__buf_fetch_bytes(namebuf, &c, 1);
+ if (status != ARES_SUCCESS) {
+ return ARES_EBADNAME;
+ }
+
+ /* If next character is a digit, read 2 more digits */
+ if (isdigit(c)) {
+ size_t i;
+ unsigned int val = 0;
+
+ val = c - '0';
+
+ for (i = 0; i < 2; i++) {
+ status = ares__buf_fetch_bytes(namebuf, &c, 1);
+ if (status != ARES_SUCCESS) {
+ return ARES_EBADNAME;
+ }
+
+ if (!isdigit(c)) {
+ return ARES_EBADNAME;
+ }
+ val *= 10;
+ val += c - '0';
+ }
+
+ /* Out of range */
+ if (val > 255) {
+ return ARES_EBADNAME;
+ }
+
+ if (validate_hostname && !ares__is_hostnamech((unsigned char)val)) {
+ return ARES_EBADNAME;
+ }
+
+ return ares__buf_append_byte(label, (unsigned char)val);
+ }
+
+ /* We can just output the character */
+ if (validate_hostname && !ares__is_hostnamech(c)) {
+ return ARES_EBADNAME;
+ }
+
+ return ares__buf_append_byte(label, c);
+}
+
+static ares_status_t ares_split_dns_name(ares_dns_labels_t *labels,
+ ares_bool_t validate_hostname,
+ const char *name)
+{
+ ares_status_t status;
+ ares__buf_t *label = NULL;
+ ares__buf_t *namebuf = NULL;
+ size_t i;
+ size_t total_len = 0;
+ unsigned char c;
+
+ if (name == NULL || labels == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ /* Put name into a buffer for parsing */
+ namebuf = ares__buf_create();
+ if (namebuf == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ if (*name != '\0') {
+ status =
+ ares__buf_append(namebuf, (const unsigned char *)name, ares_strlen(name));
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+
+ /* Start with 1 label */
+ label = ares_dns_labels_add(labels);
+ if (label == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ while (ares__buf_fetch_bytes(namebuf, &c, 1) == ARES_SUCCESS) {
+ /* New label */
+ if (c == '.') {
+ label = ares_dns_labels_add(labels);
+ if (label == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ continue;
+ }
+
+ /* Escape */
+ if (c == '\\') {
+ status = ares_parse_dns_name_escape(namebuf, label, validate_hostname);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ continue;
+ }
+
+ /* Output direct character */
+ if (validate_hostname && !ares__is_hostnamech(c)) {
+ status = ARES_EBADNAME;
+ goto done;
+ }
+
+ status = ares__buf_append_byte(label, c);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+
+ /* Remove trailing blank label */
+ if (ares__buf_len(ares_dns_labels_get_last(labels)) == 0) {
+ ares_dns_name_labels_del_last(labels);
+ }
+
+ /* If someone passed in "." there could have been 2 blank labels, check for
+ * that */
+ if (labels->num == 1 &&
+ ares__buf_len(ares_dns_labels_get_last(labels)) == 0) {
+ ares_dns_name_labels_del_last(labels);
+ }
+
+ /* Scan to make sure label lengths are valid */
+ for (i = 0; i < labels->num; i++) {
+ size_t len = ares__buf_len(labels->label[i]);
+ /* No 0-length labels, and no labels over 63 bytes */
+ if (len == 0 || len > 63) {
+ status = ARES_EBADNAME;
+ goto done;
+ }
+ total_len += len;
+ }
+
+ /* Can't exceed maximum (unescaped) length */
+ if (labels->num && total_len + labels->num - 1 > 255) {
+ status = ARES_EBADNAME;
+ goto done;
+ }
+
+ status = ARES_SUCCESS;
+
+done:
+ ares__buf_destroy(namebuf);
+ if (status != ARES_SUCCESS) {
+ ares_dns_labels_free(labels);
+ }
+ return status;
+}
+
+ares_status_t ares__dns_name_write(ares__buf_t *buf, ares__llist_t **list,
+ ares_bool_t validate_hostname,
+ const char *name)
+{
+ const ares_nameoffset_t *off = NULL;
+ size_t name_len;
+ size_t pos = ares__buf_len(buf);
+ ares_dns_labels_t labels;
+ char name_copy[512];
+ ares_status_t status;
+
+ if (buf == NULL || name == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ memset(&labels, 0, sizeof(labels));
+
+ /* NOTE: due to possible escaping, name_copy buffer is > 256 to allow for
+ * this */
+ name_len = ares_strcpy(name_copy, name, sizeof(name_copy));
+
+ /* Find longest match */
+ if (list != NULL) {
+ off = ares__nameoffset_find(*list, name_copy);
+ if (off != NULL && off->name_len != name_len) {
+ /* truncate */
+ name_len -= (off->name_len + 1);
+ name_copy[name_len] = 0;
+ }
+ }
+
+ /* Output labels */
+ if (off == NULL || off->name_len != name_len) {
+ size_t i;
+
+ status = ares_split_dns_name(&labels, validate_hostname, name_copy);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ for (i = 0; i < labels.num; i++) {
+ size_t len = 0;
+ const unsigned char *ptr = ares__buf_peek(labels.label[i], &len);
+
+ status = ares__buf_append_byte(buf, (unsigned char)(len & 0xFF));
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ status = ares__buf_append(buf, ptr, len);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+
+ /* If we are NOT jumping to another label, output terminator */
+ if (off == NULL) {
+ status = ares__buf_append_byte(buf, 0);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+ }
+
+ /* Output name compression offset jump */
+ if (off != NULL) {
+ unsigned short u16 =
+ (unsigned short)0xC000 | (unsigned short)(off->idx & 0x3FFF);
+ status = ares__buf_append_be16(buf, u16);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+
+ /* Store pointer for future jumps as long as its not an exact match for
+ * a prior entry */
+ if (list != NULL && (off == NULL || off->name_len != name_len) &&
+ name_len > 0) {
+ status = ares__nameoffset_create(list, name /* not truncated copy! */, pos);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+
+ status = ARES_SUCCESS;
+
+done:
+ ares_dns_labels_free(&labels);
+ return status;
+}
+
+/* Reserved characters for names that need to be escaped */
+static ares_bool_t is_reservedch(int ch)
+{
+ switch (ch) {
+ case '"':
+ case '.':
+ case ';':
+ case '\\':
+ case '(':
+ case ')':
+ case '@':
+ case '$':
+ return ARES_TRUE;
+ default:
+ break;
+ }
+
+ return ARES_FALSE;
+}
+
+static ares_status_t ares__fetch_dnsname_into_buf(ares__buf_t *buf,
+ ares__buf_t *dest, size_t len,
+ ares_bool_t is_hostname)
+{
+ size_t remaining_len;
+ const unsigned char *ptr = ares__buf_peek(buf, &remaining_len);
+ ares_status_t status;
+ size_t i;
+
+ if (buf == NULL || len == 0 || remaining_len < len) {
+ return ARES_EBADRESP;
+ }
+
+ for (i = 0; i < len; i++) {
+ unsigned char c = ptr[i];
+
+ /* Hostnames have a very specific allowed character set. Anything outside
+ * of that (non-printable and reserved included) are disallowed */
+ if (is_hostname && !ares__is_hostnamech(c)) {
+ status = ARES_EBADRESP;
+ goto fail;
+ }
+
+ /* NOTE: dest may be NULL if the user is trying to skip the name. validation
+ * still occurs above. */
+ if (dest == NULL) {
+ continue;
+ }
+
+ /* Non-printable characters need to be output as \DDD */
+ if (!ares__isprint(c)) {
+ unsigned char escape[4];
+
+ escape[0] = '\\';
+ escape[1] = '0' + (c / 100);
+ escape[2] = '0' + ((c % 100) / 10);
+ escape[3] = '0' + (c % 10);
+
+ status = ares__buf_append(dest, escape, sizeof(escape));
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ continue;
+ }
+
+ /* Reserved characters need to be escaped, otherwise normal */
+ if (is_reservedch(c)) {
+ status = ares__buf_append_byte(dest, '\\');
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+ }
+
+ status = ares__buf_append_byte(dest, c);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+
+ return ares__buf_consume(buf, len);
+
+fail:
+ return status;
+}
+
+ares_status_t ares__dns_name_parse(ares__buf_t *buf, char **name,
+ ares_bool_t is_hostname)
+{
+ size_t save_offset = 0;
+ unsigned char c;
+ ares_status_t status;
+ ares__buf_t *namebuf = NULL;
+ size_t label_start = ares__buf_get_position(buf);
+
+ if (buf == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ if (name != NULL) {
+ namebuf = ares__buf_create();
+ if (namebuf == NULL) {
+ status = ARES_ENOMEM;
+ goto fail;
+ }
+ }
+
+ /* The compression scheme allows a domain name in a message to be
+ * represented as either:
+ *
+ * - a sequence of labels ending in a zero octet
+ * - a pointer
+ * - a sequence of labels ending with a pointer
+ */
+ while (1) {
+ /* Keep track of the minimum label starting position to prevent forward
+ * jumping */
+ if (label_start > ares__buf_get_position(buf)) {
+ label_start = ares__buf_get_position(buf);
+ }
+
+ status = ares__buf_fetch_bytes(buf, &c, 1);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ /* Pointer/Redirect */
+ if ((c & 0xc0) == 0xc0) {
+ /* The pointer takes the form of a two octet sequence:
+ *
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ * | 1 1| OFFSET |
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *
+ * The first two bits are ones. This allows a pointer to be distinguished
+ * from a label, since the label must begin with two zero bits because
+ * labels are restricted to 63 octets or less. (The 10 and 01
+ * combinations are reserved for future use.) The OFFSET field specifies
+ * an offset from the start of the message (i.e., the first octet of the
+ * ID field in the domain header). A zero offset specifies the first byte
+ * of the ID field, etc.
+ */
+ size_t offset = (size_t)((c & 0x3F) << 8);
+
+ /* Fetch second byte of the redirect length */
+ status = ares__buf_fetch_bytes(buf, &c, 1);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ offset |= ((size_t)c);
+
+ /* According to RFC 1035 4.1.4:
+ * In this scheme, an entire domain name or a list of labels at
+ * the end of a domain name is replaced with a pointer to a prior
+ * occurrence of the same name.
+ * Note the word "prior", meaning it must go backwards. This was
+ * confirmed via the ISC BIND code that it also prevents forward
+ * pointers.
+ */
+ if (offset >= label_start) {
+ status = ARES_EBADNAME;
+ goto fail;
+ }
+
+ /* First time we make a jump, save the current position */
+ if (save_offset == 0) {
+ save_offset = ares__buf_get_position(buf);
+ }
+
+ status = ares__buf_set_position(buf, offset);
+ if (status != ARES_SUCCESS) {
+ status = ARES_EBADNAME;
+ goto fail;
+ }
+
+ continue;
+ } else if ((c & 0xc0) != 0) {
+ /* 10 and 01 are reserved */
+ status = ARES_EBADNAME;
+ goto fail;
+ } else if (c == 0) {
+ /* termination via zero octet*/
+ break;
+ }
+
+ /* New label */
+
+ /* Labels are separated by periods */
+ if (ares__buf_len(namebuf) != 0 && name != NULL) {
+ status = ares__buf_append_byte(namebuf, '.');
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+ }
+
+ status = ares__fetch_dnsname_into_buf(buf, namebuf, c, is_hostname);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+ }
+
+ /* Restore offset read after first redirect/pointer as this is where the DNS
+ * message continues */
+ if (save_offset) {
+ ares__buf_set_position(buf, save_offset);
+ }
+
+ if (name != NULL) {
+ *name = ares__buf_finish_str(namebuf, NULL);
+ if (*name == NULL) {
+ status = ARES_ENOMEM;
+ goto fail;
+ }
+ }
+
+ return ARES_SUCCESS;
+
+fail:
+ /* We want badname response if we couldn't parse */
+ if (status == ARES_EBADRESP) {
+ status = ARES_EBADNAME;
+ }
+
+ ares__buf_destroy(namebuf);
+ return status;
+}
diff --git a/contrib/libs/c-ares/src/lib/ares_dns_parse.c b/contrib/libs/c-ares/src/lib/ares_dns_parse.c
new file mode 100644
index 0000000000..169fd5b63d
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares_dns_parse.c
@@ -0,0 +1,1255 @@
+/* MIT License
+ *
+ * Copyright (c) 2023 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#include "ares_setup.h"
+#include "ares.h"
+#include "ares_private.h"
+#include <limits.h>
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+
+static size_t ares_dns_rr_remaining_len(const ares__buf_t *buf, size_t orig_len,
+ size_t rdlength)
+{
+ size_t used_len = orig_len - ares__buf_len(buf);
+ if (used_len >= rdlength) {
+ return 0;
+ }
+ return rdlength - used_len;
+}
+
+static ares_status_t ares_dns_parse_and_set_dns_name(ares__buf_t *buf,
+ ares_bool_t is_hostname,
+ ares_dns_rr_t *rr,
+ ares_dns_rr_key_t key)
+{
+ ares_status_t status;
+ char *name = NULL;
+
+ status = ares__dns_name_parse(buf, &name, is_hostname);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ status = ares_dns_rr_set_str_own(rr, key, name);
+ if (status != ARES_SUCCESS) {
+ ares_free(name);
+ return status;
+ }
+ return ARES_SUCCESS;
+}
+
+static ares_status_t ares_dns_parse_and_set_dns_str(
+ ares__buf_t *buf, size_t max_len, ares_bool_t allow_multiple,
+ ares_dns_rr_t *rr, ares_dns_rr_key_t key, ares_bool_t blank_allowed)
+{
+ ares_status_t status;
+ char *str = NULL;
+
+ status = ares__buf_parse_dns_str(buf, max_len, &str, allow_multiple);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ if (!blank_allowed && ares_strlen(str) == 0) {
+ ares_free(str);
+ return ARES_EBADRESP;
+ }
+
+ status = ares_dns_rr_set_str_own(rr, key, str);
+ if (status != ARES_SUCCESS) {
+ ares_free(str);
+ return status;
+ }
+ return ARES_SUCCESS;
+}
+
+static ares_status_t
+ ares_dns_parse_and_set_dns_binstr(ares__buf_t *buf, size_t max_len,
+ ares_bool_t allow_multiple,
+ ares_dns_rr_t *rr, ares_dns_rr_key_t key)
+{
+ ares_status_t status;
+ unsigned char *bin = NULL;
+ size_t bin_len = 0;
+
+ status =
+ ares__buf_parse_dns_binstr(buf, max_len, &bin, &bin_len, allow_multiple);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ status = ares_dns_rr_set_bin_own(rr, key, bin, bin_len);
+ if (status != ARES_SUCCESS) {
+ ares_free(bin);
+ return status;
+ }
+ return ARES_SUCCESS;
+}
+
+static ares_status_t ares_dns_parse_and_set_be32(ares__buf_t *buf,
+ ares_dns_rr_t *rr,
+ ares_dns_rr_key_t key)
+{
+ ares_status_t status;
+ unsigned int u32;
+
+ status = ares__buf_fetch_be32(buf, &u32);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ return ares_dns_rr_set_u32(rr, key, u32);
+}
+
+static ares_status_t ares_dns_parse_and_set_be16(ares__buf_t *buf,
+ ares_dns_rr_t *rr,
+ ares_dns_rr_key_t key)
+{
+ ares_status_t status;
+ unsigned short u16;
+
+ status = ares__buf_fetch_be16(buf, &u16);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ return ares_dns_rr_set_u16(rr, key, u16);
+}
+
+static ares_status_t ares_dns_parse_and_set_u8(ares__buf_t *buf,
+ ares_dns_rr_t *rr,
+ ares_dns_rr_key_t key)
+{
+ ares_status_t status;
+ unsigned char u8;
+
+ status = ares__buf_fetch_bytes(buf, &u8, 1);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ return ares_dns_rr_set_u8(rr, key, u8);
+}
+
+static ares_status_t ares_dns_parse_rr_a(ares__buf_t *buf, ares_dns_rr_t *rr,
+ size_t rdlength)
+{
+ struct in_addr addr;
+ ares_status_t status;
+
+ (void)rdlength; /* Not needed */
+
+ status = ares__buf_fetch_bytes(buf, (unsigned char *)&addr, sizeof(addr));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ return ares_dns_rr_set_addr(rr, ARES_RR_A_ADDR, &addr);
+}
+
+static ares_status_t ares_dns_parse_rr_ns(ares__buf_t *buf, ares_dns_rr_t *rr,
+ size_t rdlength)
+{
+ (void)rdlength; /* Not needed */
+
+ return ares_dns_parse_and_set_dns_name(buf, ARES_FALSE, rr,
+ ARES_RR_NS_NSDNAME);
+}
+
+static ares_status_t ares_dns_parse_rr_cname(ares__buf_t *buf,
+ ares_dns_rr_t *rr, size_t rdlength)
+{
+ (void)rdlength; /* Not needed */
+
+ return ares_dns_parse_and_set_dns_name(buf, ARES_FALSE, rr,
+ ARES_RR_CNAME_CNAME);
+}
+
+static ares_status_t ares_dns_parse_rr_soa(ares__buf_t *buf, ares_dns_rr_t *rr,
+ size_t rdlength)
+{
+ ares_status_t status;
+
+ (void)rdlength; /* Not needed */
+
+ /* MNAME */
+ status =
+ ares_dns_parse_and_set_dns_name(buf, ARES_FALSE, rr, ARES_RR_SOA_MNAME);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* RNAME */
+ status =
+ ares_dns_parse_and_set_dns_name(buf, ARES_FALSE, rr, ARES_RR_SOA_RNAME);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* SERIAL */
+ status = ares_dns_parse_and_set_be32(buf, rr, ARES_RR_SOA_SERIAL);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* REFRESH */
+ status = ares_dns_parse_and_set_be32(buf, rr, ARES_RR_SOA_REFRESH);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* RETRY */
+ status = ares_dns_parse_and_set_be32(buf, rr, ARES_RR_SOA_RETRY);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* EXPIRE */
+ status = ares_dns_parse_and_set_be32(buf, rr, ARES_RR_SOA_EXPIRE);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* MINIMUM */
+ return ares_dns_parse_and_set_be32(buf, rr, ARES_RR_SOA_MINIMUM);
+}
+
+static ares_status_t ares_dns_parse_rr_ptr(ares__buf_t *buf, ares_dns_rr_t *rr,
+ size_t rdlength)
+{
+ (void)rdlength; /* Not needed */
+
+ return ares_dns_parse_and_set_dns_name(buf, ARES_FALSE, rr,
+ ARES_RR_PTR_DNAME);
+}
+
+static ares_status_t ares_dns_parse_rr_hinfo(ares__buf_t *buf,
+ ares_dns_rr_t *rr, size_t rdlength)
+{
+ ares_status_t status;
+ size_t orig_len = ares__buf_len(buf);
+
+ (void)rdlength; /* Not needed */
+
+ /* CPU */
+ status = ares_dns_parse_and_set_dns_str(
+ buf, ares_dns_rr_remaining_len(buf, orig_len, rdlength), ARES_FALSE, rr,
+ ARES_RR_HINFO_CPU, ARES_TRUE);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* OS */
+ status = ares_dns_parse_and_set_dns_str(
+ buf, ares_dns_rr_remaining_len(buf, orig_len, rdlength), ARES_FALSE, rr,
+ ARES_RR_HINFO_OS, ARES_TRUE);
+
+ return status;
+}
+
+static ares_status_t ares_dns_parse_rr_mx(ares__buf_t *buf, ares_dns_rr_t *rr,
+ size_t rdlength)
+{
+ ares_status_t status;
+
+ (void)rdlength; /* Not needed */
+
+ /* PREFERENCE */
+ status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_MX_PREFERENCE);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* EXCHANGE */
+ return ares_dns_parse_and_set_dns_name(buf, ARES_FALSE, rr,
+ ARES_RR_MX_EXCHANGE);
+}
+
+static ares_status_t ares_dns_parse_rr_txt(ares__buf_t *buf, ares_dns_rr_t *rr,
+ size_t rdlength)
+{
+ return ares_dns_parse_and_set_dns_binstr(buf, rdlength, ARES_TRUE, rr,
+ ARES_RR_TXT_DATA);
+}
+
+static ares_status_t ares_dns_parse_rr_aaaa(ares__buf_t *buf, ares_dns_rr_t *rr,
+ size_t rdlength)
+{
+ struct ares_in6_addr addr;
+ ares_status_t status;
+
+ (void)rdlength; /* Not needed */
+
+ status = ares__buf_fetch_bytes(buf, (unsigned char *)&addr, sizeof(addr));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ return ares_dns_rr_set_addr6(rr, ARES_RR_AAAA_ADDR, &addr);
+}
+
+static ares_status_t ares_dns_parse_rr_srv(ares__buf_t *buf, ares_dns_rr_t *rr,
+ size_t rdlength)
+{
+ ares_status_t status;
+
+ (void)rdlength; /* Not needed */
+
+ /* PRIORITY */
+ status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_SRV_PRIORITY);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* WEIGHT */
+ status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_SRV_WEIGHT);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* PORT */
+ status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_SRV_PORT);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* TARGET */
+ return ares_dns_parse_and_set_dns_name(buf, ARES_FALSE, rr,
+ ARES_RR_SRV_TARGET);
+}
+
+static ares_status_t ares_dns_parse_rr_naptr(ares__buf_t *buf,
+ ares_dns_rr_t *rr, size_t rdlength)
+{
+ ares_status_t status;
+ size_t orig_len = ares__buf_len(buf);
+
+ /* ORDER */
+ status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_NAPTR_ORDER);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* PREFERENCE */
+ status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_NAPTR_PREFERENCE);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* FLAGS */
+ status = ares_dns_parse_and_set_dns_str(
+ buf, ares_dns_rr_remaining_len(buf, orig_len, rdlength), ARES_FALSE, rr,
+ ARES_RR_NAPTR_FLAGS, ARES_TRUE);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* SERVICES */
+ status = ares_dns_parse_and_set_dns_str(
+ buf, ares_dns_rr_remaining_len(buf, orig_len, rdlength), ARES_FALSE, rr,
+ ARES_RR_NAPTR_SERVICES, ARES_TRUE);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* REGEXP */
+ status = ares_dns_parse_and_set_dns_str(
+ buf, ares_dns_rr_remaining_len(buf, orig_len, rdlength), ARES_FALSE, rr,
+ ARES_RR_NAPTR_REGEXP, ARES_TRUE);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* REPLACEMENT */
+ return ares_dns_parse_and_set_dns_name(buf, ARES_FALSE, rr,
+ ARES_RR_NAPTR_REPLACEMENT);
+}
+
+static ares_status_t ares_dns_parse_rr_opt(ares__buf_t *buf, ares_dns_rr_t *rr,
+ size_t rdlength,
+ unsigned short raw_class,
+ unsigned int raw_ttl)
+{
+ ares_status_t status;
+ size_t orig_len = ares__buf_len(buf);
+ unsigned short rcode_high;
+
+ status = ares_dns_rr_set_u16(rr, ARES_RR_OPT_UDP_SIZE, raw_class);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* First 8 bits of TTL are an extended RCODE, and they go in the higher order
+ * after the original 4-bit rcode */
+ rcode_high = (unsigned short)((raw_ttl >> 20) & 0x0FF0);
+ rr->parent->raw_rcode |= rcode_high;
+
+ status = ares_dns_rr_set_u8(rr, ARES_RR_OPT_VERSION,
+ (unsigned char)(raw_ttl >> 16) & 0xFF);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ status = ares_dns_rr_set_u16(rr, ARES_RR_OPT_FLAGS,
+ (unsigned short)(raw_ttl & 0xFFFF));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Parse options */
+ while (ares_dns_rr_remaining_len(buf, orig_len, rdlength)) {
+ unsigned short opt = 0;
+ unsigned short len = 0;
+ unsigned char *val = NULL;
+
+ /* Fetch be16 option */
+ status = ares__buf_fetch_be16(buf, &opt);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Fetch be16 length */
+ status = ares__buf_fetch_be16(buf, &len);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ if (len) {
+ status = ares__buf_fetch_bytes_dup(buf, len, ARES_TRUE, &val);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+
+ status = ares_dns_rr_set_opt_own(rr, ARES_RR_OPT_OPTIONS, opt, val, len);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+
+ return ARES_SUCCESS;
+}
+
+static ares_status_t ares_dns_parse_rr_tlsa(ares__buf_t *buf, ares_dns_rr_t *rr,
+ size_t rdlength)
+{
+ ares_status_t status;
+ size_t orig_len = ares__buf_len(buf);
+ size_t len;
+ unsigned char *data;
+
+ status = ares_dns_parse_and_set_u8(buf, rr, ARES_RR_TLSA_CERT_USAGE);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ status = ares_dns_parse_and_set_u8(buf, rr, ARES_RR_TLSA_SELECTOR);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ status = ares_dns_parse_and_set_u8(buf, rr, ARES_RR_TLSA_MATCH);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ len = ares_dns_rr_remaining_len(buf, orig_len, rdlength);
+ if (len == 0) {
+ return ARES_EBADRESP;
+ }
+
+ status = ares__buf_fetch_bytes_dup(buf, len, ARES_FALSE, &data);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ status = ares_dns_rr_set_bin_own(rr, ARES_RR_TLSA_DATA, data, len);
+ if (status != ARES_SUCCESS) {
+ ares_free(data);
+ return status;
+ }
+
+ return ARES_SUCCESS;
+}
+
+static ares_status_t ares_dns_parse_rr_svcb(ares__buf_t *buf, ares_dns_rr_t *rr,
+ size_t rdlength)
+{
+ ares_status_t status;
+ size_t orig_len = ares__buf_len(buf);
+
+ status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_SVCB_PRIORITY);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ status =
+ ares_dns_parse_and_set_dns_name(buf, ARES_FALSE, rr, ARES_RR_SVCB_TARGET);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Parse params */
+ while (ares_dns_rr_remaining_len(buf, orig_len, rdlength)) {
+ unsigned short opt = 0;
+ unsigned short len = 0;
+ unsigned char *val = NULL;
+
+ /* Fetch be16 option */
+ status = ares__buf_fetch_be16(buf, &opt);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Fetch be16 length */
+ status = ares__buf_fetch_be16(buf, &len);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ if (len) {
+ status = ares__buf_fetch_bytes_dup(buf, len, ARES_TRUE, &val);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+
+ status = ares_dns_rr_set_opt_own(rr, ARES_RR_SVCB_PARAMS, opt, val, len);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+
+ return ARES_SUCCESS;
+}
+
+static ares_status_t ares_dns_parse_rr_https(ares__buf_t *buf,
+ ares_dns_rr_t *rr, size_t rdlength)
+{
+ ares_status_t status;
+ size_t orig_len = ares__buf_len(buf);
+
+ status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_HTTPS_PRIORITY);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ status =
+ ares_dns_parse_and_set_dns_name(buf, ARES_FALSE, rr, ARES_RR_HTTPS_TARGET);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Parse params */
+ while (ares_dns_rr_remaining_len(buf, orig_len, rdlength)) {
+ unsigned short opt = 0;
+ unsigned short len = 0;
+ unsigned char *val = NULL;
+
+ /* Fetch be16 option */
+ status = ares__buf_fetch_be16(buf, &opt);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Fetch be16 length */
+ status = ares__buf_fetch_be16(buf, &len);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ if (len) {
+ status = ares__buf_fetch_bytes_dup(buf, len, ARES_TRUE, &val);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+
+ status = ares_dns_rr_set_opt_own(rr, ARES_RR_HTTPS_PARAMS, opt, val, len);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+
+ return ARES_SUCCESS;
+}
+
+static ares_status_t ares_dns_parse_rr_uri(ares__buf_t *buf, ares_dns_rr_t *rr,
+ size_t rdlength)
+{
+ char *name = NULL;
+ ares_status_t status;
+ size_t orig_len = ares__buf_len(buf);
+ size_t remaining_len;
+
+ /* PRIORITY */
+ status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_URI_PRIORITY);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* WEIGHT */
+ status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_URI_WEIGHT);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* TARGET -- not in string format, rest of buffer, required to be
+ * non-zero length */
+ remaining_len = ares_dns_rr_remaining_len(buf, orig_len, rdlength);
+ if (remaining_len == 0) {
+ status = ARES_EBADRESP;
+ return status;
+ }
+
+ /* NOTE: Not in DNS string format */
+ status = ares__buf_fetch_str_dup(buf, remaining_len, &name);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ status = ares_dns_rr_set_str_own(rr, ARES_RR_URI_TARGET, name);
+ if (status != ARES_SUCCESS) {
+ ares_free(name);
+ return status;
+ }
+ name = NULL;
+
+ return ARES_SUCCESS;
+}
+
+static ares_status_t ares_dns_parse_rr_caa(ares__buf_t *buf, ares_dns_rr_t *rr,
+ size_t rdlength)
+{
+ unsigned char *data = NULL;
+ size_t data_len = 0;
+ ares_status_t status;
+ size_t orig_len = ares__buf_len(buf);
+
+ /* CRITICAL */
+ status = ares_dns_parse_and_set_u8(buf, rr, ARES_RR_CAA_CRITICAL);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Tag */
+ status = ares_dns_parse_and_set_dns_str(
+ buf, ares_dns_rr_remaining_len(buf, orig_len, rdlength), ARES_FALSE, rr,
+ ARES_RR_CAA_TAG, ARES_FALSE);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Value - binary! (remaining buffer */
+ data_len = ares_dns_rr_remaining_len(buf, orig_len, rdlength);
+ if (data_len == 0) {
+ status = ARES_EBADRESP;
+ return status;
+ }
+ status = ares__buf_fetch_bytes_dup(buf, data_len, ARES_TRUE, &data);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ status = ares_dns_rr_set_bin_own(rr, ARES_RR_CAA_VALUE, data, data_len);
+ if (status != ARES_SUCCESS) {
+ ares_free(data);
+ return status;
+ }
+ data = NULL;
+
+ return ARES_SUCCESS;
+}
+
+static ares_status_t ares_dns_parse_rr_raw_rr(ares__buf_t *buf,
+ ares_dns_rr_t *rr,
+ size_t rdlength,
+ unsigned short raw_type)
+{
+ ares_status_t status;
+ unsigned char *bytes = NULL;
+
+ if (rdlength == 0) {
+ return ARES_SUCCESS;
+ }
+
+ status = ares__buf_fetch_bytes_dup(buf, rdlength, ARES_FALSE, &bytes);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Can't fail */
+ status = ares_dns_rr_set_u16(rr, ARES_RR_RAW_RR_TYPE, raw_type);
+ if (status != ARES_SUCCESS) {
+ ares_free(bytes);
+ return status;
+ }
+
+ status = ares_dns_rr_set_bin_own(rr, ARES_RR_RAW_RR_DATA, bytes, rdlength);
+ if (status != ARES_SUCCESS) {
+ ares_free(bytes);
+ return status;
+ }
+
+ return ARES_SUCCESS;
+}
+
+static ares_status_t ares_dns_parse_header(ares__buf_t *buf, unsigned int flags,
+ ares_dns_record_t **dnsrec,
+ unsigned short *qdcount,
+ unsigned short *ancount,
+ unsigned short *nscount,
+ unsigned short *arcount)
+{
+ ares_status_t status = ARES_EBADRESP;
+ unsigned short u16;
+ unsigned short id;
+ unsigned short dns_flags = 0;
+ ares_dns_opcode_t opcode;
+ unsigned short rcode;
+
+ (void)flags; /* currently unused */
+
+ if (buf == NULL || dnsrec == NULL || qdcount == NULL || ancount == NULL ||
+ nscount == NULL || arcount == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ *dnsrec = NULL;
+
+ /*
+ * RFC 1035 4.1.1. Header section format.
+ * and Updated by RFC 2065 to add AD and CD bits.
+ * 1 1 1 1 1 1
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ * | ID |
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ * |QR| Opcode |AA|TC|RD|RA| Z|AD|CD| RCODE |
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ * | QDCOUNT |
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ * | ANCOUNT |
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ * | NSCOUNT |
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ * | ARCOUNT |
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ */
+
+ /* ID */
+ status = ares__buf_fetch_be16(buf, &id);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ /* Flags */
+ status = ares__buf_fetch_be16(buf, &u16);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ /* QR */
+ if (u16 & 0x8000) {
+ dns_flags |= ARES_FLAG_QR;
+ }
+
+ /* OPCODE */
+ opcode = (u16 >> 11) & 0xf;
+
+ /* AA */
+ if (u16 & 0x400) {
+ dns_flags |= ARES_FLAG_AA;
+ }
+
+ /* TC */
+ if (u16 & 0x200) {
+ dns_flags |= ARES_FLAG_TC;
+ }
+
+ /* RD */
+ if (u16 & 0x100) {
+ dns_flags |= ARES_FLAG_RD;
+ }
+
+ /* RA */
+ if (u16 & 0x80) {
+ dns_flags |= ARES_FLAG_RA;
+ }
+
+ /* Z -- unused */
+
+ /* AD */
+ if (u16 & 0x20) {
+ dns_flags |= ARES_FLAG_AD;
+ }
+
+ /* CD */
+ if (u16 & 0x10) {
+ dns_flags |= ARES_FLAG_CD;
+ }
+
+ /* RCODE */
+ rcode = u16 & 0xf;
+
+ /* QDCOUNT */
+ status = ares__buf_fetch_be16(buf, qdcount);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ /* ANCOUNT */
+ status = ares__buf_fetch_be16(buf, ancount);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ /* NSCOUNT */
+ status = ares__buf_fetch_be16(buf, nscount);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ /* ARCOUNT */
+ status = ares__buf_fetch_be16(buf, arcount);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ status = ares_dns_record_create(dnsrec, id, dns_flags, opcode,
+ ARES_RCODE_NOERROR /* Temporary */);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ (*dnsrec)->raw_rcode = rcode;
+
+ if (*ancount > 0) {
+ status =
+ ares_dns_record_rr_prealloc(*dnsrec, ARES_SECTION_ANSWER, *ancount);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+ }
+
+ if (*nscount > 0) {
+ status =
+ ares_dns_record_rr_prealloc(*dnsrec, ARES_SECTION_AUTHORITY, *nscount);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+ }
+
+ if (*arcount > 0) {
+ status =
+ ares_dns_record_rr_prealloc(*dnsrec, ARES_SECTION_ADDITIONAL, *arcount);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+ }
+
+ return ARES_SUCCESS;
+
+fail:
+ ares_dns_record_destroy(*dnsrec);
+ *dnsrec = NULL;
+ *qdcount = 0;
+ *ancount = 0;
+ *nscount = 0;
+ *arcount = 0;
+
+ return status;
+}
+
+static ares_status_t
+ ares_dns_parse_rr_data(ares__buf_t *buf, size_t rdlength, ares_dns_rr_t *rr,
+ ares_dns_rec_type_t type, unsigned short raw_type,
+ unsigned short raw_class, unsigned int raw_ttl)
+{
+ switch (type) {
+ case ARES_REC_TYPE_A:
+ return ares_dns_parse_rr_a(buf, rr, rdlength);
+ case ARES_REC_TYPE_NS:
+ return ares_dns_parse_rr_ns(buf, rr, rdlength);
+ case ARES_REC_TYPE_CNAME:
+ return ares_dns_parse_rr_cname(buf, rr, rdlength);
+ case ARES_REC_TYPE_SOA:
+ return ares_dns_parse_rr_soa(buf, rr, rdlength);
+ case ARES_REC_TYPE_PTR:
+ return ares_dns_parse_rr_ptr(buf, rr, rdlength);
+ case ARES_REC_TYPE_HINFO:
+ return ares_dns_parse_rr_hinfo(buf, rr, rdlength);
+ case ARES_REC_TYPE_MX:
+ return ares_dns_parse_rr_mx(buf, rr, rdlength);
+ case ARES_REC_TYPE_TXT:
+ return ares_dns_parse_rr_txt(buf, rr, rdlength);
+ case ARES_REC_TYPE_AAAA:
+ return ares_dns_parse_rr_aaaa(buf, rr, rdlength);
+ case ARES_REC_TYPE_SRV:
+ return ares_dns_parse_rr_srv(buf, rr, rdlength);
+ case ARES_REC_TYPE_NAPTR:
+ return ares_dns_parse_rr_naptr(buf, rr, rdlength);
+ case ARES_REC_TYPE_ANY:
+ return ARES_EBADRESP;
+ case ARES_REC_TYPE_OPT:
+ return ares_dns_parse_rr_opt(buf, rr, rdlength, raw_class, raw_ttl);
+ case ARES_REC_TYPE_TLSA:
+ return ares_dns_parse_rr_tlsa(buf, rr, rdlength);
+ case ARES_REC_TYPE_SVCB:
+ return ares_dns_parse_rr_svcb(buf, rr, rdlength);
+ case ARES_REC_TYPE_HTTPS:
+ return ares_dns_parse_rr_https(buf, rr, rdlength);
+ case ARES_REC_TYPE_URI:
+ return ares_dns_parse_rr_uri(buf, rr, rdlength);
+ case ARES_REC_TYPE_CAA:
+ return ares_dns_parse_rr_caa(buf, rr, rdlength);
+ case ARES_REC_TYPE_RAW_RR:
+ return ares_dns_parse_rr_raw_rr(buf, rr, rdlength, raw_type);
+ }
+ return ARES_EFORMERR;
+}
+
+static ares_status_t ares_dns_parse_qd(ares__buf_t *buf,
+ ares_dns_record_t *dnsrec)
+{
+ char *name = NULL;
+ unsigned short u16;
+ ares_status_t status;
+ ares_dns_rec_type_t type;
+ ares_dns_class_t qclass;
+ /* The question section is used to carry the "question" in most queries,
+ * i.e., the parameters that define what is being asked. The section
+ * contains QDCOUNT (usually 1) entries, each of the following format:
+ * 1 1 1 1 1 1
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ * | |
+ * / QNAME /
+ * / /
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ * | QTYPE |
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ * | QCLASS |
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ */
+
+ /* Name */
+ status = ares__dns_name_parse(buf, &name, ARES_FALSE);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ /* Type */
+ status = ares__buf_fetch_be16(buf, &u16);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ type = u16;
+
+ /* Class */
+ status = ares__buf_fetch_be16(buf, &u16);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ qclass = u16;
+
+ /* Add question */
+ status = ares_dns_record_query_add(dnsrec, name, type, qclass);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+done:
+ ares_free(name);
+ return status;
+}
+
+static ares_status_t ares_dns_parse_rr(ares__buf_t *buf, unsigned int flags,
+ ares_dns_section_t sect,
+ ares_dns_record_t *dnsrec)
+{
+ char *name = NULL;
+ unsigned short u16;
+ unsigned short raw_type;
+ ares_status_t status;
+ ares_dns_rec_type_t type;
+ ares_dns_class_t qclass;
+ unsigned int ttl;
+ size_t rdlength;
+ ares_dns_rr_t *rr = NULL;
+ size_t remaining_len = 0;
+ size_t processed_len = 0;
+ ares_bool_t namecomp;
+
+ /* All RRs have the same top level format shown below:
+ * 1 1 1 1 1 1
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ * | |
+ * / /
+ * / NAME /
+ * | |
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ * | TYPE |
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ * | CLASS |
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ * | TTL |
+ * | |
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ * | RDLENGTH |
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--|
+ * / RDATA /
+ * / /
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ */
+
+ /* Name */
+ status = ares__dns_name_parse(buf, &name, ARES_FALSE);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ /* Type */
+ status = ares__buf_fetch_be16(buf, &u16);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ type = u16;
+ raw_type = u16; /* Only used for raw rr data */
+
+ /* Class */
+ status = ares__buf_fetch_be16(buf, &u16);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ qclass = u16;
+
+ /* TTL */
+ status = ares__buf_fetch_be32(buf, &ttl);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ /* Length */
+ status = ares__buf_fetch_be16(buf, &u16);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ rdlength = u16;
+
+ if (!ares_dns_rec_type_isvalid(type, ARES_FALSE)) {
+ type = ARES_REC_TYPE_RAW_RR;
+ }
+
+ namecomp = ares_dns_rec_type_allow_name_compression(type);
+ if (sect == ARES_SECTION_ANSWER &&
+ (flags &
+ (namecomp ? ARES_DNS_PARSE_AN_BASE_RAW : ARES_DNS_PARSE_AN_EXT_RAW))) {
+ type = ARES_REC_TYPE_RAW_RR;
+ }
+ if (sect == ARES_SECTION_AUTHORITY &&
+ (flags &
+ (namecomp ? ARES_DNS_PARSE_NS_BASE_RAW : ARES_DNS_PARSE_NS_EXT_RAW))) {
+ type = ARES_REC_TYPE_RAW_RR;
+ }
+ if (sect == ARES_SECTION_ADDITIONAL &&
+ (flags &
+ (namecomp ? ARES_DNS_PARSE_AR_BASE_RAW : ARES_DNS_PARSE_AR_EXT_RAW))) {
+ type = ARES_REC_TYPE_RAW_RR;
+ }
+
+ /* Pull into another buffer for safety */
+ if (rdlength > ares__buf_len(buf)) {
+ status = ARES_EBADRESP;
+ goto done;
+ }
+
+ /* Add the base rr */
+ status =
+ ares_dns_record_rr_add(&rr, dnsrec, sect, name, type,
+ type == ARES_REC_TYPE_OPT ? ARES_CLASS_IN : qclass,
+ type == ARES_REC_TYPE_OPT ? 0 : ttl);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ /* Record the current remaining length in the buffer so we can tell how
+ * much was processed */
+ remaining_len = ares__buf_len(buf);
+
+ /* Fill in the data for the rr */
+ status = ares_dns_parse_rr_data(buf, rdlength, rr, type, raw_type,
+ (unsigned short)qclass, ttl);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ /* Determine how many bytes were processed */
+ processed_len = remaining_len - ares__buf_len(buf);
+
+ /* If too many bytes were processed, error! */
+ if (processed_len > rdlength) {
+ status = ARES_EBADRESP;
+ goto done;
+ }
+
+ /* If too few bytes were processed, consume the unprocessed data for this
+ * record as the parser may not have wanted/needed to use it */
+ if (processed_len < rdlength) {
+ ares__buf_consume(buf, rdlength - processed_len);
+ }
+
+
+done:
+ ares_free(name);
+ return status;
+}
+
+static ares_status_t ares_dns_parse_buf(ares__buf_t *buf, unsigned int flags,
+ ares_dns_record_t **dnsrec)
+{
+ ares_status_t status;
+ unsigned short qdcount;
+ unsigned short ancount;
+ unsigned short nscount;
+ unsigned short arcount;
+ unsigned short i;
+
+ if (buf == NULL || dnsrec == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ /* Maximum DNS packet size is 64k, even over TCP */
+ if (ares__buf_len(buf) > 0xFFFF) {
+ return ARES_EFORMERR;
+ }
+
+ /* All communications inside of the domain protocol are carried in a single
+ * format called a message. The top level format of message is divided
+ * into 5 sections (some of which are empty in certain cases) shown below:
+ *
+ * +---------------------+
+ * | Header |
+ * +---------------------+
+ * | Question | the question for the name server
+ * +---------------------+
+ * | Answer | RRs answering the question
+ * +---------------------+
+ * | Authority | RRs pointing toward an authority
+ * +---------------------+
+ * | Additional | RRs holding additional information
+ * +---------------------+
+ */
+
+ /* Parse header */
+ status = ares_dns_parse_header(buf, flags, dnsrec, &qdcount, &ancount,
+ &nscount, &arcount);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ /* Must have questions */
+ if (qdcount == 0) {
+ status = ARES_EBADRESP;
+ goto fail;
+ }
+
+ /* XXX: this should be controlled by a flag in case we want to allow
+ * multiple questions. I think mDNS allows this */
+ if (qdcount > 1) {
+ status = ARES_EBADRESP;
+ goto fail;
+ }
+
+ /* Parse questions */
+ for (i = 0; i < qdcount; i++) {
+ status = ares_dns_parse_qd(buf, *dnsrec);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+ }
+
+ /* Parse Answers */
+ for (i = 0; i < ancount; i++) {
+ status = ares_dns_parse_rr(buf, flags, ARES_SECTION_ANSWER, *dnsrec);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+ }
+
+ /* Parse Authority */
+ for (i = 0; i < nscount; i++) {
+ status = ares_dns_parse_rr(buf, flags, ARES_SECTION_AUTHORITY, *dnsrec);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+ }
+
+ /* Parse Additional */
+ for (i = 0; i < arcount; i++) {
+ status = ares_dns_parse_rr(buf, flags, ARES_SECTION_ADDITIONAL, *dnsrec);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+ }
+
+ /* Finalize rcode now that if we have OPT it is processed */
+ if (!ares_dns_rcode_isvalid((*dnsrec)->raw_rcode)) {
+ (*dnsrec)->rcode = ARES_RCODE_SERVFAIL;
+ } else {
+ (*dnsrec)->rcode = (ares_dns_rcode_t)(*dnsrec)->raw_rcode;
+ }
+
+ return ARES_SUCCESS;
+
+fail:
+ ares_dns_record_destroy(*dnsrec);
+ *dnsrec = NULL;
+ return status;
+}
+
+ares_status_t ares_dns_parse(const unsigned char *buf, size_t buf_len,
+ unsigned int flags, ares_dns_record_t **dnsrec)
+{
+ ares__buf_t *parser = NULL;
+ ares_status_t status;
+
+ if (buf == NULL || buf_len == 0 || dnsrec == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ parser = ares__buf_create_const(buf, buf_len);
+ if (parser == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ status = ares_dns_parse_buf(parser, flags, dnsrec);
+ ares__buf_destroy(parser);
+
+ return status;
+}
diff --git a/contrib/libs/c-ares/src/lib/ares_dns_private.h b/contrib/libs/c-ares/src/lib/ares_dns_private.h
new file mode 100644
index 0000000000..3af4b3c992
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares_dns_private.h
@@ -0,0 +1,263 @@
+/* MIT License
+ *
+ * Copyright (c) 2023 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#ifndef __ARES_DNS_PRIVATE_H
+#define __ARES_DNS_PRIVATE_H
+
+ares_bool_t ares_dns_rec_type_allow_name_compression(ares_dns_rec_type_t type);
+ares_bool_t ares_dns_opcode_isvalid(ares_dns_opcode_t opcode);
+ares_bool_t ares_dns_rcode_isvalid(ares_dns_rcode_t rcode);
+ares_bool_t ares_dns_flags_arevalid(unsigned short flags);
+ares_bool_t ares_dns_rec_type_isvalid(ares_dns_rec_type_t type,
+ ares_bool_t is_query);
+ares_bool_t ares_dns_class_isvalid(ares_dns_class_t qclass,
+ ares_bool_t is_query);
+ares_bool_t ares_dns_section_isvalid(ares_dns_section_t sect);
+ares_status_t ares_dns_rr_set_str_own(ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key, char *val);
+ares_status_t ares_dns_rr_set_bin_own(ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key, unsigned char *val,
+ size_t len);
+ares_status_t ares_dns_rr_set_opt_own(ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key, unsigned short opt,
+ unsigned char *val, size_t val_len);
+ares_status_t ares_dns_record_rr_prealloc(ares_dns_record_t *dnsrec,
+ ares_dns_section_t sect, size_t cnt);
+ares_bool_t ares_dns_has_opt_rr(const ares_dns_record_t *rec);
+void ares_dns_record_write_ttl_decrement(ares_dns_record_t *dnsrec,
+ unsigned int ttl_decrement);
+
+/*! Create a DNS record object for a query. The arguments are the same as
+ * those for ares_create_query().
+ *
+ * \param[out] dnsrec DNS record object to create.
+ * \param[in] name NUL-terminated name for the query.
+ * \param[in] dnsclass Class for the query.
+ * \param[in] type Type for the query.
+ * \param[in] id Identifier for the query.
+ * \param[in] flags Flags for the query.
+ * \param[in] max_udp_size Maximum size of a UDP packet for EDNS.
+ * \return ARES_SUCCESS on success, otherwise an error code.
+ */
+ares_status_t
+ ares_dns_record_create_query(ares_dns_record_t **dnsrec, const char *name,
+ ares_dns_class_t dnsclass,
+ ares_dns_rec_type_t type, unsigned short id,
+ ares_dns_flags_t flags, size_t max_udp_size);
+
+/*! Convert the RCODE and ANCOUNT from a DNS query reply into a status code.
+ *
+ * \param[in] rcode The RCODE from the reply.
+ * \param[in] ancount The ANCOUNT from the reply.
+ * \return An appropriate status code.
+ */
+ares_status_t ares_dns_query_reply_tostatus(ares_dns_rcode_t rcode,
+ size_t ancount);
+
+struct ares_dns_qd {
+ char *name;
+ ares_dns_rec_type_t qtype;
+ ares_dns_class_t qclass;
+};
+
+typedef struct {
+ struct in_addr addr;
+} ares__dns_a_t;
+
+typedef struct {
+ char *nsdname;
+} ares__dns_ns_t;
+
+typedef struct {
+ char *cname;
+} ares__dns_cname_t;
+
+typedef struct {
+ char *mname;
+ char *rname;
+ unsigned int serial;
+ unsigned int refresh;
+ unsigned int retry;
+ unsigned int expire;
+ unsigned int minimum;
+} ares__dns_soa_t;
+
+typedef struct {
+ char *dname;
+} ares__dns_ptr_t;
+
+typedef struct {
+ char *cpu;
+ char *os;
+} ares__dns_hinfo_t;
+
+typedef struct {
+ unsigned short preference;
+ char *exchange;
+} ares__dns_mx_t;
+
+typedef struct {
+ char *data;
+ size_t data_len;
+} ares__dns_txt_t;
+
+typedef struct {
+ struct ares_in6_addr addr;
+} ares__dns_aaaa_t;
+
+typedef struct {
+ unsigned short priority;
+ unsigned short weight;
+ unsigned short port;
+ char *target;
+} ares__dns_srv_t;
+
+typedef struct {
+ unsigned short order;
+ unsigned short preference;
+ char *flags;
+ char *services;
+ char *regexp;
+ char *replacement;
+} ares__dns_naptr_t;
+
+typedef struct {
+ unsigned short opt;
+ unsigned char *val;
+ size_t val_len;
+} ares__dns_optval_t;
+
+typedef struct {
+ ares__dns_optval_t *optval; /*!< Attribute/value pairs */
+ size_t cnt; /*!< Count of Attribute/Value pairs */
+ size_t alloc; /*!< Allocated count of attribute/value
+ * pairs */
+} ares__dns_options_t;
+
+typedef struct {
+ unsigned short udp_size; /*!< taken from class */
+ unsigned char version; /*!< taken from bits 8-16 of ttl */
+ unsigned short flags; /*!< Flags, remaining 16 bits, though only
+ * 1 currently defined */
+ ares__dns_options_t *options; /*!< Attribute/Value pairs */
+} ares__dns_opt_t;
+
+typedef struct {
+ unsigned char cert_usage;
+ unsigned char selector;
+ unsigned char match;
+ unsigned char *data;
+ size_t data_len;
+} ares__dns_tlsa_t;
+
+typedef struct {
+ unsigned short priority;
+ char *target;
+ ares__dns_options_t *params;
+} ares__dns_svcb_t;
+
+typedef struct {
+ unsigned short priority;
+ unsigned short weight;
+ char *target;
+} ares__dns_uri_t;
+
+typedef struct {
+ unsigned char critical;
+ char *tag;
+ unsigned char *value;
+ size_t value_len;
+} ares__dns_caa_t;
+
+/*! Raw, unparsed RR data */
+typedef struct {
+ unsigned short type; /*!< Not ares_rec_type_t because it likely isn't one
+ * of those values since it wasn't parsed */
+ unsigned char *data; /*!< Raw RR data */
+ size_t length; /*!< Length of raw RR data */
+} ares__dns_raw_rr_t;
+
+/*! DNS RR data structure */
+struct ares_dns_rr {
+ ares_dns_record_t *parent;
+ char *name;
+ ares_dns_rec_type_t type;
+ ares_dns_class_t rclass;
+ unsigned int ttl;
+
+ union {
+ ares__dns_a_t a;
+ ares__dns_ns_t ns;
+ ares__dns_cname_t cname;
+ ares__dns_soa_t soa;
+ ares__dns_ptr_t ptr;
+ ares__dns_hinfo_t hinfo;
+ ares__dns_mx_t mx;
+ ares__dns_txt_t txt;
+ ares__dns_aaaa_t aaaa;
+ ares__dns_srv_t srv;
+ ares__dns_naptr_t naptr;
+ ares__dns_opt_t opt;
+ ares__dns_tlsa_t tlsa;
+ ares__dns_svcb_t svcb;
+ ares__dns_svcb_t https; /*!< https is a type of svcb, so this is right */
+ ares__dns_uri_t uri;
+ ares__dns_caa_t caa;
+ ares__dns_raw_rr_t raw_rr;
+ } r;
+};
+
+/*! DNS data structure */
+struct ares_dns_record {
+ unsigned short id; /*!< DNS query id */
+ unsigned short flags; /*!< One or more ares_dns_flags_t */
+ ares_dns_opcode_t opcode; /*!< DNS Opcode */
+ ares_dns_rcode_t rcode; /*!< DNS RCODE */
+ unsigned short raw_rcode; /*!< Raw rcode, used to ultimately form real
+ * rcode after reading OPT record if it
+ * exists */
+ unsigned int ttl_decrement; /*!< Special case to apply to writing out
+ * this record, where it will decrement
+ * the ttl of any resource records by
+ * this amount. Used for cache */
+
+ ares_dns_qd_t *qd;
+ size_t qdcount;
+ size_t qdalloc;
+
+ ares_dns_rr_t *an;
+ size_t ancount;
+ size_t analloc;
+
+ ares_dns_rr_t *ns;
+ size_t nscount;
+ size_t nsalloc;
+
+ ares_dns_rr_t *ar;
+ size_t arcount;
+ size_t aralloc;
+};
+
+#endif
diff --git a/contrib/libs/c-ares/src/lib/ares_dns_record.c b/contrib/libs/c-ares/src/lib/ares_dns_record.c
new file mode 100644
index 0000000000..ec7f7e7343
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares_dns_record.c
@@ -0,0 +1,1449 @@
+/* MIT License
+ *
+ * Copyright (c) 2023 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#include "ares_setup.h"
+#include "ares.h"
+#include "ares_private.h"
+#include <limits.h>
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+
+
+ares_status_t ares_dns_record_create(ares_dns_record_t **dnsrec,
+ unsigned short id, unsigned short flags,
+ ares_dns_opcode_t opcode,
+ ares_dns_rcode_t rcode)
+{
+ if (dnsrec == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ *dnsrec = NULL;
+
+ if (!ares_dns_opcode_isvalid(opcode) || !ares_dns_rcode_isvalid(rcode) ||
+ !ares_dns_flags_arevalid(flags)) {
+ return ARES_EFORMERR;
+ }
+
+ *dnsrec = ares_malloc_zero(sizeof(**dnsrec));
+ if (*dnsrec == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ (*dnsrec)->id = id;
+ (*dnsrec)->flags = flags;
+ (*dnsrec)->opcode = opcode;
+ (*dnsrec)->rcode = rcode;
+ return ARES_SUCCESS;
+}
+
+unsigned short ares_dns_record_get_id(const ares_dns_record_t *dnsrec)
+{
+ if (dnsrec == NULL) {
+ return 0;
+ }
+ return dnsrec->id;
+}
+
+unsigned short ares_dns_record_get_flags(const ares_dns_record_t *dnsrec)
+{
+ if (dnsrec == NULL) {
+ return 0;
+ }
+ return dnsrec->flags;
+}
+
+ares_dns_opcode_t ares_dns_record_get_opcode(const ares_dns_record_t *dnsrec)
+{
+ if (dnsrec == NULL) {
+ return 0;
+ }
+ return dnsrec->opcode;
+}
+
+ares_dns_rcode_t ares_dns_record_get_rcode(const ares_dns_record_t *dnsrec)
+{
+ if (dnsrec == NULL) {
+ return 0;
+ }
+ return dnsrec->rcode;
+}
+
+static void ares__dns_options_free(ares__dns_options_t *options)
+{
+ size_t i;
+
+ if (options == NULL) {
+ return;
+ }
+
+ for (i = 0; i < options->cnt; i++) {
+ ares_free(options->optval[i].val);
+ }
+ ares_free(options->optval);
+ ares_free(options);
+}
+
+static void ares__dns_rr_free(ares_dns_rr_t *rr)
+{
+ ares_free(rr->name);
+
+ switch (rr->type) {
+ case ARES_REC_TYPE_A:
+ case ARES_REC_TYPE_AAAA:
+ case ARES_REC_TYPE_ANY:
+ /* Nothing to free */
+ break;
+
+ case ARES_REC_TYPE_NS:
+ ares_free(rr->r.ns.nsdname);
+ break;
+
+ case ARES_REC_TYPE_CNAME:
+ ares_free(rr->r.cname.cname);
+ break;
+
+ case ARES_REC_TYPE_SOA:
+ ares_free(rr->r.soa.mname);
+ ares_free(rr->r.soa.rname);
+ break;
+
+ case ARES_REC_TYPE_PTR:
+ ares_free(rr->r.ptr.dname);
+ break;
+
+ case ARES_REC_TYPE_HINFO:
+ ares_free(rr->r.hinfo.cpu);
+ ares_free(rr->r.hinfo.os);
+ break;
+
+ case ARES_REC_TYPE_MX:
+ ares_free(rr->r.mx.exchange);
+ break;
+
+ case ARES_REC_TYPE_TXT:
+ ares_free(rr->r.txt.data);
+ break;
+
+ case ARES_REC_TYPE_SRV:
+ ares_free(rr->r.srv.target);
+ break;
+
+ case ARES_REC_TYPE_NAPTR:
+ ares_free(rr->r.naptr.flags);
+ ares_free(rr->r.naptr.services);
+ ares_free(rr->r.naptr.regexp);
+ ares_free(rr->r.naptr.replacement);
+ break;
+
+ case ARES_REC_TYPE_OPT:
+ ares__dns_options_free(rr->r.opt.options);
+ break;
+
+ case ARES_REC_TYPE_TLSA:
+ ares_free(rr->r.tlsa.data);
+ break;
+
+ case ARES_REC_TYPE_SVCB:
+ ares_free(rr->r.svcb.target);
+ ares__dns_options_free(rr->r.svcb.params);
+ break;
+
+ case ARES_REC_TYPE_HTTPS:
+ ares_free(rr->r.https.target);
+ ares__dns_options_free(rr->r.https.params);
+ break;
+
+ case ARES_REC_TYPE_URI:
+ ares_free(rr->r.uri.target);
+ break;
+
+ case ARES_REC_TYPE_CAA:
+ ares_free(rr->r.caa.tag);
+ ares_free(rr->r.caa.value);
+ break;
+
+ case ARES_REC_TYPE_RAW_RR:
+ ares_free(rr->r.raw_rr.data);
+ break;
+ }
+}
+
+void ares_dns_record_destroy(ares_dns_record_t *dnsrec)
+{
+ size_t i;
+
+ if (dnsrec == NULL) {
+ return;
+ }
+
+ /* Free questions */
+ for (i = 0; i < dnsrec->qdcount; i++) {
+ ares_free(dnsrec->qd[i].name);
+ }
+ ares_free(dnsrec->qd);
+
+ /* Free answers */
+ for (i = 0; i < dnsrec->ancount; i++) {
+ ares__dns_rr_free(&dnsrec->an[i]);
+ }
+ ares_free(dnsrec->an);
+
+ /* Free authority */
+ for (i = 0; i < dnsrec->nscount; i++) {
+ ares__dns_rr_free(&dnsrec->ns[i]);
+ }
+ ares_free(dnsrec->ns);
+
+ /* Free additional */
+ for (i = 0; i < dnsrec->arcount; i++) {
+ ares__dns_rr_free(&dnsrec->ar[i]);
+ }
+ ares_free(dnsrec->ar);
+
+ ares_free(dnsrec);
+}
+
+size_t ares_dns_record_query_cnt(const ares_dns_record_t *dnsrec)
+{
+ if (dnsrec == NULL) {
+ return 0;
+ }
+ return dnsrec->qdcount;
+}
+
+ares_status_t ares_dns_record_query_add(ares_dns_record_t *dnsrec,
+ const char *name,
+ ares_dns_rec_type_t qtype,
+ ares_dns_class_t qclass)
+{
+ ares_dns_qd_t *temp = NULL;
+ size_t idx;
+
+ if (dnsrec == NULL || name == NULL ||
+ !ares_dns_rec_type_isvalid(qtype, ARES_TRUE) ||
+ !ares_dns_class_isvalid(qclass, ARES_TRUE)) {
+ return ARES_EFORMERR;
+ }
+
+ if (dnsrec->qdcount >= dnsrec->qdalloc) {
+ size_t alloc_cnt = ares__round_up_pow2(dnsrec->qdcount + 1);
+
+ temp = ares_realloc_zero(dnsrec->qd, sizeof(*temp) * (dnsrec->qdalloc),
+ sizeof(*temp) * alloc_cnt);
+ if (temp == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ dnsrec->qdalloc = alloc_cnt;
+ dnsrec->qd = temp;
+ }
+
+ idx = dnsrec->qdcount;
+
+ dnsrec->qd[idx].name = ares_strdup(name);
+ if (dnsrec->qd[idx].name == NULL) {
+ /* No need to clean up anything */
+ return ARES_ENOMEM;
+ }
+
+ dnsrec->qd[idx].qtype = qtype;
+ dnsrec->qd[idx].qclass = qclass;
+ dnsrec->qdcount++;
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares_dns_record_query_set_name(ares_dns_record_t *dnsrec,
+ size_t idx, const char *name)
+{
+ char *orig_name = NULL;
+
+ if (dnsrec == NULL || idx >= dnsrec->qdcount || name == NULL) {
+ return ARES_EFORMERR;
+ }
+ orig_name = dnsrec->qd[idx].name;
+ dnsrec->qd[idx].name = ares_strdup(name);
+ if (dnsrec->qd[idx].name == NULL) {
+ dnsrec->qd[idx].name = orig_name;
+ return ARES_ENOMEM;
+ }
+
+ ares_free(orig_name);
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares_dns_record_query_set_type(ares_dns_record_t *dnsrec,
+ size_t idx,
+ ares_dns_rec_type_t qtype)
+{
+ if (dnsrec == NULL || idx >= dnsrec->qdcount ||
+ !ares_dns_rec_type_isvalid(qtype, ARES_TRUE)) {
+ return ARES_EFORMERR;
+ }
+
+ dnsrec->qd[idx].qtype = qtype;
+
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares_dns_record_query_get(const ares_dns_record_t *dnsrec,
+ size_t idx, const char **name,
+ ares_dns_rec_type_t *qtype,
+ ares_dns_class_t *qclass)
+{
+ if (dnsrec == NULL || idx >= dnsrec->qdcount) {
+ return ARES_EFORMERR;
+ }
+
+ if (name != NULL) {
+ *name = dnsrec->qd[idx].name;
+ }
+
+ if (qtype != NULL) {
+ *qtype = dnsrec->qd[idx].qtype;
+ }
+
+ if (qclass != NULL) {
+ *qclass = dnsrec->qd[idx].qclass;
+ }
+
+ return ARES_SUCCESS;
+}
+
+size_t ares_dns_record_rr_cnt(const ares_dns_record_t *dnsrec,
+ ares_dns_section_t sect)
+{
+ if (dnsrec == NULL || !ares_dns_section_isvalid(sect)) {
+ return 0;
+ }
+
+ switch (sect) {
+ case ARES_SECTION_ANSWER:
+ return dnsrec->ancount;
+ case ARES_SECTION_AUTHORITY:
+ return dnsrec->nscount;
+ case ARES_SECTION_ADDITIONAL:
+ return dnsrec->arcount;
+ }
+
+ return 0;
+}
+
+ares_status_t ares_dns_record_rr_prealloc(ares_dns_record_t *dnsrec,
+ ares_dns_section_t sect, size_t cnt)
+{
+ ares_dns_rr_t **rr_ptr = NULL;
+ size_t *rr_alloc = NULL;
+ ares_dns_rr_t *temp = NULL;
+
+ if (dnsrec == NULL || cnt == 0 || !ares_dns_section_isvalid(sect)) {
+ return ARES_EFORMERR;
+ }
+
+ switch (sect) {
+ case ARES_SECTION_ANSWER:
+ rr_ptr = &dnsrec->an;
+ rr_alloc = &dnsrec->analloc;
+ break;
+ case ARES_SECTION_AUTHORITY:
+ rr_ptr = &dnsrec->ns;
+ rr_alloc = &dnsrec->nsalloc;
+ break;
+ case ARES_SECTION_ADDITIONAL:
+ rr_ptr = &dnsrec->ar;
+ rr_alloc = &dnsrec->aralloc;
+ break;
+ }
+
+ /* Round up cnt to a power of 2 */
+ cnt = ares__round_up_pow2(cnt);
+
+ /* Already have that */
+ if (cnt <= *rr_alloc) {
+ return ARES_SUCCESS;
+ }
+
+ temp = ares_realloc_zero(*rr_ptr, sizeof(*temp) * (*rr_alloc),
+ sizeof(*temp) * cnt);
+ if (temp == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ *rr_alloc = cnt;
+ *rr_ptr = temp;
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares_dns_record_rr_add(ares_dns_rr_t **rr_out,
+ ares_dns_record_t *dnsrec,
+ ares_dns_section_t sect, const char *name,
+ ares_dns_rec_type_t type,
+ ares_dns_class_t rclass, unsigned int ttl)
+{
+ ares_dns_rr_t **rr_ptr = NULL;
+ ares_dns_rr_t *rr = NULL;
+ size_t *rr_len = NULL;
+ ares_status_t status;
+ size_t idx;
+
+ if (dnsrec == NULL || name == NULL || rr_out == NULL ||
+ !ares_dns_section_isvalid(sect) ||
+ !ares_dns_rec_type_isvalid(type, ARES_FALSE) ||
+ !ares_dns_class_isvalid(rclass, ARES_FALSE)) {
+ return ARES_EFORMERR;
+ }
+
+ *rr_out = NULL;
+
+ switch (sect) {
+ case ARES_SECTION_ANSWER:
+ rr_ptr = &dnsrec->an;
+ rr_len = &dnsrec->ancount;
+ break;
+ case ARES_SECTION_AUTHORITY:
+ rr_ptr = &dnsrec->ns;
+ rr_len = &dnsrec->nscount;
+ break;
+ case ARES_SECTION_ADDITIONAL:
+ rr_ptr = &dnsrec->ar;
+ rr_len = &dnsrec->arcount;
+ break;
+ }
+
+ status = ares_dns_record_rr_prealloc(dnsrec, sect, *rr_len + 1);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ idx = *rr_len;
+ rr = &(*rr_ptr)[idx];
+
+ rr->name = ares_strdup(name);
+ if (rr->name == NULL) {
+ /* No need to clean up anything */
+ return ARES_ENOMEM;
+ }
+
+ rr->parent = dnsrec;
+ rr->type = type;
+ rr->rclass = rclass;
+ rr->ttl = ttl;
+ (*rr_len)++;
+
+ *rr_out = rr;
+
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares_dns_record_rr_del(ares_dns_record_t *dnsrec,
+ ares_dns_section_t sect, size_t idx)
+{
+ ares_dns_rr_t *rr_ptr = NULL;
+ size_t *rr_len = NULL;
+ size_t cnt_after;
+
+ if (dnsrec == NULL || !ares_dns_section_isvalid(sect)) {
+ return ARES_EFORMERR;
+ }
+
+ switch (sect) {
+ case ARES_SECTION_ANSWER:
+ rr_ptr = dnsrec->an;
+ rr_len = &dnsrec->ancount;
+ break;
+ case ARES_SECTION_AUTHORITY:
+ rr_ptr = dnsrec->ns;
+ rr_len = &dnsrec->nscount;
+ break;
+ case ARES_SECTION_ADDITIONAL:
+ rr_ptr = dnsrec->ar;
+ rr_len = &dnsrec->arcount;
+ break;
+ }
+
+ if (idx >= *rr_len) {
+ return ARES_EFORMERR;
+ }
+
+ ares__dns_rr_free(&rr_ptr[idx]);
+
+ cnt_after = *rr_len - idx - 1;
+
+ if (cnt_after) {
+ memmove(&rr_ptr[idx], &rr_ptr[idx + 1], sizeof(*rr_ptr) * cnt_after);
+ }
+
+ (*rr_len)--;
+ return ARES_SUCCESS;
+}
+
+ares_dns_rr_t *ares_dns_record_rr_get(ares_dns_record_t *dnsrec,
+ ares_dns_section_t sect, size_t idx)
+{
+ ares_dns_rr_t *rr_ptr = NULL;
+ size_t rr_len = 0;
+
+ if (dnsrec == NULL || !ares_dns_section_isvalid(sect)) {
+ return NULL;
+ }
+
+ switch (sect) {
+ case ARES_SECTION_ANSWER:
+ rr_ptr = dnsrec->an;
+ rr_len = dnsrec->ancount;
+ break;
+ case ARES_SECTION_AUTHORITY:
+ rr_ptr = dnsrec->ns;
+ rr_len = dnsrec->nscount;
+ break;
+ case ARES_SECTION_ADDITIONAL:
+ rr_ptr = dnsrec->ar;
+ rr_len = dnsrec->arcount;
+ break;
+ }
+
+ if (idx >= rr_len) {
+ return NULL;
+ }
+
+ return &rr_ptr[idx];
+}
+
+const ares_dns_rr_t *
+ ares_dns_record_rr_get_const(const ares_dns_record_t *dnsrec,
+ ares_dns_section_t sect, size_t idx)
+{
+ return ares_dns_record_rr_get((void *)((size_t)dnsrec), sect, idx);
+}
+
+const char *ares_dns_rr_get_name(const ares_dns_rr_t *rr)
+{
+ if (rr == NULL) {
+ return NULL;
+ }
+ return rr->name;
+}
+
+ares_dns_rec_type_t ares_dns_rr_get_type(const ares_dns_rr_t *rr)
+{
+ if (rr == NULL) {
+ return 0;
+ }
+ return rr->type;
+}
+
+ares_dns_class_t ares_dns_rr_get_class(const ares_dns_rr_t *rr)
+{
+ if (rr == NULL) {
+ return 0;
+ }
+ return rr->rclass;
+}
+
+unsigned int ares_dns_rr_get_ttl(const ares_dns_rr_t *rr)
+{
+ if (rr == NULL) {
+ return 0;
+ }
+ return rr->ttl;
+}
+
+static void *ares_dns_rr_data_ptr(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key,
+ size_t **lenptr)
+{
+ if (dns_rr == NULL || dns_rr->type != ares_dns_rr_key_to_rec_type(key)) {
+ return NULL;
+ }
+
+ switch (key) {
+ case ARES_RR_A_ADDR:
+ return &dns_rr->r.a.addr;
+
+ case ARES_RR_NS_NSDNAME:
+ return &dns_rr->r.ns.nsdname;
+
+ case ARES_RR_CNAME_CNAME:
+ return &dns_rr->r.cname.cname;
+
+ case ARES_RR_SOA_MNAME:
+ return &dns_rr->r.soa.mname;
+
+ case ARES_RR_SOA_RNAME:
+ return &dns_rr->r.soa.rname;
+
+ case ARES_RR_SOA_SERIAL:
+ return &dns_rr->r.soa.serial;
+
+ case ARES_RR_SOA_REFRESH:
+ return &dns_rr->r.soa.refresh;
+
+ case ARES_RR_SOA_RETRY:
+ return &dns_rr->r.soa.retry;
+
+ case ARES_RR_SOA_EXPIRE:
+ return &dns_rr->r.soa.expire;
+
+ case ARES_RR_SOA_MINIMUM:
+ return &dns_rr->r.soa.minimum;
+
+ case ARES_RR_PTR_DNAME:
+ return &dns_rr->r.ptr.dname;
+
+ case ARES_RR_AAAA_ADDR:
+ return &dns_rr->r.aaaa.addr;
+
+ case ARES_RR_HINFO_CPU:
+ return &dns_rr->r.hinfo.cpu;
+
+ case ARES_RR_HINFO_OS:
+ return &dns_rr->r.hinfo.os;
+
+ case ARES_RR_MX_PREFERENCE:
+ return &dns_rr->r.mx.preference;
+
+ case ARES_RR_MX_EXCHANGE:
+ return &dns_rr->r.mx.exchange;
+
+ case ARES_RR_TXT_DATA:
+ if (lenptr == NULL) {
+ return NULL;
+ }
+ *lenptr = &dns_rr->r.txt.data_len;
+ return &dns_rr->r.txt.data;
+
+ case ARES_RR_SRV_PRIORITY:
+ return &dns_rr->r.srv.priority;
+
+ case ARES_RR_SRV_WEIGHT:
+ return &dns_rr->r.srv.weight;
+
+ case ARES_RR_SRV_PORT:
+ return &dns_rr->r.srv.port;
+
+ case ARES_RR_SRV_TARGET:
+ return &dns_rr->r.srv.target;
+
+ case ARES_RR_NAPTR_ORDER:
+ return &dns_rr->r.naptr.order;
+
+ case ARES_RR_NAPTR_PREFERENCE:
+ return &dns_rr->r.naptr.preference;
+
+ case ARES_RR_NAPTR_FLAGS:
+ return &dns_rr->r.naptr.flags;
+
+ case ARES_RR_NAPTR_SERVICES:
+ return &dns_rr->r.naptr.services;
+
+ case ARES_RR_NAPTR_REGEXP:
+ return &dns_rr->r.naptr.regexp;
+
+ case ARES_RR_NAPTR_REPLACEMENT:
+ return &dns_rr->r.naptr.replacement;
+
+ case ARES_RR_OPT_UDP_SIZE:
+ return &dns_rr->r.opt.udp_size;
+
+ case ARES_RR_OPT_VERSION:
+ return &dns_rr->r.opt.version;
+
+ case ARES_RR_OPT_FLAGS:
+ return &dns_rr->r.opt.flags;
+
+ case ARES_RR_OPT_OPTIONS:
+ return &dns_rr->r.opt.options;
+
+ case ARES_RR_TLSA_CERT_USAGE:
+ return &dns_rr->r.tlsa.cert_usage;
+
+ case ARES_RR_TLSA_SELECTOR:
+ return &dns_rr->r.tlsa.selector;
+
+ case ARES_RR_TLSA_MATCH:
+ return &dns_rr->r.tlsa.match;
+
+ case ARES_RR_TLSA_DATA:
+ if (lenptr == NULL) {
+ return NULL;
+ }
+ *lenptr = &dns_rr->r.tlsa.data_len;
+ return &dns_rr->r.tlsa.data;
+
+ case ARES_RR_SVCB_PRIORITY:
+ return &dns_rr->r.svcb.priority;
+
+ case ARES_RR_SVCB_TARGET:
+ return &dns_rr->r.svcb.target;
+
+ case ARES_RR_SVCB_PARAMS:
+ return &dns_rr->r.svcb.params;
+
+ case ARES_RR_HTTPS_PRIORITY:
+ return &dns_rr->r.https.priority;
+
+ case ARES_RR_HTTPS_TARGET:
+ return &dns_rr->r.https.target;
+
+ case ARES_RR_HTTPS_PARAMS:
+ return &dns_rr->r.https.params;
+
+ case ARES_RR_URI_PRIORITY:
+ return &dns_rr->r.uri.priority;
+
+ case ARES_RR_URI_WEIGHT:
+ return &dns_rr->r.uri.weight;
+
+ case ARES_RR_URI_TARGET:
+ return &dns_rr->r.uri.target;
+
+ case ARES_RR_CAA_CRITICAL:
+ return &dns_rr->r.caa.critical;
+
+ case ARES_RR_CAA_TAG:
+ return &dns_rr->r.caa.tag;
+
+ case ARES_RR_CAA_VALUE:
+ if (lenptr == NULL) {
+ return NULL;
+ }
+ *lenptr = &dns_rr->r.caa.value_len;
+ return &dns_rr->r.caa.value;
+
+ case ARES_RR_RAW_RR_TYPE:
+ return &dns_rr->r.raw_rr.type;
+
+ case ARES_RR_RAW_RR_DATA:
+ if (lenptr == NULL) {
+ return NULL;
+ }
+ *lenptr = &dns_rr->r.raw_rr.length;
+ return &dns_rr->r.raw_rr.data;
+ }
+
+ return NULL;
+}
+
+static const void *ares_dns_rr_data_ptr_const(const ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key,
+ const size_t **lenptr)
+{
+ /* We're going to cast off the const */
+ return ares_dns_rr_data_ptr((void *)((size_t)dns_rr), key,
+ (void *)((size_t)lenptr));
+}
+
+const struct in_addr *ares_dns_rr_get_addr(const ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key)
+{
+ const struct in_addr *addr;
+
+ if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_INADDR) {
+ return NULL;
+ }
+
+ addr = ares_dns_rr_data_ptr_const(dns_rr, key, NULL);
+ if (addr == NULL) {
+ return NULL;
+ }
+
+ return addr;
+}
+
+const struct ares_in6_addr *ares_dns_rr_get_addr6(const ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key)
+{
+ const struct ares_in6_addr *addr;
+
+ if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_INADDR6) {
+ return NULL;
+ }
+
+ addr = ares_dns_rr_data_ptr_const(dns_rr, key, NULL);
+ if (addr == NULL) {
+ return NULL;
+ }
+
+ return addr;
+}
+
+unsigned char ares_dns_rr_get_u8(const ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key)
+{
+ const unsigned char *u8;
+
+ if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_U8) {
+ return 0;
+ }
+
+ u8 = ares_dns_rr_data_ptr_const(dns_rr, key, NULL);
+ if (u8 == NULL) {
+ return 0;
+ }
+
+ return *u8;
+}
+
+unsigned short ares_dns_rr_get_u16(const ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key)
+{
+ const unsigned short *u16;
+
+ if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_U16) {
+ return 0;
+ }
+
+ u16 = ares_dns_rr_data_ptr_const(dns_rr, key, NULL);
+ if (u16 == NULL) {
+ return 0;
+ }
+
+ return *u16;
+}
+
+unsigned int ares_dns_rr_get_u32(const ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key)
+{
+ const unsigned int *u32;
+
+ if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_U32) {
+ return 0;
+ }
+
+ u32 = ares_dns_rr_data_ptr_const(dns_rr, key, NULL);
+ if (u32 == NULL) {
+ return 0;
+ }
+
+ return *u32;
+}
+
+const unsigned char *ares_dns_rr_get_bin(const ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key, size_t *len)
+{
+ unsigned char * const *bin = NULL;
+ size_t const *bin_len = NULL;
+
+ if ((ares_dns_rr_key_datatype(key) != ARES_DATATYPE_BIN &&
+ ares_dns_rr_key_datatype(key) != ARES_DATATYPE_BINP) ||
+ len == NULL) {
+ return NULL;
+ }
+
+ bin = ares_dns_rr_data_ptr_const(dns_rr, key, &bin_len);
+ if (bin == NULL) {
+ return 0;
+ }
+
+ /* Shouldn't be possible */
+ if (bin_len == NULL) {
+ return NULL;
+ }
+
+ *len = *bin_len;
+
+ return *bin;
+}
+
+const char *ares_dns_rr_get_str(const ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key)
+{
+ char * const *str;
+
+ if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_STR &&
+ ares_dns_rr_key_datatype(key) != ARES_DATATYPE_NAME) {
+ return NULL;
+ }
+
+ str = ares_dns_rr_data_ptr_const(dns_rr, key, NULL);
+ if (str == NULL) {
+ return NULL;
+ }
+
+ return *str;
+}
+
+size_t ares_dns_rr_get_opt_cnt(const ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key)
+{
+ ares__dns_options_t * const *opts;
+
+ if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_OPT) {
+ return 0;
+ }
+
+ opts = ares_dns_rr_data_ptr_const(dns_rr, key, NULL);
+ if (opts == NULL || *opts == NULL) {
+ return 0;
+ }
+
+ return (*opts)->cnt;
+}
+
+unsigned short ares_dns_rr_get_opt(const ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key, size_t idx,
+ const unsigned char **val, size_t *val_len)
+{
+ ares__dns_options_t * const *opts;
+
+ if (val) {
+ *val = NULL;
+ }
+ if (val_len) {
+ *val_len = 0;
+ }
+
+ if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_OPT) {
+ return 65535;
+ }
+
+ opts = ares_dns_rr_data_ptr_const(dns_rr, key, NULL);
+ if (opts == NULL || *opts == NULL) {
+ return 65535;
+ }
+
+ if (idx >= (*opts)->cnt) {
+ return 65535;
+ }
+
+ if (val) {
+ *val = (*opts)->optval[idx].val;
+ }
+ if (val_len) {
+ *val_len = (*opts)->optval[idx].val_len;
+ }
+
+ return (*opts)->optval[idx].opt;
+}
+
+ares_bool_t ares_dns_rr_get_opt_byid(const ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key, unsigned short opt,
+ const unsigned char **val, size_t *val_len)
+{
+ ares__dns_options_t * const *opts;
+ size_t i;
+
+ if (val) {
+ *val = NULL;
+ }
+ if (val_len) {
+ *val_len = 0;
+ }
+
+ if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_OPT) {
+ return ARES_FALSE;
+ }
+
+ opts = ares_dns_rr_data_ptr_const(dns_rr, key, NULL);
+ if (opts == NULL || *opts == NULL) {
+ return ARES_FALSE;
+ }
+
+ for (i = 0; i < (*opts)->cnt; i++) {
+ if ((*opts)->optval[i].opt == opt) {
+ break;
+ }
+ }
+
+ if (i >= (*opts)->cnt) {
+ return ARES_FALSE;
+ }
+
+ if (val) {
+ *val = (*opts)->optval[i].val;
+ }
+ if (val_len) {
+ *val_len = (*opts)->optval[i].val_len;
+ }
+ return ARES_TRUE;
+}
+
+ares_status_t ares_dns_rr_set_addr(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key,
+ const struct in_addr *addr)
+{
+ struct in_addr *a;
+
+ if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_INADDR || addr == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ a = ares_dns_rr_data_ptr(dns_rr, key, NULL);
+ if (a == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ memcpy(a, addr, sizeof(*a));
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares_dns_rr_set_addr6(ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key,
+ const struct ares_in6_addr *addr)
+{
+ struct ares_in6_addr *a;
+
+ if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_INADDR6 || addr == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ a = ares_dns_rr_data_ptr(dns_rr, key, NULL);
+ if (a == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ memcpy(a, addr, sizeof(*a));
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares_dns_rr_set_u8(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key,
+ unsigned char val)
+{
+ unsigned char *u8;
+
+ if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_U8) {
+ return ARES_EFORMERR;
+ }
+
+ u8 = ares_dns_rr_data_ptr(dns_rr, key, NULL);
+ if (u8 == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ *u8 = val;
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares_dns_rr_set_u16(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key,
+ unsigned short val)
+{
+ unsigned short *u16;
+
+ if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_U16) {
+ return ARES_EFORMERR;
+ }
+
+ u16 = ares_dns_rr_data_ptr(dns_rr, key, NULL);
+ if (u16 == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ *u16 = val;
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares_dns_rr_set_u32(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key,
+ unsigned int val)
+{
+ unsigned int *u32;
+
+ if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_U32) {
+ return ARES_EFORMERR;
+ }
+
+ u32 = ares_dns_rr_data_ptr(dns_rr, key, NULL);
+ if (u32 == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ *u32 = val;
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares_dns_rr_set_bin_own(ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key, unsigned char *val,
+ size_t len)
+{
+ unsigned char **bin;
+ size_t *bin_len = NULL;
+
+ if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_BIN &&
+ ares_dns_rr_key_datatype(key) != ARES_DATATYPE_BINP) {
+ return ARES_EFORMERR;
+ }
+
+ bin = ares_dns_rr_data_ptr(dns_rr, key, &bin_len);
+ if (bin == NULL || bin_len == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ if (*bin) {
+ ares_free(*bin);
+ }
+ *bin = val;
+ *bin_len = len;
+
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares_dns_rr_set_bin(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key,
+ const unsigned char *val, size_t len)
+{
+ ares_status_t status;
+ ares_dns_datatype_t datatype = ares_dns_rr_key_datatype(key);
+ size_t alloclen = (datatype == ARES_DATATYPE_BINP) ? len + 1 : len;
+ unsigned char *temp = ares_malloc(alloclen);
+
+ if (temp == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ memcpy(temp, val, len);
+
+ /* NULL-term BINP */
+ if (datatype == ARES_DATATYPE_BINP) {
+ temp[len] = 0;
+ }
+
+ status = ares_dns_rr_set_bin_own(dns_rr, key, temp, len);
+ if (status != ARES_SUCCESS) {
+ ares_free(temp);
+ }
+
+ return status;
+}
+
+ares_status_t ares_dns_rr_set_str_own(ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key, char *val)
+{
+ char **str;
+
+ if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_STR &&
+ ares_dns_rr_key_datatype(key) != ARES_DATATYPE_NAME) {
+ return ARES_EFORMERR;
+ }
+
+ str = ares_dns_rr_data_ptr(dns_rr, key, NULL);
+ if (str == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ if (*str) {
+ ares_free(*str);
+ }
+ *str = val;
+
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares_dns_rr_set_str(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key,
+ const char *val)
+{
+ ares_status_t status;
+ char *temp = NULL;
+
+ if (val != NULL) {
+ temp = ares_strdup(val);
+ if (temp == NULL) {
+ return ARES_ENOMEM;
+ }
+ }
+
+ status = ares_dns_rr_set_str_own(dns_rr, key, temp);
+ if (status != ARES_SUCCESS) {
+ ares_free(temp);
+ }
+
+ return status;
+}
+
+ares_status_t ares_dns_rr_set_opt_own(ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key, unsigned short opt,
+ unsigned char *val, size_t val_len)
+{
+ ares__dns_options_t **options;
+ size_t idx;
+
+ if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_OPT) {
+ return ARES_EFORMERR;
+ }
+
+ options = ares_dns_rr_data_ptr(dns_rr, key, NULL);
+ if (options == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ if (*options == NULL) {
+ *options = ares_malloc_zero(sizeof(**options));
+ }
+ if (*options == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ for (idx = 0; idx < (*options)->cnt; idx++) {
+ if ((*options)->optval[idx].opt == opt) {
+ break;
+ }
+ }
+
+ /* Duplicate entry, replace */
+ if (idx != (*options)->cnt) {
+ goto done;
+ }
+
+ idx = (*options)->cnt;
+
+ /* Expand by powers of 2 */
+ if (idx >= (*options)->alloc) {
+ size_t alloc_size = (*options)->alloc;
+ void *temp;
+
+ if (alloc_size == 0) {
+ alloc_size = 1;
+ } else {
+ alloc_size <<= 1;
+ }
+
+ temp = ares_realloc_zero((*options)->optval,
+ (*options)->alloc * sizeof(*(*options)->optval),
+ alloc_size * sizeof(*(*options)->optval));
+ if (temp == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ (*options)->optval = temp;
+ (*options)->alloc = alloc_size;
+ }
+
+ (*options)->cnt++;
+
+done:
+ ares_free((*options)->optval[idx].val);
+ (*options)->optval[idx].opt = opt;
+ (*options)->optval[idx].val = val;
+ (*options)->optval[idx].val_len = val_len;
+
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares_dns_rr_set_opt(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key,
+ unsigned short opt, const unsigned char *val,
+ size_t val_len)
+{
+ unsigned char *temp = NULL;
+ ares_status_t status;
+
+ if (val != NULL) {
+ temp = ares_malloc(val_len + 1);
+ if (temp == NULL) {
+ return ARES_ENOMEM;
+ }
+ memcpy(temp, val, val_len);
+ temp[val_len] = 0;
+ }
+
+ status = ares_dns_rr_set_opt_own(dns_rr, key, opt, temp, val_len);
+ if (status != ARES_SUCCESS) {
+ ares_free(temp);
+ }
+
+ return status;
+}
+
+char *ares_dns_addr_to_ptr(const struct ares_addr *addr)
+{
+ ares__buf_t *buf = NULL;
+ const unsigned char *ptr = NULL;
+ size_t ptr_len = 0;
+ size_t i;
+ ares_status_t status;
+ static const unsigned char hexbytes[] = "0123456789abcdef";
+
+ if (addr->family != AF_INET && addr->family != AF_INET6) {
+ goto fail;
+ }
+
+ buf = ares__buf_create();
+ if (buf == NULL) {
+ goto fail;
+ }
+
+ if (addr->family == AF_INET) {
+ ptr = (const unsigned char *)&addr->addr.addr4;
+ ptr_len = 4;
+ } else {
+ ptr = (const unsigned char *)&addr->addr.addr6;
+ ptr_len = 16;
+ }
+
+ for (i = ptr_len; i > 0; i--) {
+ if (addr->family == AF_INET) {
+ status = ares__buf_append_num_dec(buf, (size_t)ptr[i - 1], 0);
+ } else {
+ unsigned char c;
+
+ c = ptr[i - 1] & 0xF;
+ status = ares__buf_append_byte(buf, hexbytes[c]);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ status = ares__buf_append_byte(buf, '.');
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ c = (ptr[i - 1] >> 4) & 0xF;
+ status = ares__buf_append_byte(buf, hexbytes[c]);
+ }
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ status = ares__buf_append_byte(buf, '.');
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+ }
+
+ if (addr->family == AF_INET) {
+ status = ares__buf_append(buf, (const unsigned char *)"in-addr.arpa", 12);
+ } else {
+ status = ares__buf_append(buf, (const unsigned char *)"ip6.arpa", 8);
+ }
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ return ares__buf_finish_str(buf, NULL);
+
+fail:
+ ares__buf_destroy(buf);
+ return NULL;
+}
+
+/* search for an OPT RR in the response */
+ares_bool_t ares_dns_has_opt_rr(const ares_dns_record_t *rec)
+{
+ size_t i;
+ for (i = 0; i < ares_dns_record_rr_cnt(rec, ARES_SECTION_ADDITIONAL); i++) {
+ const ares_dns_rr_t *rr =
+ ares_dns_record_rr_get_const(rec, ARES_SECTION_ADDITIONAL, i);
+
+ if (ares_dns_rr_get_type(rr) == ARES_REC_TYPE_OPT) {
+ return ARES_TRUE;
+ }
+ }
+ return ARES_FALSE;
+}
+
+/* Construct a DNS record for a name with given class and type. Used internally
+ * by ares_search() and ares_create_query().
+ */
+ares_status_t
+ ares_dns_record_create_query(ares_dns_record_t **dnsrec, const char *name,
+ ares_dns_class_t dnsclass,
+ ares_dns_rec_type_t type, unsigned short id,
+ ares_dns_flags_t flags, size_t max_udp_size)
+{
+ ares_status_t status;
+ ares_dns_rr_t *rr = NULL;
+
+ if (dnsrec == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ *dnsrec = NULL;
+
+ /* Per RFC 7686, reject queries for ".onion" domain names with NXDOMAIN */
+ if (ares__is_onion_domain(name)) {
+ status = ARES_ENOTFOUND;
+ goto done;
+ }
+
+ status = ares_dns_record_create(dnsrec, id, (unsigned short)flags,
+ ARES_OPCODE_QUERY, ARES_RCODE_NOERROR);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ status = ares_dns_record_query_add(*dnsrec, name, type, dnsclass);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ /* max_udp_size > 0 indicates EDNS, so send OPT RR as an additional record */
+ if (max_udp_size > 0) {
+ /* max_udp_size must fit into a 16 bit unsigned integer field on the OPT
+ * RR, so check here that it fits
+ */
+ if (max_udp_size > 65535) {
+ status = ARES_EFORMERR;
+ goto done;
+ }
+
+ status = ares_dns_record_rr_add(&rr, *dnsrec, ARES_SECTION_ADDITIONAL, "",
+ ARES_REC_TYPE_OPT, ARES_CLASS_IN, 0);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ status = ares_dns_rr_set_u16(rr, ARES_RR_OPT_UDP_SIZE,
+ (unsigned short)max_udp_size);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ status = ares_dns_rr_set_u8(rr, ARES_RR_OPT_VERSION, 0);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ status = ares_dns_rr_set_u16(rr, ARES_RR_OPT_FLAGS, 0);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+
+done:
+ if (status != ARES_SUCCESS) {
+ ares_dns_record_destroy(*dnsrec);
+ *dnsrec = NULL;
+ }
+ return status;
+}
+
+ares_dns_record_t *ares_dns_record_duplicate(const ares_dns_record_t *dnsrec)
+{
+ unsigned char *data = NULL;
+ size_t data_len = 0;
+ ares_dns_record_t *out = NULL;
+ ares_status_t status;
+
+ if (dnsrec == NULL) {
+ return NULL;
+ }
+
+ status = ares_dns_write(dnsrec, &data, &data_len);
+ if (status != ARES_SUCCESS) {
+ return NULL;
+ }
+
+ status = ares_dns_parse(data, data_len, 0, &out);
+ ares_free(data);
+ if (status != ARES_SUCCESS) {
+ return NULL;
+ }
+ return out;
+}
diff --git a/contrib/libs/c-ares/src/lib/ares_dns_write.c b/contrib/libs/c-ares/src/lib/ares_dns_write.c
new file mode 100644
index 0000000000..b49ec07bcb
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares_dns_write.c
@@ -0,0 +1,1054 @@
+/* MIT License
+ *
+ * Copyright (c) 2023 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#include "ares_setup.h"
+#include "ares.h"
+#include "ares_private.h"
+#include <limits.h>
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+
+
+static ares_status_t ares_dns_write_header(const ares_dns_record_t *dnsrec,
+ ares__buf_t *buf)
+{
+ unsigned short u16;
+ unsigned short opcode;
+ unsigned short rcode;
+
+ ares_status_t status;
+
+ /* ID */
+ status = ares__buf_append_be16(buf, dnsrec->id);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Flags */
+ u16 = 0;
+
+ /* QR */
+ if (dnsrec->flags & ARES_FLAG_QR) {
+ u16 |= 0x8000;
+ }
+
+ /* OPCODE */
+ opcode = (unsigned short)(dnsrec->opcode & 0xF);
+ opcode <<= 11;
+ u16 |= opcode;
+
+ /* AA */
+ if (dnsrec->flags & ARES_FLAG_AA) {
+ u16 |= 0x400;
+ }
+
+ /* TC */
+ if (dnsrec->flags & ARES_FLAG_TC) {
+ u16 |= 0x200;
+ }
+
+ /* RD */
+ if (dnsrec->flags & ARES_FLAG_RD) {
+ u16 |= 0x100;
+ }
+
+ /* RA */
+ if (dnsrec->flags & ARES_FLAG_RA) {
+ u16 |= 0x80;
+ }
+
+ /* Z -- unused */
+
+ /* AD */
+ if (dnsrec->flags & ARES_FLAG_AD) {
+ u16 |= 0x20;
+ }
+
+ /* CD */
+ if (dnsrec->flags & ARES_FLAG_CD) {
+ u16 |= 0x10;
+ }
+
+ /* RCODE */
+ if (dnsrec->rcode > 15 && !ares_dns_has_opt_rr(dnsrec)) {
+ /* Must have OPT RR in order to write extended error codes */
+ rcode = ARES_RCODE_SERVFAIL;
+ } else {
+ rcode = (unsigned short)(dnsrec->rcode & 0xF);
+ }
+ u16 |= rcode;
+
+ status = ares__buf_append_be16(buf, u16);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* QDCOUNT */
+ status = ares__buf_append_be16(buf, (unsigned short)dnsrec->qdcount);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* ANCOUNT */
+ status = ares__buf_append_be16(buf, (unsigned short)dnsrec->ancount);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* NSCOUNT */
+ status = ares__buf_append_be16(buf, (unsigned short)dnsrec->nscount);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* ARCOUNT */
+ status = ares__buf_append_be16(buf, (unsigned short)dnsrec->arcount);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ return ARES_SUCCESS;
+}
+
+static ares_status_t ares_dns_write_questions(const ares_dns_record_t *dnsrec,
+ ares__llist_t **namelist,
+ ares__buf_t *buf)
+{
+ size_t i;
+
+ for (i = 0; i < ares_dns_record_query_cnt(dnsrec); i++) {
+ ares_status_t status;
+ const char *name = NULL;
+ ares_dns_rec_type_t qtype;
+ ares_dns_class_t qclass;
+
+ status = ares_dns_record_query_get(dnsrec, i, &name, &qtype, &qclass);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Name */
+ status = ares__dns_name_write(buf, namelist, ARES_TRUE, name);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Type */
+ status = ares__buf_append_be16(buf, (unsigned short)qtype);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Class */
+ status = ares__buf_append_be16(buf, (unsigned short)qclass);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+
+ return ARES_SUCCESS;
+}
+
+static ares_status_t ares_dns_write_rr_name(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares__llist_t **namelist,
+ ares_bool_t validate_hostname,
+ ares_dns_rr_key_t key)
+{
+ const char *name;
+
+ name = ares_dns_rr_get_str(rr, key);
+ if (name == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ return ares__dns_name_write(buf, namelist, validate_hostname, name);
+}
+
+static ares_status_t ares_dns_write_rr_str(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares_dns_rr_key_t key)
+{
+ const char *str;
+ size_t len;
+ ares_status_t status;
+
+ str = ares_dns_rr_get_str(rr, key);
+ if (str == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ len = ares_strlen(str);
+ if (len > 255) {
+ return ARES_EFORMERR;
+ }
+
+ /* Write 1 byte length */
+ status = ares__buf_append_byte(buf, (unsigned char)(len & 0xFF));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ if (len == 0) {
+ return ARES_SUCCESS;
+ }
+
+ /* Write string */
+ return ares__buf_append(buf, (const unsigned char *)str, len);
+}
+
+static ares_status_t ares_dns_write_rr_binstrs(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares_dns_rr_key_t key)
+{
+ const unsigned char *bin;
+ const unsigned char *ptr;
+ size_t bin_len;
+ size_t ptr_len;
+ ares_status_t status;
+
+ bin = ares_dns_rr_get_bin(rr, key, &bin_len);
+ if (bin == NULL) {
+ return ARES_EFORMERR;
+ }
+ /* split into possible multiple 255-byte or less length strings */
+ ptr = bin;
+ ptr_len = bin_len;
+ do {
+ size_t len = ptr_len;
+ if (len > 255) {
+ len = 255;
+ }
+
+ /* Length */
+ status = ares__buf_append_byte(buf, (unsigned char)(len & 0xFF));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* String */
+ if (len) {
+ status = ares__buf_append(buf, ptr, len);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+
+ ptr += len;
+ ptr_len -= len;
+ } while (ptr_len > 0);
+
+ return ARES_SUCCESS;
+}
+
+static ares_status_t ares_dns_write_rr_be32(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares_dns_rr_key_t key)
+{
+ if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_U32) {
+ return ARES_EFORMERR;
+ }
+ return ares__buf_append_be32(buf, ares_dns_rr_get_u32(rr, key));
+}
+
+static ares_status_t ares_dns_write_rr_be16(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares_dns_rr_key_t key)
+{
+ if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_U16) {
+ return ARES_EFORMERR;
+ }
+ return ares__buf_append_be16(buf, ares_dns_rr_get_u16(rr, key));
+}
+
+static ares_status_t ares_dns_write_rr_u8(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares_dns_rr_key_t key)
+{
+ if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_U8) {
+ return ARES_EFORMERR;
+ }
+ return ares__buf_append_byte(buf, ares_dns_rr_get_u8(rr, key));
+}
+
+static ares_status_t ares_dns_write_rr_a(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares__llist_t **namelist)
+{
+ const struct in_addr *addr;
+ (void)namelist;
+
+ addr = ares_dns_rr_get_addr(rr, ARES_RR_A_ADDR);
+ if (addr == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ return ares__buf_append(buf, (const unsigned char *)addr, sizeof(*addr));
+}
+
+static ares_status_t ares_dns_write_rr_ns(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares__llist_t **namelist)
+{
+ return ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE,
+ ARES_RR_NS_NSDNAME);
+}
+
+static ares_status_t ares_dns_write_rr_cname(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares__llist_t **namelist)
+{
+ return ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE,
+ ARES_RR_CNAME_CNAME);
+}
+
+static ares_status_t ares_dns_write_rr_soa(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares__llist_t **namelist)
+{
+ ares_status_t status;
+
+ /* MNAME */
+ status =
+ ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE, ARES_RR_SOA_MNAME);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* RNAME */
+ status =
+ ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE, ARES_RR_SOA_RNAME);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* SERIAL */
+ status = ares_dns_write_rr_be32(buf, rr, ARES_RR_SOA_SERIAL);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* REFRESH */
+ status = ares_dns_write_rr_be32(buf, rr, ARES_RR_SOA_REFRESH);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* RETRY */
+ status = ares_dns_write_rr_be32(buf, rr, ARES_RR_SOA_RETRY);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* EXPIRE */
+ status = ares_dns_write_rr_be32(buf, rr, ARES_RR_SOA_EXPIRE);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* MINIMUM */
+ return ares_dns_write_rr_be32(buf, rr, ARES_RR_SOA_MINIMUM);
+}
+
+static ares_status_t ares_dns_write_rr_ptr(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares__llist_t **namelist)
+{
+ return ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE,
+ ARES_RR_PTR_DNAME);
+}
+
+static ares_status_t ares_dns_write_rr_hinfo(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares__llist_t **namelist)
+{
+ ares_status_t status;
+
+ (void)namelist;
+
+ /* CPU */
+ status = ares_dns_write_rr_str(buf, rr, ARES_RR_HINFO_CPU);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* OS */
+ return ares_dns_write_rr_str(buf, rr, ARES_RR_HINFO_OS);
+}
+
+static ares_status_t ares_dns_write_rr_mx(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares__llist_t **namelist)
+{
+ ares_status_t status;
+
+ /* PREFERENCE */
+ status = ares_dns_write_rr_be16(buf, rr, ARES_RR_MX_PREFERENCE);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* EXCHANGE */
+ return ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE,
+ ARES_RR_MX_EXCHANGE);
+}
+
+static ares_status_t ares_dns_write_rr_txt(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares__llist_t **namelist)
+{
+ (void)namelist;
+ return ares_dns_write_rr_binstrs(buf, rr, ARES_RR_TXT_DATA);
+}
+
+static ares_status_t ares_dns_write_rr_aaaa(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares__llist_t **namelist)
+{
+ const struct ares_in6_addr *addr;
+ (void)namelist;
+
+ addr = ares_dns_rr_get_addr6(rr, ARES_RR_AAAA_ADDR);
+ if (addr == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ return ares__buf_append(buf, (const unsigned char *)addr, sizeof(*addr));
+}
+
+static ares_status_t ares_dns_write_rr_srv(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares__llist_t **namelist)
+{
+ ares_status_t status;
+
+ /* PRIORITY */
+ status = ares_dns_write_rr_be16(buf, rr, ARES_RR_SRV_PRIORITY);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* WEIGHT */
+ status = ares_dns_write_rr_be16(buf, rr, ARES_RR_SRV_WEIGHT);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* PORT */
+ status = ares_dns_write_rr_be16(buf, rr, ARES_RR_SRV_PORT);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* TARGET */
+ return ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE,
+ ARES_RR_SRV_TARGET);
+}
+
+static ares_status_t ares_dns_write_rr_naptr(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares__llist_t **namelist)
+{
+ ares_status_t status;
+
+ /* ORDER */
+ status = ares_dns_write_rr_be16(buf, rr, ARES_RR_NAPTR_ORDER);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* PREFERENCE */
+ status = ares_dns_write_rr_be16(buf, rr, ARES_RR_NAPTR_PREFERENCE);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* FLAGS */
+ status = ares_dns_write_rr_str(buf, rr, ARES_RR_NAPTR_FLAGS);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* SERVICES */
+ status = ares_dns_write_rr_str(buf, rr, ARES_RR_NAPTR_SERVICES);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* REGEXP */
+ status = ares_dns_write_rr_str(buf, rr, ARES_RR_NAPTR_REGEXP);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* REPLACEMENT */
+ return ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE,
+ ARES_RR_NAPTR_REPLACEMENT);
+}
+
+static ares_status_t ares_dns_write_rr_opt(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares__llist_t **namelist)
+{
+ size_t len = ares__buf_len(buf);
+ ares_status_t status;
+ unsigned int ttl = 0;
+ size_t i;
+ unsigned short rcode = (unsigned short)((rr->parent->rcode >> 4) & 0xFF);
+
+ (void)namelist;
+
+ /* We need to go back and overwrite the class and ttl that were emitted as
+ * the OPT record overloads them for its own use (yes, very strange!) */
+ status = ares__buf_set_length(buf, len - 2 /* RDLENGTH */
+ - 4 /* TTL */
+ - 2 /* CLASS */);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Class -> UDP Size */
+ status = ares_dns_write_rr_be16(buf, rr, ARES_RR_OPT_UDP_SIZE);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* TTL -> rcode (u8) << 24 | version (u8) << 16 | flags (u16) */
+ ttl |= (unsigned int)rcode << 24;
+ ttl |= (unsigned int)ares_dns_rr_get_u8(rr, ARES_RR_OPT_VERSION) << 16;
+ ttl |= (unsigned int)ares_dns_rr_get_u16(rr, ARES_RR_OPT_FLAGS);
+
+ status = ares__buf_append_be32(buf, ttl);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Now go back to real end */
+ status = ares__buf_set_length(buf, len);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Append Options */
+ for (i = 0; i < ares_dns_rr_get_opt_cnt(rr, ARES_RR_OPT_OPTIONS); i++) {
+ unsigned short opt;
+ size_t val_len;
+ const unsigned char *val;
+
+ opt = ares_dns_rr_get_opt(rr, ARES_RR_OPT_OPTIONS, i, &val, &val_len);
+
+ /* BE16 option */
+ status = ares__buf_append_be16(buf, opt);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* BE16 length */
+ status = ares__buf_append_be16(buf, (unsigned short)(val_len & 0xFFFF));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Value */
+ if (val && val_len) {
+ status = ares__buf_append(buf, val, val_len);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+ }
+
+ return ARES_SUCCESS;
+}
+
+static ares_status_t ares_dns_write_rr_tlsa(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares__llist_t **namelist)
+{
+ ares_status_t status;
+ const unsigned char *data;
+ size_t len = 0;
+
+ (void)namelist;
+
+ /* CERT_USAGE */
+ status = ares_dns_write_rr_u8(buf, rr, ARES_RR_TLSA_CERT_USAGE);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* SELECTOR */
+ status = ares_dns_write_rr_u8(buf, rr, ARES_RR_TLSA_SELECTOR);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* MATCH */
+ status = ares_dns_write_rr_u8(buf, rr, ARES_RR_TLSA_MATCH);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* DATA -- binary, rest of buffer, required to be non-zero length */
+ data = ares_dns_rr_get_bin(rr, ARES_RR_TLSA_DATA, &len);
+ if (data == NULL || len == 0) {
+ return ARES_EFORMERR;
+ }
+
+ return ares__buf_append(buf, data, len);
+}
+
+static ares_status_t ares_dns_write_rr_svcb(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares__llist_t **namelist)
+{
+ ares_status_t status;
+ size_t i;
+
+ /* PRIORITY */
+ status = ares_dns_write_rr_be16(buf, rr, ARES_RR_SVCB_PRIORITY);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* TARGET */
+ status =
+ ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE, ARES_RR_SVCB_TARGET);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Append Params */
+ for (i = 0; i < ares_dns_rr_get_opt_cnt(rr, ARES_RR_SVCB_PARAMS); i++) {
+ unsigned short opt;
+ size_t val_len;
+ const unsigned char *val;
+
+ opt = ares_dns_rr_get_opt(rr, ARES_RR_SVCB_PARAMS, i, &val, &val_len);
+
+ /* BE16 option */
+ status = ares__buf_append_be16(buf, opt);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* BE16 length */
+ status = ares__buf_append_be16(buf, (unsigned short)(val_len & 0xFFFF));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Value */
+ if (val && val_len) {
+ status = ares__buf_append(buf, val, val_len);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+ }
+ return ARES_SUCCESS;
+}
+
+static ares_status_t ares_dns_write_rr_https(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares__llist_t **namelist)
+{
+ ares_status_t status;
+ size_t i;
+
+ /* PRIORITY */
+ status = ares_dns_write_rr_be16(buf, rr, ARES_RR_HTTPS_PRIORITY);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* TARGET */
+ status =
+ ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE, ARES_RR_HTTPS_TARGET);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Append Params */
+ for (i = 0; i < ares_dns_rr_get_opt_cnt(rr, ARES_RR_HTTPS_PARAMS); i++) {
+ unsigned short opt;
+ size_t val_len;
+ const unsigned char *val;
+
+ opt = ares_dns_rr_get_opt(rr, ARES_RR_HTTPS_PARAMS, i, &val, &val_len);
+
+ /* BE16 option */
+ status = ares__buf_append_be16(buf, opt);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* BE16 length */
+ status = ares__buf_append_be16(buf, (unsigned short)(val_len & 0xFFFF));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Value */
+ if (val && val_len) {
+ status = ares__buf_append(buf, val, val_len);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+ }
+ return ARES_SUCCESS;
+}
+
+static ares_status_t ares_dns_write_rr_uri(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares__llist_t **namelist)
+{
+ ares_status_t status;
+ const char *target;
+
+ (void)namelist;
+
+ /* PRIORITY */
+ status = ares_dns_write_rr_be16(buf, rr, ARES_RR_URI_PRIORITY);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* WEIGHT */
+ status = ares_dns_write_rr_be16(buf, rr, ARES_RR_URI_WEIGHT);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* TARGET -- not in DNS string format, rest of buffer, required to be
+ * non-zero length */
+ target = ares_dns_rr_get_str(rr, ARES_RR_URI_TARGET);
+ if (target == NULL || ares_strlen(target) == 0) {
+ return ARES_EFORMERR;
+ }
+
+ return ares__buf_append(buf, (const unsigned char *)target,
+ ares_strlen(target));
+}
+
+static ares_status_t ares_dns_write_rr_caa(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares__llist_t **namelist)
+{
+ const unsigned char *data = NULL;
+ size_t data_len = 0;
+ ares_status_t status;
+
+ (void)namelist;
+
+ /* CRITICAL */
+ status = ares_dns_write_rr_u8(buf, rr, ARES_RR_CAA_CRITICAL);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Tag */
+ status = ares_dns_write_rr_str(buf, rr, ARES_RR_CAA_TAG);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Value - binary! (remaining buffer */
+ data = ares_dns_rr_get_bin(rr, ARES_RR_CAA_VALUE, &data_len);
+ if (data == NULL || data_len == 0) {
+ return ARES_EFORMERR;
+ }
+
+ return ares__buf_append(buf, data, data_len);
+}
+
+static ares_status_t ares_dns_write_rr_raw_rr(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares__llist_t **namelist)
+{
+ size_t len = ares__buf_len(buf);
+ ares_status_t status;
+ const unsigned char *data = NULL;
+ size_t data_len = 0;
+
+ (void)namelist;
+
+ /* We need to go back and overwrite the type that was emitted by the parent
+ * function */
+ status = ares__buf_set_length(buf, len - 2 /* RDLENGTH */
+ - 4 /* TTL */
+ - 2 /* CLASS */
+ - 2 /* TYPE */);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ status = ares_dns_write_rr_be16(buf, rr, ARES_RR_RAW_RR_TYPE);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Now go back to real end */
+ status = ares__buf_set_length(buf, len);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Output raw data */
+ data = ares_dns_rr_get_bin(rr, ARES_RR_RAW_RR_DATA, &data_len);
+ if (data == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ if (data_len == 0) {
+ return ARES_SUCCESS;
+ }
+
+ return ares__buf_append(buf, data, data_len);
+}
+
+static ares_status_t ares_dns_write_rr(const ares_dns_record_t *dnsrec,
+ ares__llist_t **namelist,
+ ares_dns_section_t section,
+ ares__buf_t *buf)
+{
+ size_t i;
+
+ for (i = 0; i < ares_dns_record_rr_cnt(dnsrec, section); i++) {
+ const ares_dns_rr_t *rr;
+ ares_dns_rec_type_t type;
+ ares_bool_t allow_compress;
+ ares__llist_t **namelistptr = NULL;
+ size_t pos_len;
+ ares_status_t status;
+ size_t rdlength;
+ size_t end_length;
+ unsigned int ttl;
+
+ rr = ares_dns_record_rr_get_const(dnsrec, section, i);
+ if (rr == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ type = ares_dns_rr_get_type(rr);
+ allow_compress = ares_dns_rec_type_allow_name_compression(type);
+ if (allow_compress) {
+ namelistptr = namelist;
+ }
+
+ /* Name */
+ status =
+ ares__dns_name_write(buf, namelist, ARES_TRUE, ares_dns_rr_get_name(rr));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Type */
+ status = ares__buf_append_be16(buf, (unsigned short)type);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Class */
+ status =
+ ares__buf_append_be16(buf, (unsigned short)ares_dns_rr_get_class(rr));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* TTL */
+ ttl = ares_dns_rr_get_ttl(rr);
+ if (rr->parent->ttl_decrement > ttl) {
+ ttl = 0;
+ } else {
+ ttl -= rr->parent->ttl_decrement;
+ }
+ status = ares__buf_append_be32(buf, ttl);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Length */
+ pos_len = ares__buf_len(buf); /* Save to write real length later */
+ status = ares__buf_append_be16(buf, 0);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Data */
+ switch (type) {
+ case ARES_REC_TYPE_A:
+ status = ares_dns_write_rr_a(buf, rr, namelistptr);
+ break;
+ case ARES_REC_TYPE_NS:
+ status = ares_dns_write_rr_ns(buf, rr, namelistptr);
+ break;
+ case ARES_REC_TYPE_CNAME:
+ status = ares_dns_write_rr_cname(buf, rr, namelistptr);
+ break;
+ case ARES_REC_TYPE_SOA:
+ status = ares_dns_write_rr_soa(buf, rr, namelistptr);
+ break;
+ case ARES_REC_TYPE_PTR:
+ status = ares_dns_write_rr_ptr(buf, rr, namelistptr);
+ break;
+ case ARES_REC_TYPE_HINFO:
+ status = ares_dns_write_rr_hinfo(buf, rr, namelistptr);
+ break;
+ case ARES_REC_TYPE_MX:
+ status = ares_dns_write_rr_mx(buf, rr, namelistptr);
+ break;
+ case ARES_REC_TYPE_TXT:
+ status = ares_dns_write_rr_txt(buf, rr, namelistptr);
+ break;
+ case ARES_REC_TYPE_AAAA:
+ status = ares_dns_write_rr_aaaa(buf, rr, namelistptr);
+ break;
+ case ARES_REC_TYPE_SRV:
+ status = ares_dns_write_rr_srv(buf, rr, namelistptr);
+ break;
+ case ARES_REC_TYPE_NAPTR:
+ status = ares_dns_write_rr_naptr(buf, rr, namelistptr);
+ break;
+ case ARES_REC_TYPE_ANY:
+ status = ARES_EFORMERR;
+ break;
+ case ARES_REC_TYPE_OPT:
+ status = ares_dns_write_rr_opt(buf, rr, namelistptr);
+ break;
+ case ARES_REC_TYPE_TLSA:
+ status = ares_dns_write_rr_tlsa(buf, rr, namelistptr);
+ break;
+ case ARES_REC_TYPE_SVCB:
+ status = ares_dns_write_rr_svcb(buf, rr, namelistptr);
+ break;
+ case ARES_REC_TYPE_HTTPS:
+ status = ares_dns_write_rr_https(buf, rr, namelistptr);
+ break;
+ case ARES_REC_TYPE_URI:
+ status = ares_dns_write_rr_uri(buf, rr, namelistptr);
+ break;
+ case ARES_REC_TYPE_CAA:
+ status = ares_dns_write_rr_caa(buf, rr, namelistptr);
+ break;
+ case ARES_REC_TYPE_RAW_RR:
+ status = ares_dns_write_rr_raw_rr(buf, rr, namelistptr);
+ break;
+ }
+
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Back off write pointer, write real length, then go back to proper
+ * position */
+ end_length = ares__buf_len(buf);
+ rdlength = end_length - pos_len - 2;
+
+ status = ares__buf_set_length(buf, pos_len);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ status = ares__buf_append_be16(buf, (unsigned short)(rdlength & 0xFFFF));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ status = ares__buf_set_length(buf, end_length);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares_dns_write(const ares_dns_record_t *dnsrec,
+ unsigned char **buf, size_t *buf_len)
+{
+ ares__buf_t *b = NULL;
+ ares_status_t status;
+ ares__llist_t *namelist = NULL;
+
+ if (buf == NULL || buf_len == NULL || dnsrec == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ *buf = NULL;
+ *buf_len = 0;
+
+ b = ares__buf_create();
+ if (b == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ status = ares_dns_write_header(dnsrec, b);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ status = ares_dns_write_questions(dnsrec, &namelist, b);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ status = ares_dns_write_rr(dnsrec, &namelist, ARES_SECTION_ANSWER, b);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ status = ares_dns_write_rr(dnsrec, &namelist, ARES_SECTION_AUTHORITY, b);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ status = ares_dns_write_rr(dnsrec, &namelist, ARES_SECTION_ADDITIONAL, b);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+done:
+ ares__llist_destroy(namelist);
+
+ if (status != ARES_SUCCESS) {
+ ares__buf_destroy(b);
+ return status;
+ }
+
+ *buf = ares__buf_finish_bin(b, buf_len);
+ return status;
+}
+
+void ares_dns_record_write_ttl_decrement(ares_dns_record_t *dnsrec,
+ unsigned int ttl_decrement)
+{
+ if (dnsrec == NULL) {
+ return;
+ }
+ dnsrec->ttl_decrement = ttl_decrement;
+}
diff --git a/contrib/libs/c-ares/src/lib/ares_event.h b/contrib/libs/c-ares/src/lib/ares_event.h
new file mode 100644
index 0000000000..23e9637924
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares_event.h
@@ -0,0 +1,174 @@
+/* MIT License
+ *
+ * Copyright (c) 2023 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#ifndef __ARES__EVENT_H
+#define __ARES__EVENT_H
+
+#include "ares_setup.h"
+
+struct ares_event;
+typedef struct ares_event ares_event_t;
+
+typedef enum {
+ ARES_EVENT_FLAG_NONE = 0,
+ ARES_EVENT_FLAG_READ = 1 << 0,
+ ARES_EVENT_FLAG_WRITE = 1 << 1,
+ ARES_EVENT_FLAG_OTHER = 1 << 2
+} ares_event_flags_t;
+
+typedef void (*ares_event_cb_t)(ares_event_thread_t *e, ares_socket_t fd,
+ void *data, ares_event_flags_t flags);
+
+typedef void (*ares_event_free_data_t)(void *data);
+
+typedef void (*ares_event_signal_cb_t)(const ares_event_t *event);
+
+struct ares_event {
+ /*! Registered event thread this event is bound to */
+ ares_event_thread_t *e;
+ /*! Flags to monitor. OTHER is only allowed if the socket is ARES_SOCKET_BAD.
+ */
+ ares_event_flags_t flags;
+ /*! Callback to be called when event is triggered */
+ ares_event_cb_t cb;
+ /*! Socket to monitor, allowed to be ARES_SOCKET_BAD if not monitoring a
+ * socket. */
+ ares_socket_t fd;
+ /*! Data associated with event handle that will be passed to the callback.
+ * Typically OS/event subsystem specific data.
+ * Optional, may be NULL. */
+ /*! Data to be passed to callback. Optional, may be NULL. */
+ void *data;
+ /*! When cleaning up the registered event (either when removed or during
+ * shutdown), this function will be called to clean up the user-supplied
+ * data. Optional, May be NULL. */
+ ares_event_free_data_t free_data_cb;
+ /*! Callback to call to trigger an event. */
+ ares_event_signal_cb_t signal_cb;
+};
+
+typedef struct {
+ const char *name;
+ ares_bool_t (*init)(ares_event_thread_t *e);
+ void (*destroy)(ares_event_thread_t *e);
+ ares_bool_t (*event_add)(ares_event_t *event);
+ void (*event_del)(ares_event_t *event);
+ void (*event_mod)(ares_event_t *event, ares_event_flags_t new_flags);
+ size_t (*wait)(ares_event_thread_t *e, unsigned long timeout_ms);
+} ares_event_sys_t;
+
+struct ares_event_thread {
+ /*! Whether the event thread should be online or not. Checked on every wake
+ * event before sleeping. */
+ ares_bool_t isup;
+ /*! Handle to the thread for joining during shutdown */
+ ares__thread_t *thread;
+ /*! Lock to protect the data contained within the event thread itself */
+ ares__thread_mutex_t *mutex;
+ /*! Reference to the ares channel, for being able to call things like
+ * ares_timeout() and ares_process_fd(). */
+ ares_channel_t *channel;
+ /*! Not-yet-processed event handle updates. These will get enqueued by a
+ * thread other than the event thread itself. The event thread will then
+ * be woken then process these updates itself */
+ ares__llist_t *ev_updates;
+ /*! Registered event handles. */
+ ares__htable_asvp_t *ev_handles;
+ /*! Pointer to the event handle which is used to signal and wake the event
+ * thread itself. This is needed to be able to do things like update the
+ * file descriptors being waited on and to wake the event subsystem during
+ * shutdown */
+ ares_event_t *ev_signal;
+ /* Event subsystem callbacks */
+ const ares_event_sys_t *ev_sys;
+ /* Event subsystem private data */
+ void *ev_sys_data;
+};
+
+/*! Queue an update for the event handle.
+ *
+ * Will search by the fd passed if not ARES_SOCKET_BAD to find a match and
+ * perform an update or delete (depending on flags). Otherwise will add.
+ * Do not use the event handle returned if its not guaranteed to be an add
+ * operation.
+ *
+ * \param[out] event Event handle. Optional, can be NULL. This handle
+ * will be invalidate quickly if the result of the
+ * operation is not an ADD.
+ * \param[in] e pointer to event thread handle
+ * \param[in] flags flags for the event handle. Use
+ * ARES_EVENT_FLAG_NONE if removing a socket from
+ * queue (not valid if socket is ARES_SOCKET_BAD).
+ * Non-socket events cannot be removed, and must have
+ * ARES_EVENT_FLAG_OTHER set.
+ * \param[in] cb Callback to call when
+ * event is triggered. Required. Not allowed to be
+ * changed, ignored on modification.
+ * \param[in] fd File descriptor/socket to monitor. May
+ * be ARES_SOCKET_BAD if not monitoring file
+ * descriptor.
+ * \param[in] data Optional. Caller-supplied data to be passed to
+ * callback. Only allowed on initial add, cannot be
+ * modified later, ignored on modification.
+ * \param[in] free_data_cb Optional. Callback to clean up caller-supplied
+ * data. Only allowed on initial add, cannot be
+ * modified later, ignored on modification.
+ * \param[in] signal_cb Optional. Callback to call to trigger an event.
+ * \return ARES_SUCCESS on success
+ */
+ares_status_t ares_event_update(ares_event_t **event, ares_event_thread_t *e,
+ ares_event_flags_t flags, ares_event_cb_t cb,
+ ares_socket_t fd, void *data,
+ ares_event_free_data_t free_data_cb,
+ ares_event_signal_cb_t signal_cb);
+
+
+#ifdef HAVE_PIPE
+ares_event_t *ares_pipeevent_create(ares_event_thread_t *e);
+#endif
+
+#ifdef HAVE_POLL
+extern const ares_event_sys_t ares_evsys_poll;
+#endif
+
+#ifdef HAVE_KQUEUE
+extern const ares_event_sys_t ares_evsys_kqueue;
+#endif
+
+#ifdef HAVE_EPOLL
+extern const ares_event_sys_t ares_evsys_epoll;
+#endif
+
+#ifdef _WIN32
+extern const ares_event_sys_t ares_evsys_win32;
+#endif
+
+/* All systems have select(), but not all have a way to wake, so we require
+ * pipe() to wake the select() */
+#ifdef HAVE_PIPE
+extern const ares_event_sys_t ares_evsys_select;
+#endif
+
+#endif
diff --git a/contrib/libs/c-ares/src/lib/ares_event_epoll.c b/contrib/libs/c-ares/src/lib/ares_event_epoll.c
new file mode 100644
index 0000000000..9d3c097f8e
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares_event_epoll.c
@@ -0,0 +1,198 @@
+/* MIT License
+ *
+ * Copyright (c) 2024 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#include "ares_setup.h"
+#include "ares.h"
+#include "ares_private.h"
+#include "ares_event.h"
+
+#ifdef HAVE_SYS_EPOLL_H
+# include <sys/epoll.h>
+#endif
+#ifdef HAVE_FCNTL_H
+# include <fcntl.h>
+#endif
+
+#ifdef HAVE_EPOLL
+
+typedef struct {
+ int epoll_fd;
+} ares_evsys_epoll_t;
+
+static void ares_evsys_epoll_destroy(ares_event_thread_t *e)
+{
+ ares_evsys_epoll_t *ep = NULL;
+
+ if (e == NULL) {
+ return;
+ }
+
+ ep = e->ev_sys_data;
+ if (ep == NULL) {
+ return;
+ }
+
+ if (ep->epoll_fd != -1) {
+ close(ep->epoll_fd);
+ }
+
+ ares_free(ep);
+ e->ev_sys_data = NULL;
+}
+
+static ares_bool_t ares_evsys_epoll_init(ares_event_thread_t *e)
+{
+ ares_evsys_epoll_t *ep = NULL;
+
+ ep = ares_malloc_zero(sizeof(*ep));
+ if (ep == NULL) {
+ return ARES_FALSE;
+ }
+
+ e->ev_sys_data = ep;
+
+ ep->epoll_fd = epoll_create1(0);
+ if (ep->epoll_fd == -1) {
+ ares_evsys_epoll_destroy(e);
+ return ARES_FALSE;
+ }
+
+# ifdef FD_CLOEXEC
+ fcntl(ep->epoll_fd, F_SETFD, FD_CLOEXEC);
+# endif
+
+ e->ev_signal = ares_pipeevent_create(e);
+ if (e->ev_signal == NULL) {
+ ares_evsys_epoll_destroy(e);
+ return ARES_FALSE;
+ }
+
+ return ARES_TRUE;
+}
+
+static ares_bool_t ares_evsys_epoll_event_add(ares_event_t *event)
+{
+ const ares_event_thread_t *e = event->e;
+ const ares_evsys_epoll_t *ep = e->ev_sys_data;
+ struct epoll_event epev;
+
+ memset(&epev, 0, sizeof(epev));
+ epev.data.fd = event->fd;
+ epev.events = EPOLLRDHUP | EPOLLERR | EPOLLHUP;
+ if (event->flags & ARES_EVENT_FLAG_READ) {
+ epev.events |= EPOLLIN;
+ }
+ if (event->flags & ARES_EVENT_FLAG_WRITE) {
+ epev.events |= EPOLLOUT;
+ }
+ if (epoll_ctl(ep->epoll_fd, EPOLL_CTL_ADD, event->fd, &epev) != 0) {
+ return ARES_FALSE;
+ }
+ return ARES_TRUE;
+}
+
+static void ares_evsys_epoll_event_del(ares_event_t *event)
+{
+ const ares_event_thread_t *e = event->e;
+ const ares_evsys_epoll_t *ep = e->ev_sys_data;
+ struct epoll_event epev;
+
+ memset(&epev, 0, sizeof(epev));
+ epev.data.fd = event->fd;
+ epoll_ctl(ep->epoll_fd, EPOLL_CTL_DEL, event->fd, &epev);
+}
+
+static void ares_evsys_epoll_event_mod(ares_event_t *event,
+ ares_event_flags_t new_flags)
+{
+ const ares_event_thread_t *e = event->e;
+ const ares_evsys_epoll_t *ep = e->ev_sys_data;
+ struct epoll_event epev;
+
+ memset(&epev, 0, sizeof(epev));
+ epev.data.fd = event->fd;
+ epev.events = EPOLLRDHUP | EPOLLERR | EPOLLHUP;
+ if (new_flags & ARES_EVENT_FLAG_READ) {
+ epev.events |= EPOLLIN;
+ }
+ if (new_flags & ARES_EVENT_FLAG_WRITE) {
+ epev.events |= EPOLLOUT;
+ }
+ epoll_ctl(ep->epoll_fd, EPOLL_CTL_MOD, event->fd, &epev);
+}
+
+static size_t ares_evsys_epoll_wait(ares_event_thread_t *e,
+ unsigned long timeout_ms)
+{
+ struct epoll_event events[8];
+ size_t nevents = sizeof(events) / sizeof(*events);
+ const ares_evsys_epoll_t *ep = e->ev_sys_data;
+ int rv;
+ size_t i;
+ size_t cnt = 0;
+
+ memset(events, 0, sizeof(events));
+
+ rv = epoll_wait(ep->epoll_fd, events, (int)nevents,
+ (timeout_ms == 0) ? -1 : (int)timeout_ms);
+ if (rv < 0) {
+ return 0;
+ }
+
+ nevents = (size_t)rv;
+
+ for (i = 0; i < nevents; i++) {
+ ares_event_t *ev;
+ ares_event_flags_t flags = 0;
+
+ ev = ares__htable_asvp_get_direct(e->ev_handles,
+ (ares_socket_t)events[i].data.fd);
+ if (ev == NULL || ev->cb == NULL) {
+ continue;
+ }
+
+ cnt++;
+
+ if (events[i].events & (EPOLLIN | EPOLLRDHUP | EPOLLHUP | EPOLLERR)) {
+ flags |= ARES_EVENT_FLAG_READ;
+ }
+ if (events[i].events & EPOLLOUT) {
+ flags |= ARES_EVENT_FLAG_WRITE;
+ }
+
+ ev->cb(e, ev->fd, ev->data, flags);
+ }
+
+ return cnt;
+}
+
+const ares_event_sys_t ares_evsys_epoll = { "epoll",
+ ares_evsys_epoll_init,
+ ares_evsys_epoll_destroy,
+ ares_evsys_epoll_event_add,
+ ares_evsys_epoll_event_del,
+ ares_evsys_epoll_event_mod,
+ ares_evsys_epoll_wait };
+#endif
diff --git a/contrib/libs/c-ares/src/lib/ares_event_kqueue.c b/contrib/libs/c-ares/src/lib/ares_event_kqueue.c
new file mode 100644
index 0000000000..944c4b003b
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares_event_kqueue.c
@@ -0,0 +1,249 @@
+/* MIT License
+ *
+ * Copyright (c) 2024 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#include "ares_setup.h"
+#include "ares.h"
+#include "ares_private.h"
+#include "ares_event.h"
+
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_EVENT_H
+# include <sys/event.h>
+#endif
+#ifdef HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+#ifdef HAVE_FCNTL_H
+# include <fcntl.h>
+#endif
+
+#ifdef HAVE_KQUEUE
+
+typedef struct {
+ int kqueue_fd;
+ struct kevent *changelist;
+ size_t nchanges;
+ size_t nchanges_alloc;
+} ares_evsys_kqueue_t;
+
+static void ares_evsys_kqueue_destroy(ares_event_thread_t *e)
+{
+ ares_evsys_kqueue_t *kq = NULL;
+
+ if (e == NULL) {
+ return;
+ }
+
+ kq = e->ev_sys_data;
+ if (kq == NULL) {
+ return;
+ }
+
+ if (kq->kqueue_fd != -1) {
+ close(kq->kqueue_fd);
+ }
+
+ ares_free(kq->changelist);
+ ares_free(kq);
+ e->ev_sys_data = NULL;
+}
+
+static ares_bool_t ares_evsys_kqueue_init(ares_event_thread_t *e)
+{
+ ares_evsys_kqueue_t *kq = NULL;
+
+ kq = ares_malloc_zero(sizeof(*kq));
+ if (kq == NULL) {
+ return ARES_FALSE;
+ }
+
+ e->ev_sys_data = kq;
+
+ kq->kqueue_fd = kqueue();
+ if (kq->kqueue_fd == -1) {
+ ares_evsys_kqueue_destroy(e);
+ return ARES_FALSE;
+ }
+
+# ifdef FD_CLOEXEC
+ fcntl(kq->kqueue_fd, F_SETFD, FD_CLOEXEC);
+# endif
+
+ kq->nchanges_alloc = 8;
+ kq->changelist =
+ ares_malloc_zero(sizeof(*kq->changelist) * kq->nchanges_alloc);
+ if (kq->changelist == NULL) {
+ ares_evsys_kqueue_destroy(e);
+ return ARES_FALSE;
+ }
+
+ e->ev_signal = ares_pipeevent_create(e);
+ if (e->ev_signal == NULL) {
+ ares_evsys_kqueue_destroy(e);
+ return ARES_FALSE;
+ }
+
+ return ARES_TRUE;
+}
+
+static void ares_evsys_kqueue_enqueue(ares_evsys_kqueue_t *kq, int fd,
+ int16_t filter, uint16_t flags)
+{
+ size_t idx;
+
+ if (kq == NULL) {
+ return;
+ }
+
+ idx = kq->nchanges;
+
+ kq->nchanges++;
+
+ if (kq->nchanges > kq->nchanges_alloc) {
+ kq->nchanges_alloc <<= 1;
+ kq->changelist = ares_realloc_zero(kq->changelist, kq->nchanges_alloc >> 1,
+ kq->nchanges_alloc);
+ }
+
+ EV_SET(&kq->changelist[idx], fd, filter, flags, 0, 0, 0);
+}
+
+static void ares_evsys_kqueue_event_process(ares_event_t *event,
+ ares_event_flags_t old_flags,
+ ares_event_flags_t new_flags)
+{
+ ares_event_thread_t *e = event->e;
+ ares_evsys_kqueue_t *kq;
+
+ if (e == NULL) {
+ return;
+ }
+
+ kq = e->ev_sys_data;
+ if (kq == NULL) {
+ return;
+ }
+
+ if (new_flags & ARES_EVENT_FLAG_READ && !(old_flags & ARES_EVENT_FLAG_READ)) {
+ ares_evsys_kqueue_enqueue(kq, event->fd, EVFILT_READ, EV_ADD | EV_ENABLE);
+ }
+
+ if (!(new_flags & ARES_EVENT_FLAG_READ) && old_flags & ARES_EVENT_FLAG_READ) {
+ ares_evsys_kqueue_enqueue(kq, event->fd, EVFILT_READ, EV_DELETE);
+ }
+
+ if (new_flags & ARES_EVENT_FLAG_WRITE &&
+ !(old_flags & ARES_EVENT_FLAG_WRITE)) {
+ ares_evsys_kqueue_enqueue(kq, event->fd, EVFILT_WRITE, EV_ADD | EV_ENABLE);
+ }
+
+ if (!(new_flags & ARES_EVENT_FLAG_WRITE) &&
+ old_flags & ARES_EVENT_FLAG_WRITE) {
+ ares_evsys_kqueue_enqueue(kq, event->fd, EVFILT_WRITE, EV_DELETE);
+ }
+}
+
+static ares_bool_t ares_evsys_kqueue_event_add(ares_event_t *event)
+{
+ ares_evsys_kqueue_event_process(event, 0, event->flags);
+ return ARES_TRUE;
+}
+
+static void ares_evsys_kqueue_event_del(ares_event_t *event)
+{
+ ares_evsys_kqueue_event_process(event, event->flags, 0);
+}
+
+static void ares_evsys_kqueue_event_mod(ares_event_t *event,
+ ares_event_flags_t new_flags)
+{
+ ares_evsys_kqueue_event_process(event, event->flags, new_flags);
+}
+
+static size_t ares_evsys_kqueue_wait(ares_event_thread_t *e,
+ unsigned long timeout_ms)
+{
+ struct kevent events[8];
+ size_t nevents = sizeof(events) / sizeof(*events);
+ ares_evsys_kqueue_t *kq = e->ev_sys_data;
+ int rv;
+ size_t i;
+ struct timespec ts;
+ struct timespec *timeout = NULL;
+ size_t cnt = 0;
+
+ if (timeout_ms != 0) {
+ ts.tv_sec = timeout_ms / 1000;
+ ts.tv_nsec = (timeout_ms % 1000) * 1000 * 1000;
+ timeout = &ts;
+ }
+
+ memset(events, 0, sizeof(events));
+
+ rv = kevent(kq->kqueue_fd, kq->changelist, (int)kq->nchanges, events,
+ (int)nevents, timeout);
+ if (rv < 0) {
+ return 0;
+ }
+
+ /* Changelist was consumed */
+ kq->nchanges = 0;
+ nevents = (size_t)rv;
+
+ for (i = 0; i < nevents; i++) {
+ ares_event_t *ev;
+ ares_event_flags_t flags = 0;
+
+ ev = ares__htable_asvp_get_direct(e->ev_handles,
+ (ares_socket_t)events[i].ident);
+ if (ev == NULL || ev->cb == NULL) {
+ continue;
+ }
+
+ cnt++;
+
+ if (events[i].filter == EVFILT_READ ||
+ events[i].flags & (EV_EOF | EV_ERROR)) {
+ flags |= ARES_EVENT_FLAG_READ;
+ } else {
+ flags |= ARES_EVENT_FLAG_WRITE;
+ }
+
+ ev->cb(e, ev->fd, ev->data, flags);
+ }
+
+ return cnt;
+}
+
+const ares_event_sys_t ares_evsys_kqueue = { "kqueue",
+ ares_evsys_kqueue_init,
+ ares_evsys_kqueue_destroy,
+ ares_evsys_kqueue_event_add,
+ ares_evsys_kqueue_event_del,
+ ares_evsys_kqueue_event_mod,
+ ares_evsys_kqueue_wait };
+#endif
diff --git a/contrib/libs/c-ares/src/lib/ares_event_poll.c b/contrib/libs/c-ares/src/lib/ares_event_poll.c
new file mode 100644
index 0000000000..33b1d6dfd5
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares_event_poll.c
@@ -0,0 +1,141 @@
+/* MIT License
+ *
+ * Copyright (c) 2024 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#include "ares_setup.h"
+#include "ares.h"
+#include "ares_private.h"
+#include "ares_event.h"
+#ifdef HAVE_POLL_H
+# include <poll.h>
+#endif
+
+#if defined(HAVE_POLL)
+
+static ares_bool_t ares_evsys_poll_init(ares_event_thread_t *e)
+{
+ e->ev_signal = ares_pipeevent_create(e);
+ if (e->ev_signal == NULL) {
+ return ARES_FALSE;
+ }
+ return ARES_TRUE;
+}
+
+static void ares_evsys_poll_destroy(ares_event_thread_t *e)
+{
+ (void)e;
+}
+
+static ares_bool_t ares_evsys_poll_event_add(ares_event_t *event)
+{
+ (void)event;
+ return ARES_TRUE;
+}
+
+static void ares_evsys_poll_event_del(ares_event_t *event)
+{
+ (void)event;
+}
+
+static void ares_evsys_poll_event_mod(ares_event_t *event,
+ ares_event_flags_t new_flags)
+{
+ (void)event;
+ (void)new_flags;
+}
+
+static size_t ares_evsys_poll_wait(ares_event_thread_t *e,
+ unsigned long timeout_ms)
+{
+ size_t num_fds = 0;
+ ares_socket_t *fdlist = ares__htable_asvp_keys(e->ev_handles, &num_fds);
+ struct pollfd *pollfd = NULL;
+ int rv;
+ size_t cnt = 0;
+ size_t i;
+
+ if (fdlist != NULL && num_fds) {
+ pollfd = ares_malloc_zero(sizeof(*pollfd) * num_fds);
+ if (pollfd == NULL) {
+ goto done;
+ }
+ for (i = 0; i < num_fds; i++) {
+ const ares_event_t *ev =
+ ares__htable_asvp_get_direct(e->ev_handles, fdlist[i]);
+ pollfd[i].fd = ev->fd;
+ if (ev->flags & ARES_EVENT_FLAG_READ) {
+ pollfd[i].events |= POLLIN;
+ }
+ if (ev->flags & ARES_EVENT_FLAG_WRITE) {
+ pollfd[i].events |= POLLOUT;
+ }
+ }
+ }
+ ares_free(fdlist);
+
+ rv = poll(pollfd, (nfds_t)num_fds, (timeout_ms == 0) ? -1 : (int)timeout_ms);
+ if (rv <= 0) {
+ goto done;
+ }
+
+ for (i = 0; pollfd != NULL && i < num_fds; i++) {
+ ares_event_t *ev;
+ ares_event_flags_t flags = 0;
+
+ if (pollfd[i].revents == 0) {
+ continue;
+ }
+
+ cnt++;
+
+ ev = ares__htable_asvp_get_direct(e->ev_handles, pollfd[i].fd);
+ if (ev == NULL || ev->cb == NULL) {
+ continue;
+ }
+
+ if (pollfd[i].revents & (POLLERR | POLLHUP | POLLIN)) {
+ flags |= ARES_EVENT_FLAG_READ;
+ }
+
+ if (pollfd[i].revents & POLLOUT) {
+ flags |= ARES_EVENT_FLAG_WRITE;
+ }
+
+ ev->cb(e, pollfd[i].fd, ev->data, flags);
+ }
+
+done:
+ ares_free(pollfd);
+ return cnt;
+}
+
+const ares_event_sys_t ares_evsys_poll = { "poll",
+ ares_evsys_poll_init,
+ ares_evsys_poll_destroy, /* NoOp */
+ ares_evsys_poll_event_add, /* NoOp */
+ ares_evsys_poll_event_del, /* NoOp */
+ ares_evsys_poll_event_mod, /* NoOp */
+ ares_evsys_poll_wait };
+
+#endif
diff --git a/contrib/libs/c-ares/src/lib/ares_event_select.c b/contrib/libs/c-ares/src/lib/ares_event_select.c
new file mode 100644
index 0000000000..4823e808f1
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares_event_select.c
@@ -0,0 +1,151 @@
+/* MIT License
+ *
+ * Copyright (c) 2024 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#include "ares_setup.h"
+#include "ares.h"
+#include "ares_private.h"
+#include "ares_event.h"
+#ifdef HAVE_SYS_SELECT_H
+# include <sys/select.h>
+#endif
+
+/* All systems have select(), but not all have a way to wake, so we require
+ * pipe() to wake the select() */
+#if defined(HAVE_PIPE)
+
+static ares_bool_t ares_evsys_select_init(ares_event_thread_t *e)
+{
+ e->ev_signal = ares_pipeevent_create(e);
+ if (e->ev_signal == NULL) {
+ return ARES_FALSE;
+ }
+ return ARES_TRUE;
+}
+
+static void ares_evsys_select_destroy(ares_event_thread_t *e)
+{
+ (void)e;
+}
+
+static ares_bool_t ares_evsys_select_event_add(ares_event_t *event)
+{
+ (void)event;
+ return ARES_TRUE;
+}
+
+static void ares_evsys_select_event_del(ares_event_t *event)
+{
+ (void)event;
+}
+
+static void ares_evsys_select_event_mod(ares_event_t *event,
+ ares_event_flags_t new_flags)
+{
+ (void)event;
+ (void)new_flags;
+}
+
+static size_t ares_evsys_select_wait(ares_event_thread_t *e,
+ unsigned long timeout_ms)
+{
+ size_t num_fds = 0;
+ ares_socket_t *fdlist = ares__htable_asvp_keys(e->ev_handles, &num_fds);
+ int rv;
+ size_t cnt = 0;
+ size_t i;
+ fd_set read_fds;
+ fd_set write_fds;
+ int nfds = 0;
+ struct timeval tv;
+ struct timeval *tout = NULL;
+
+ FD_ZERO(&read_fds);
+ FD_ZERO(&write_fds);
+
+ for (i = 0; i < num_fds; i++) {
+ const ares_event_t *ev =
+ ares__htable_asvp_get_direct(e->ev_handles, fdlist[i]);
+ if (ev->flags & ARES_EVENT_FLAG_READ) {
+ FD_SET(ev->fd, &read_fds);
+ }
+ if (ev->flags & ARES_EVENT_FLAG_WRITE) {
+ FD_SET(ev->fd, &write_fds);
+ }
+ if (ev->fd + 1 > nfds) {
+ nfds = ev->fd + 1;
+ }
+ }
+
+ if (timeout_ms) {
+ tv.tv_sec = (int)(timeout_ms / 1000);
+ tv.tv_usec = (int)((timeout_ms % 1000) * 1000);
+ tout = &tv;
+ }
+
+ rv = select(nfds, &read_fds, &write_fds, NULL, tout);
+ if (rv > 0) {
+ for (i = 0; i < num_fds; i++) {
+ ares_event_t *ev;
+ ares_event_flags_t flags = 0;
+
+ ev = ares__htable_asvp_get_direct(e->ev_handles, fdlist[i]);
+ if (ev == NULL || ev->cb == NULL) {
+ continue;
+ }
+
+ if (FD_ISSET(fdlist[i], &read_fds)) {
+ flags |= ARES_EVENT_FLAG_READ;
+ }
+
+ if (FD_ISSET(fdlist[i], &write_fds)) {
+ flags |= ARES_EVENT_FLAG_WRITE;
+ }
+
+ if (flags == 0) {
+ continue;
+ }
+
+ cnt++;
+
+ ev->cb(e, fdlist[i], ev->data, flags);
+ }
+ }
+
+ ares_free(fdlist);
+
+ return cnt;
+}
+
+const ares_event_sys_t ares_evsys_select = {
+ "select",
+ ares_evsys_select_init,
+ ares_evsys_select_destroy, /* NoOp */
+ ares_evsys_select_event_add, /* NoOp */
+ ares_evsys_select_event_del, /* NoOp */
+ ares_evsys_select_event_mod, /* NoOp */
+ ares_evsys_select_wait
+};
+
+#endif
diff --git a/contrib/libs/c-ares/src/lib/ares_event_thread.c b/contrib/libs/c-ares/src/lib/ares_event_thread.c
new file mode 100644
index 0000000000..6dd7b502a3
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares_event_thread.c
@@ -0,0 +1,452 @@
+/* MIT License
+ *
+ * Copyright (c) 2024 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#include "ares_setup.h"
+#include "ares.h"
+#include "ares_private.h"
+#include "ares_event.h"
+
+static void ares_event_destroy_cb(void *arg)
+{
+ ares_event_t *event = arg;
+ if (event == NULL) {
+ return;
+ }
+
+ /* Unregister from the event thread if it was registered with one */
+ if (event->e) {
+ const ares_event_thread_t *e = event->e;
+ e->ev_sys->event_del(event);
+ event->e = NULL;
+ }
+
+ if (event->free_data_cb && event->data) {
+ event->free_data_cb(event->data);
+ }
+
+ ares_free(event);
+}
+
+/* See if a pending update already exists. We don't want to enqueue multiple
+ * updates for the same event handle. Right now this is O(n) based on number
+ * of updates already enqueued. In the future, it might make sense to make
+ * this O(1) with a hashtable.
+ * NOTE: in some cases a delete then re-add of the same fd, but really pointing
+ * to a different destination can happen due to a quick close of a
+ * connection then creation of a new one. So we need to look at the
+ * flags and ignore any delete events when finding a match since we
+ * need to process the delete always, it can't be combined with other
+ * updates. */
+static ares_event_t *ares_event_update_find(ares_event_thread_t *e,
+ ares_socket_t fd, const void *data)
+{
+ ares__llist_node_t *node;
+
+ for (node = ares__llist_node_first(e->ev_updates); node != NULL;
+ node = ares__llist_node_next(node)) {
+ ares_event_t *ev = ares__llist_node_val(node);
+
+ if (fd != ARES_SOCKET_BAD && fd == ev->fd && ev->flags != 0) {
+ return ev;
+ }
+
+ if (fd == ARES_SOCKET_BAD && ev->fd == ARES_SOCKET_BAD &&
+ data == ev->data && ev->flags != 0) {
+ return ev;
+ }
+ }
+
+ return NULL;
+}
+
+ares_status_t ares_event_update(ares_event_t **event, ares_event_thread_t *e,
+ ares_event_flags_t flags, ares_event_cb_t cb,
+ ares_socket_t fd, void *data,
+ ares_event_free_data_t free_data_cb,
+ ares_event_signal_cb_t signal_cb)
+{
+ ares_event_t *ev = NULL;
+
+ if (e == NULL || cb == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ if (event != NULL) {
+ *event = NULL;
+ }
+
+ /* Validate flags */
+ if (fd == ARES_SOCKET_BAD) {
+ if (flags & (ARES_EVENT_FLAG_READ | ARES_EVENT_FLAG_WRITE)) {
+ return ARES_EFORMERR;
+ }
+ if (!(flags & ARES_EVENT_FLAG_OTHER)) {
+ return ARES_EFORMERR;
+ }
+ } else {
+ if (flags & ARES_EVENT_FLAG_OTHER) {
+ return ARES_EFORMERR;
+ }
+ }
+
+ /* That's all the validation we can really do */
+
+ /* See if we have a queued update already */
+ ev = ares_event_update_find(e, fd, data);
+ if (ev == NULL) {
+ /* Allocate a new one */
+ ev = ares_malloc_zero(sizeof(*ev));
+ if (ev == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ if (ares__llist_insert_last(e->ev_updates, ev) == NULL) {
+ ares_free(ev);
+ return ARES_ENOMEM;
+ }
+ }
+
+ ev->flags = flags;
+ ev->fd = fd;
+ if (ev->cb == NULL) {
+ ev->cb = cb;
+ }
+ if (ev->data == NULL) {
+ ev->data = data;
+ }
+ if (ev->free_data_cb == NULL) {
+ ev->free_data_cb = free_data_cb;
+ }
+ if (ev->signal_cb == NULL) {
+ ev->signal_cb = signal_cb;
+ }
+
+ if (event != NULL) {
+ *event = ev;
+ }
+
+ return ARES_SUCCESS;
+}
+
+static void ares_event_signal(const ares_event_t *event)
+{
+ if (event == NULL || event->signal_cb == NULL) {
+ return;
+ }
+ event->signal_cb(event);
+}
+
+static void ares_event_thread_wake(const ares_event_thread_t *e)
+{
+ if (e == NULL) {
+ return;
+ }
+
+ ares_event_signal(e->ev_signal);
+}
+
+static void ares_event_thread_process_fd(ares_event_thread_t *e,
+ ares_socket_t fd, void *data,
+ ares_event_flags_t flags)
+{
+ (void)data;
+
+ ares_process_fd(e->channel,
+ (flags & ARES_EVENT_FLAG_READ) ? fd : ARES_SOCKET_BAD,
+ (flags & ARES_EVENT_FLAG_WRITE) ? fd : ARES_SOCKET_BAD);
+}
+
+static void ares_event_thread_sockstate_cb(void *data, ares_socket_t socket_fd,
+ int readable, int writable)
+{
+ ares_event_thread_t *e = data;
+ ares_event_flags_t flags = ARES_EVENT_FLAG_NONE;
+
+ if (readable) {
+ flags |= ARES_EVENT_FLAG_READ;
+ }
+
+ if (writable) {
+ flags |= ARES_EVENT_FLAG_WRITE;
+ }
+
+ /* Update channel fd */
+ ares__thread_mutex_lock(e->mutex);
+ ares_event_update(NULL, e, flags, ares_event_thread_process_fd, socket_fd,
+ NULL, NULL, NULL);
+
+ /* Wake the event thread so it properly enqueues any updates */
+ ares_event_thread_wake(e);
+
+ ares__thread_mutex_unlock(e->mutex);
+}
+
+static void ares_event_process_updates(ares_event_thread_t *e)
+{
+ ares__llist_node_t *node;
+
+ /* Iterate across all updates and apply to internal list, removing from update
+ * list */
+ while ((node = ares__llist_node_first(e->ev_updates)) != NULL) {
+ ares_event_t *newev = ares__llist_node_claim(node);
+ ares_event_t *oldev =
+ ares__htable_asvp_get_direct(e->ev_handles, newev->fd);
+
+ /* Adding new */
+ if (oldev == NULL) {
+ newev->e = e;
+ /* Don't try to add a new event if all flags are cleared, that's basically
+ * someone trying to delete something already deleted. Also if it fails
+ * to add, cleanup. */
+ if (newev->flags == ARES_EVENT_FLAG_NONE ||
+ !e->ev_sys->event_add(newev)) {
+ newev->e = NULL;
+ ares_event_destroy_cb(newev);
+ } else {
+ ares__htable_asvp_insert(e->ev_handles, newev->fd, newev);
+ }
+ continue;
+ }
+
+ /* Removal request */
+ if (newev->flags == ARES_EVENT_FLAG_NONE) {
+ /* the callback for the removal will call e->ev_sys->event_del(e, event)
+ */
+ ares__htable_asvp_remove(e->ev_handles, newev->fd);
+ ares_free(newev);
+ continue;
+ }
+
+ /* Modify request -- only flags can be changed */
+ e->ev_sys->event_mod(oldev, newev->flags);
+ oldev->flags = newev->flags;
+ ares_free(newev);
+ }
+}
+
+static void *ares_event_thread(void *arg)
+{
+ ares_event_thread_t *e = arg;
+ ares__thread_mutex_lock(e->mutex);
+
+ while (e->isup) {
+ struct timeval tv;
+ const struct timeval *tvout;
+ unsigned long timeout_ms = 0; /* 0 = unlimited */
+
+ tvout = ares_timeout(e->channel, NULL, &tv);
+ if (tvout != NULL) {
+ timeout_ms =
+ (unsigned long)((tvout->tv_sec * 1000) + (tvout->tv_usec / 1000) + 1);
+ }
+
+ ares_event_process_updates(e);
+
+ /* Don't hold a mutex while waiting on events */
+ ares__thread_mutex_unlock(e->mutex);
+ e->ev_sys->wait(e, timeout_ms);
+
+ /* Each iteration should do timeout processing */
+ if (e->isup) {
+ ares_process_fd(e->channel, ARES_SOCKET_BAD, ARES_SOCKET_BAD);
+ }
+
+ /* Relock before we loop again */
+ ares__thread_mutex_lock(e->mutex);
+ }
+
+ ares__thread_mutex_unlock(e->mutex);
+ return NULL;
+}
+
+static void ares_event_thread_destroy_int(ares_event_thread_t *e)
+{
+ ares__llist_node_t *node;
+
+ /* Wake thread and tell it to shutdown if it exists */
+ ares__thread_mutex_lock(e->mutex);
+ if (e->isup) {
+ e->isup = ARES_FALSE;
+ ares_event_thread_wake(e);
+ }
+ ares__thread_mutex_unlock(e->mutex);
+
+ /* Wait for thread to shutdown */
+ if (e->thread) {
+ ares__thread_join(e->thread, NULL);
+ e->thread = NULL;
+ }
+
+ /* Manually free any updates that weren't processed */
+ while ((node = ares__llist_node_first(e->ev_updates)) != NULL) {
+ ares_event_destroy_cb(ares__llist_node_claim(node));
+ }
+ ares__llist_destroy(e->ev_updates);
+ e->ev_updates = NULL;
+
+ ares__htable_asvp_destroy(e->ev_handles);
+ e->ev_handles = NULL;
+
+ if (e->ev_sys->destroy) {
+ e->ev_sys->destroy(e);
+ }
+
+ ares__thread_mutex_destroy(e->mutex);
+ e->mutex = NULL;
+
+ ares_free(e);
+}
+
+void ares_event_thread_destroy(ares_channel_t *channel)
+{
+ ares_event_thread_t *e = channel->sock_state_cb_data;
+
+ if (e == NULL) {
+ return;
+ }
+
+ ares_event_thread_destroy_int(e);
+}
+
+static const ares_event_sys_t *ares_event_fetch_sys(ares_evsys_t evsys)
+{
+ switch (evsys) {
+ case ARES_EVSYS_WIN32:
+#if defined(_WIN32)
+ return &ares_evsys_win32;
+#else
+ return NULL;
+#endif
+
+ case ARES_EVSYS_EPOLL:
+#if defined(HAVE_EPOLL)
+ return &ares_evsys_epoll;
+#else
+ return NULL;
+#endif
+
+ case ARES_EVSYS_KQUEUE:
+#if defined(HAVE_KQUEUE)
+ return &ares_evsys_kqueue;
+#else
+ return NULL;
+#endif
+
+ case ARES_EVSYS_POLL:
+#if defined(HAVE_POLL)
+ return &ares_evsys_poll;
+#else
+ return NULL;
+#endif
+
+ case ARES_EVSYS_SELECT:
+#if defined(HAVE_PIPE)
+ return &ares_evsys_select;
+#else
+ return NULL;
+#endif
+
+ /* case ARES_EVSYS_DEFAULT: */
+ default:
+#if defined(_WIN32)
+ return &ares_evsys_win32;
+#elif defined(HAVE_KQUEUE)
+ return &ares_evsys_kqueue;
+#elif defined(HAVE_EPOLL)
+ return &ares_evsys_epoll;
+#elif defined(HAVE_POLL)
+ return &ares_evsys_poll;
+#elif defined(HAVE_PIPE)
+ return &ares_evsys_select;
+#else
+ break;
+#endif
+ }
+
+ return NULL;
+}
+
+ares_status_t ares_event_thread_init(ares_channel_t *channel)
+{
+ ares_event_thread_t *e;
+
+ e = ares_malloc_zero(sizeof(*e));
+ if (e == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ e->mutex = ares__thread_mutex_create();
+ if (e->mutex == NULL) {
+ ares_event_thread_destroy_int(e);
+ return ARES_ENOMEM;
+ }
+
+ e->ev_updates = ares__llist_create(NULL);
+ if (e->ev_updates == NULL) {
+ ares_event_thread_destroy_int(e);
+ return ARES_ENOMEM;
+ }
+
+ e->ev_handles = ares__htable_asvp_create(ares_event_destroy_cb);
+ if (e->ev_handles == NULL) {
+ ares_event_thread_destroy_int(e);
+ return ARES_ENOMEM;
+ }
+
+ e->channel = channel;
+ e->isup = ARES_TRUE;
+ e->ev_sys = ares_event_fetch_sys(channel->evsys);
+ if (e->ev_sys == NULL) {
+ ares_event_thread_destroy_int(e);
+ return ARES_ENOTIMP;
+ }
+
+ channel->sock_state_cb = ares_event_thread_sockstate_cb;
+ channel->sock_state_cb_data = e;
+
+ if (!e->ev_sys->init(e)) {
+ ares_event_thread_destroy_int(e);
+ channel->sock_state_cb = NULL;
+ channel->sock_state_cb_data = NULL;
+ return ARES_ESERVFAIL;
+ }
+
+ /* Before starting the thread, process any possible events the initialization
+ * might have enqueued as we may actually depend on these being valid
+ * immediately upon return, which may mean before the thread is fully spawned
+ * and processed the list itself. We don't want any sort of race conditions
+ * (like the event system wake handle itself). */
+ ares_event_process_updates(e);
+
+ /* Start thread */
+ if (ares__thread_create(&e->thread, ares_event_thread, e) != ARES_SUCCESS) {
+ ares_event_thread_destroy_int(e);
+ channel->sock_state_cb = NULL;
+ channel->sock_state_cb_data = NULL;
+ return ARES_ESERVFAIL;
+ }
+
+ return ARES_SUCCESS;
+}
diff --git a/contrib/libs/c-ares/src/lib/ares_event_wake_pipe.c b/contrib/libs/c-ares/src/lib/ares_event_wake_pipe.c
new file mode 100644
index 0000000000..a2cd6f609a
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares_event_wake_pipe.c
@@ -0,0 +1,166 @@
+/* MIT License
+ *
+ * Copyright (c) 2024 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#include "ares_setup.h"
+#include "ares.h"
+#include "ares_private.h"
+#include "ares_event.h"
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#ifdef HAVE_FCNTL_H
+# include <fcntl.h>
+#endif
+
+#ifdef HAVE_PIPE
+typedef struct {
+ int filedes[2];
+} ares_pipeevent_t;
+
+static void ares_pipeevent_destroy(ares_pipeevent_t *p)
+{
+ if (p->filedes[0] != -1) {
+ close(p->filedes[0]);
+ }
+ if (p->filedes[1] != -1) {
+ close(p->filedes[1]);
+ }
+
+ ares_free(p);
+}
+
+static void ares_pipeevent_destroy_cb(void *arg)
+{
+ ares_pipeevent_destroy(arg);
+}
+
+static ares_pipeevent_t *ares_pipeevent_init(void)
+{
+ ares_pipeevent_t *p = ares_malloc_zero(sizeof(*p));
+ if (p == NULL) {
+ return NULL;
+ }
+
+ p->filedes[0] = -1;
+ p->filedes[1] = -1;
+
+# ifdef HAVE_PIPE2
+ if (pipe2(p->filedes, O_NONBLOCK | O_CLOEXEC) != 0) {
+ ares_pipeevent_destroy(p);
+ return NULL;
+ }
+# else
+ if (pipe(p->filedes) != 0) {
+ ares_pipeevent_destroy(p);
+ return NULL;
+ }
+
+# ifdef O_NONBLOCK
+ {
+ int val;
+ val = fcntl(p->filedes[0], F_GETFL, 0);
+ if (val >= 0) {
+ val |= O_NONBLOCK;
+ }
+ fcntl(p->filedes[0], F_SETFL, val);
+
+ val = fcntl(p->filedes[1], F_GETFL, 0);
+ if (val >= 0) {
+ val |= O_NONBLOCK;
+ }
+ fcntl(p->filedes[1], F_SETFL, val);
+ }
+# endif
+
+# ifdef O_CLOEXEC
+ fcntl(p->filedes[0], F_SETFD, O_CLOEXEC);
+ fcntl(p->filedes[1], F_SETFD, O_CLOEXEC);
+# endif
+# endif
+
+# ifdef F_SETNOSIGPIPE
+ fcntl(p->filedes[0], F_SETNOSIGPIPE, 1);
+ fcntl(p->filedes[1], F_SETNOSIGPIPE, 1);
+# endif
+
+ return p;
+}
+
+static void ares_pipeevent_signal(const ares_event_t *e)
+{
+ const ares_pipeevent_t *p;
+
+ if (e == NULL || e->data == NULL) {
+ return;
+ }
+
+ p = e->data;
+ (void)write(p->filedes[1], "1", 1);
+}
+
+static void ares_pipeevent_cb(ares_event_thread_t *e, ares_socket_t fd,
+ void *data, ares_event_flags_t flags)
+{
+ unsigned char buf[32];
+ const ares_pipeevent_t *p = NULL;
+
+ (void)e;
+ (void)fd;
+ (void)flags;
+
+ if (data == NULL) {
+ return;
+ }
+
+ p = data;
+
+ while (read(p->filedes[0], buf, sizeof(buf)) == sizeof(buf)) {
+ /* Do nothing */
+ }
+}
+
+ares_event_t *ares_pipeevent_create(ares_event_thread_t *e)
+{
+ ares_event_t *event = NULL;
+ ares_pipeevent_t *p = NULL;
+ ares_status_t status;
+
+ p = ares_pipeevent_init();
+ if (p == NULL) {
+ return NULL;
+ }
+
+ status = ares_event_update(&event, e, ARES_EVENT_FLAG_READ, ares_pipeevent_cb,
+ p->filedes[0], p, ares_pipeevent_destroy_cb,
+ ares_pipeevent_signal);
+ if (status != ARES_SUCCESS) {
+ ares_pipeevent_destroy(p);
+ return NULL;
+ }
+
+ return event;
+}
+
+#endif
diff --git a/contrib/libs/c-ares/src/lib/ares_event_win32.c b/contrib/libs/c-ares/src/lib/ares_event_win32.c
new file mode 100644
index 0000000000..718e865085
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares_event_win32.c
@@ -0,0 +1,601 @@
+/* MIT License
+ *
+ * Copyright (c) 2024 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#include "ares_setup.h"
+#include "ares.h"
+#include "ares_private.h"
+#include "ares_event.h"
+#include "ares_event_win32.h"
+#ifdef HAVE_LIMITS_H
+# include <limits.h>
+#endif
+
+#ifdef _WIN32
+
+/* IMPLEMENTATION NOTES
+ * ====================
+ *
+ * This implementation uses some undocumented functionality within Windows for
+ * monitoring sockets. The Ancillary Function Driver (AFD) is the low level
+ * implementation that Winsock2 sits on top of. Winsock2 unfortunately does
+ * not expose the equivalent of epoll() or kqueue(), but it is possible to
+ * access AFD directly and use along with IOCP to simulate the functionality.
+ * We want to use IOCP if possible as it gives us the ability to monitor more
+ * than just sockets (WSAPoll is not an option), and perform arbitrary callbacks
+ * which means we can hook in non-socket related events.
+ *
+ * The information for this implementation was gathered from "wepoll" and
+ * "libuv" which both use slight variants on this, but this implementation
+ * doesn't directly follow either methodology.
+ *
+ * Initialization:
+ * 1. Dynamically load the NtDeviceIoControlFile and NtCancelIoFileEx internal
+ * symbols from ntdll.dll. These functions are used to submit the AFD POLL
+ * request and to cancel a prior request, respectively.
+ * 2. Create an IO Completion Port base handle via CreateIoCompletionPort()
+ * that all socket events will be delivered through.
+ * 3. Create a callback to be used to be able to interrupt waiting for IOCP
+ * events, this may be called for allowing enqueuing of additional socket
+ * events or removing socket events. PostQueuedCompletionStatus() is the
+ * obvious choice. Use the same container structure as used with a Socket
+ * but tagged indicating it is not as the CompletionKey (important!).
+ *
+ * Socket Add:
+ * 1. Create/Allocate a container for holding metadata about a socket:
+ * - SOCKET base_socket;
+ * - SOCKET peer_socket;
+ * - OVERLAPPED overlapped; -- Used by AFD POLL
+ * - AFD_POLL_INFO afd_poll_info; -- Used by AFD POLL
+ * 2. Call WSAIoctl(..., SIO_BASE_HANDLE, ...) to unwrap the SOCKET and get
+ * the "base socket" we can use for polling. It appears this may fail so
+ * we should call WSAIoctl(..., SIO_BSP_HANDLE_POLL, ...) as a fallback.
+ * 3. The SOCKET handle we have is most likely not capable of supporting
+ * OVERLAPPED, and we need to have a way to unbind a socket from IOCP
+ * (which is done via a simple closesocket()) so we need to duplicate the
+ * "base socket" using WSADuplicateSocketW() followed by
+ * WSASocketW(..., WSA_FLAG_OVERLAPPED) to create this "peer socket" for
+ * submitting AFD POLL requests.
+ * 4. Bind to IOCP using CreateIoCompletionPort() referencing the "peer
+ * socket" and the base IOCP handle from "Initialization". Use the
+ * pointer to the socket container as the "CompletionKey" which will be
+ * returned when an event occurs.
+ * 5. Submit AFD POLL request (see "AFD POLL Request" section)
+ *
+ * Socket Delete:
+ * 1. Call "AFD Poll Cancel" (see Section of same name)
+ * 2. If a cancel was requested (not bypassed due to no events, etc), tag the
+ * "container" for the socket as pending delete, and when the next IOCP
+ * event for the socket is dequeued, cleanup.
+ * 3. Otherwise, call closesocket(peer_socket) then free() the container
+ * which will officially delete it.
+ * NOTE: Deferring delete may be completely unnecessary. In theory closing
+ * the peer_socket() should guarantee no additional events will be
+ * delivered. But maybe if there's a pending event that hasn't been
+ * read yet but already trigggered it would be an issue, so this is
+ * "safer" unless we can prove its not necessary.
+ *
+ * Socket Modify:
+ * 1. Call "AFD Poll Cancel" (see Section of same name)
+ * 2. If a cancel was not enqueued because there is no pending request,
+ * submit AFD POLL request (see "AFD POLL Request" section), otherwise
+ * defer until next socket event.
+ *
+ * Event Wait:
+ * 1. Call GetQueuedCompletionStatusEx() with the base IOCP handle, a
+ * stack allocated array of OVERLAPPED_ENTRY's, and an appropriate
+ * timeout.
+ * 2. Iterate across returned events, the CompletionKey is a pointer to the
+ * container registered with CreateIoCompletionPort() or
+ * PostQueuedCompletionStatus()
+ * 3. If object indicates it is pending delete, go ahead and
+ * closesocket(peer_socket) and free() the container. Go to the next event.
+ * 4. Submit AFD POLL Request (see "AFD POLL Request"). We must re-enable
+ * the request each time we receive a response, it is not persistent.
+ * 5. Notify of any events received as indicated in the AFD_POLL_INFO
+ * Handles[0].Events (NOTE: check NumberOfHandles first, make sure it is
+ * > 0, otherwise we might not have events such as if our last request
+ * was cancelled).
+ *
+ * AFD Poll Request:
+ * 1. Initialize the AFD_POLL_INFO structure:
+ * Exclusive = TRUE; // Auto cancel duplicates for same socket
+ * NumberOfHandles = 1;
+ * Timeout.QuadPart = LLONG_MAX;
+ * Handles[0].Handle = (HANDLE)base_socket;
+ * Handles[0].Status = 0;
+ * Handles[0].Events = ... set as appropriate AFD_POLL_RECEIVE, etc;
+ * 2. Zero out the OVERLAPPED structure
+ * 3. Create an IO_STATUS_BLOCK pointer (iosb) and set it to the address of
+ * the OVERLAPPED "Internal" member.
+ * 4. Set the "Status" member of IO_STATUS_BLOCK to STATUS_PENDING
+ * 5. Call
+ * NtDeviceIoControlFile((HANDLE)peer_socket, NULL, NULL, &overlapped,
+ * iosb, IOCTL_AFD_POLL
+ * &afd_poll_info, sizeof(afd_poll_info),
+ * &afd_poll_info, sizeof(afd_poll_info));
+ * NOTE: Its not clear to me if the IO_STATUS_BLOCK pointing to OVERLAPPED
+ * is for efficiency or if its a requirement for AFD. This is what
+ * libuv does, so I'm doing it here too.
+ *
+ * AFD Poll Cancel:
+ * 1. Check to see if the IO_STATUS_BLOCK "Status" member for the socket
+ * is still STATUS_PENDING, if not, no cancel request is necessary.
+ * 2. Call
+ * NtCancelIoFileEx((HANDLE)peer_socket, iosb, &temp_iosb);
+ *
+ *
+ * References:
+ * - https://github.com/piscisaureus/wepoll/
+ * - https://github.com/libuv/libuv/
+ */
+
+typedef struct {
+ /* Dynamically loaded symbols */
+ NtDeviceIoControlFile_t NtDeviceIoControlFile;
+ NtCancelIoFileEx_t NtCancelIoFileEx;
+
+ /* Implementation details */
+ HANDLE iocp_handle;
+} ares_evsys_win32_t;
+
+typedef struct {
+ /*! Pointer to parent event container */
+ ares_event_t *event;
+ /*! Socket passed in to monitor */
+ SOCKET socket;
+ /*! Base socket derived from provided socket */
+ SOCKET base_socket;
+ /*! New socket (duplicate base_socket handle) supporting OVERLAPPED operation
+ */
+ SOCKET peer_socket;
+ /*! Structure for submitting AFD POLL requests (Internals!) */
+ AFD_POLL_INFO afd_poll_info;
+ /*! Overlapped structure submitted with AFD POLL requests and returned with
+ * IOCP results */
+ OVERLAPPED overlapped;
+} ares_evsys_win32_eventdata_t;
+
+static void ares_iocpevent_signal(const ares_event_t *event)
+{
+ ares_event_thread_t *e = event->e;
+ ares_evsys_win32_t *ew = e->ev_sys_data;
+
+ if (e == NULL) {
+ return;
+ }
+
+ PostQueuedCompletionStatus(ew->iocp_handle, 0, (ULONG_PTR)event->data, NULL);
+}
+
+static void ares_iocpevent_cb(ares_event_thread_t *e, ares_socket_t fd,
+ void *data, ares_event_flags_t flags)
+{
+ (void)e;
+ (void)data;
+ (void)fd;
+ (void)flags;
+}
+
+static ares_event_t *ares_iocpevent_create(ares_event_thread_t *e)
+{
+ ares_event_t *event = NULL;
+ ares_status_t status;
+
+ status =
+ ares_event_update(&event, e, ARES_EVENT_FLAG_OTHER, ares_iocpevent_cb,
+ ARES_SOCKET_BAD, NULL, NULL, ares_iocpevent_signal);
+ if (status != ARES_SUCCESS) {
+ return NULL;
+ }
+
+ return event;
+}
+
+static void ares_evsys_win32_destroy(ares_event_thread_t *e)
+{
+ ares_evsys_win32_t *ew = NULL;
+
+ if (e == NULL) {
+ return;
+ }
+
+ ew = e->ev_sys_data;
+ if (ew == NULL) {
+ return;
+ }
+
+ if (ew->iocp_handle != NULL) {
+ CloseHandle(ew->iocp_handle);
+ }
+
+ ares_free(ew);
+ e->ev_sys_data = NULL;
+}
+
+static ares_bool_t ares_evsys_win32_init(ares_event_thread_t *e)
+{
+ ares_evsys_win32_t *ew = NULL;
+ HMODULE ntdll;
+
+ ew = ares_malloc_zero(sizeof(*ew));
+ if (ew == NULL) {
+ return ARES_FALSE;
+ }
+
+ e->ev_sys_data = ew;
+
+ /* All apps should have ntdll.dll already loaded, so just get a handle to
+ * this */
+ ntdll = GetModuleHandleA("ntdll.dll");
+ if (ntdll == NULL) {
+ goto fail;
+ }
+
+ /* Load Internal symbols not typically accessible */
+ ew->NtDeviceIoControlFile = (NtDeviceIoControlFile_t)(void *)GetProcAddress(
+ ntdll, "NtDeviceIoControlFile");
+ ew->NtCancelIoFileEx =
+ (NtCancelIoFileEx_t)(void *)GetProcAddress(ntdll, "NtCancelIoFileEx");
+
+ if (ew->NtCancelIoFileEx == NULL || ew->NtDeviceIoControlFile == NULL) {
+ goto fail;
+ }
+
+ ew->iocp_handle = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);
+ if (ew->iocp_handle == NULL) {
+ goto fail;
+ }
+
+ e->ev_signal = ares_iocpevent_create(e);
+ if (e->ev_signal == NULL) {
+ goto fail;
+ }
+
+ return ARES_TRUE;
+
+fail:
+ ares_evsys_win32_destroy(e);
+ return ARES_FALSE;
+}
+
+static ares_socket_t ares_evsys_win32_basesocket(ares_socket_t socket)
+{
+ while (1) {
+ DWORD bytes; /* Not used */
+ ares_socket_t base_socket = ARES_SOCKET_BAD;
+ int rv;
+
+ rv = WSAIoctl(socket, SIO_BASE_HANDLE, NULL, 0, &base_socket,
+ sizeof(base_socket), &bytes, NULL, NULL);
+ if (rv != SOCKET_ERROR && base_socket != ARES_SOCKET_BAD) {
+ socket = base_socket;
+ break;
+ }
+
+ /* If we're here, an error occurred */
+ if (GetLastError() == WSAENOTSOCK) {
+ /* This is critical, exit */
+ return ARES_SOCKET_BAD;
+ }
+
+ /* Work around known bug in Komodia based LSPs, use ARES_BSP_HANDLE_POLL
+ * to retrieve the underlying socket to then loop and get the base socket:
+ * https://docs.microsoft.com/en-us/windows/win32/winsock/winsock-ioctls
+ * https://www.komodia.com/newwiki/index.php?title=Komodia%27s_Redirector_bug_fixes#Version_2.2.2.6
+ */
+ base_socket = ARES_SOCKET_BAD;
+ rv = WSAIoctl(socket, SIO_BSP_HANDLE_POLL, NULL, 0, &base_socket,
+ sizeof(base_socket), &bytes, NULL, NULL);
+
+ if (rv != SOCKET_ERROR && base_socket != ARES_SOCKET_BAD &&
+ base_socket != socket) {
+ socket = base_socket;
+ continue; /* loop! */
+ }
+
+ return ARES_SOCKET_BAD;
+ }
+
+ return socket;
+}
+
+static ares_bool_t ares_evsys_win32_afd_enqueue(ares_event_t *event,
+ ares_event_flags_t flags)
+{
+ ares_event_thread_t *e = event->e;
+ ares_evsys_win32_t *ew = e->ev_sys_data;
+ ares_evsys_win32_eventdata_t *ed = event->data;
+ NTSTATUS status;
+ IO_STATUS_BLOCK *iosb_ptr;
+
+ if (e == NULL || ed == NULL || ew == NULL) {
+ return ARES_FALSE;
+ }
+
+ /* Enqueue AFD Poll */
+ ed->afd_poll_info.Exclusive = TRUE;
+ ed->afd_poll_info.NumberOfHandles = 1;
+ ed->afd_poll_info.Timeout.QuadPart = LLONG_MAX;
+ ed->afd_poll_info.Handles[0].Handle = (HANDLE)ed->base_socket;
+ ed->afd_poll_info.Handles[0].Status = 0;
+ ed->afd_poll_info.Handles[0].Events = 0;
+
+ if (flags & ARES_EVENT_FLAG_READ) {
+ ed->afd_poll_info.Handles[0].Events |=
+ (AFD_POLL_RECEIVE | AFD_POLL_DISCONNECT | AFD_POLL_ACCEPT |
+ AFD_POLL_ABORT);
+ }
+ if (flags & ARES_EVENT_FLAG_WRITE) {
+ ed->afd_poll_info.Handles[0].Events |=
+ (AFD_POLL_SEND | AFD_POLL_CONNECT_FAIL);
+ }
+ if (flags == 0) {
+ ed->afd_poll_info.Handles[0].Events |= AFD_POLL_DISCONNECT;
+ }
+
+ memset(&ed->overlapped, 0, sizeof(ed->overlapped));
+ iosb_ptr = (IO_STATUS_BLOCK *)&ed->overlapped.Internal;
+ iosb_ptr->Status = STATUS_PENDING;
+
+ status = ew->NtDeviceIoControlFile(
+ (HANDLE)ed->peer_socket, NULL, NULL, &ed->overlapped, iosb_ptr,
+ IOCTL_AFD_POLL, &ed->afd_poll_info, sizeof(ed->afd_poll_info),
+ &ed->afd_poll_info, sizeof(ed->afd_poll_info));
+ if (status != STATUS_SUCCESS && status != STATUS_PENDING) {
+ printf("%s(): failed to perform IOCTL_AFD_POLL operation\n", __FUNCTION__);
+ fflush(stdout);
+ return ARES_FALSE;
+ }
+
+ return ARES_TRUE;
+}
+
+static ares_bool_t ares_evsys_win32_afd_cancel(ares_evsys_win32_eventdata_t *ed)
+{
+ IO_STATUS_BLOCK *iosb_ptr;
+ IO_STATUS_BLOCK cancel_iosb;
+ ares_evsys_win32_t *ew;
+ NTSTATUS status;
+
+ /* Detached due to destroy */
+ if (ed->event == NULL) {
+ return ARES_FALSE;
+ }
+
+ iosb_ptr = (IO_STATUS_BLOCK *)&ed->overlapped.Internal;
+ /* Not pending, nothing to do */
+ if (iosb_ptr->Status != STATUS_PENDING) {
+ return ARES_FALSE;
+ }
+
+ ew = ed->event->e->ev_sys_data;
+ status =
+ ew->NtCancelIoFileEx((HANDLE)ed->peer_socket, iosb_ptr, &cancel_iosb);
+
+ /* NtCancelIoFileEx() may return STATUS_NOT_FOUND if the operation completed
+ * just before calling NtCancelIoFileEx(), but we have not yet received the
+ * notifiction (but it should be queued for the next IOCP event). */
+ if (status == STATUS_SUCCESS || status == STATUS_NOT_FOUND) {
+ return ARES_TRUE;
+ }
+
+ return ARES_FALSE;
+}
+
+static void ares_evsys_win32_eventdata_destroy(ares_evsys_win32_eventdata_t *ed)
+{
+ if (ed == NULL) {
+ return;
+ }
+
+ if (ed->peer_socket != ARES_SOCKET_BAD) {
+ closesocket(ed->peer_socket);
+ }
+
+ ares_free(ed);
+}
+
+static ares_bool_t ares_evsys_win32_event_add(ares_event_t *event)
+{
+ ares_event_thread_t *e = event->e;
+ ares_evsys_win32_t *ew = e->ev_sys_data;
+ ares_evsys_win32_eventdata_t *ed;
+ WSAPROTOCOL_INFOW protocol_info;
+
+ ed = ares_malloc_zero(sizeof(*ed));
+ ed->event = event;
+ ed->socket = event->fd;
+ ed->base_socket = ARES_SOCKET_BAD;
+ ed->peer_socket = ARES_SOCKET_BAD;
+
+ /* Likely a signal event, not something we will directly handle. We create
+ * the ares_evsys_win32_eventdata_t as the placeholder to use as the
+ * IOCP Completion Key */
+ if (ed->socket == ARES_SOCKET_BAD) {
+ event->data = ed;
+ return ARES_TRUE;
+ }
+
+ ed->base_socket = ares_evsys_win32_basesocket(ed->socket);
+ if (ed->base_socket == ARES_SOCKET_BAD) {
+ fprintf(stderr, "%s(): could not determine base socket for fd %d\n",
+ __FUNCTION__, (int)event->fd);
+ ares_evsys_win32_eventdata_destroy(ed);
+ return ARES_FALSE;
+ }
+
+ /* Create a peer socket that supports OVERLAPPED so we can use IOCP on the
+ * socket handle */
+ if (WSADuplicateSocketW(ed->base_socket, GetCurrentProcessId(),
+ &protocol_info) != 0) {
+ fprintf(stderr,
+ "%s(): could not retrieve protocol info for creating peer socket\n",
+ __FUNCTION__);
+ ares_evsys_win32_eventdata_destroy(ed);
+ return ARES_FALSE;
+ }
+
+ ed->peer_socket =
+ WSASocketW(protocol_info.iAddressFamily, protocol_info.iSocketType,
+ protocol_info.iProtocol, &protocol_info, 0, WSA_FLAG_OVERLAPPED);
+ if (ed->peer_socket == ARES_SOCKET_BAD) {
+ fprintf(stderr, "%s(): could not create peer socket\n", __FUNCTION__);
+ ares_evsys_win32_eventdata_destroy(ed);
+ return ARES_FALSE;
+ }
+
+ SetHandleInformation((HANDLE)ed->peer_socket, HANDLE_FLAG_INHERIT, 0);
+
+ if (CreateIoCompletionPort((HANDLE)ed->peer_socket, ew->iocp_handle,
+ (ULONG_PTR)ed, 0) == NULL) {
+ fprintf(stderr, "%s(): failed to bind peer socket to IOCP\n", __FUNCTION__);
+ ares_evsys_win32_eventdata_destroy(ed);
+ return ARES_FALSE;
+ }
+
+ event->data = ed;
+
+ if (!ares_evsys_win32_afd_enqueue(event, event->flags)) {
+ event->data = NULL;
+ ares_evsys_win32_eventdata_destroy(ed);
+ return ARES_FALSE;
+ }
+
+ return ARES_TRUE;
+}
+
+static void ares_evsys_win32_event_del(ares_event_t *event)
+{
+ ares_evsys_win32_eventdata_t *ed = event->data;
+ ares_event_thread_t *e = event->e;
+
+ if (event->fd == ARES_SOCKET_BAD || !e->isup || ed == NULL ||
+ !ares_evsys_win32_afd_cancel(ed)) {
+ /* Didn't need to enqueue a cancellation, for one of these reasons:
+ * - Not an IOCP socket
+ * - This is during shutdown of the event thread, no more signals can be
+ * delivered.
+ * - It has been determined there is no AFD POLL queued currently for the
+ * socket.
+ */
+ ares_evsys_win32_eventdata_destroy(ed);
+ event->data = NULL;
+ } else {
+ /* Detach from event, so when the cancel event comes through,
+ * it will clean up */
+ ed->event = NULL;
+ event->data = NULL;
+ }
+}
+
+static void ares_evsys_win32_event_mod(ares_event_t *event,
+ ares_event_flags_t new_flags)
+{
+ ares_evsys_win32_eventdata_t *ed = event->data;
+
+ /* Not for us */
+ if (event->fd == ARES_SOCKET_BAD || ed == NULL) {
+ return;
+ }
+
+ /* Try to cancel any current outstanding poll, if one is not running,
+ * go ahead and queue it up */
+ if (!ares_evsys_win32_afd_cancel(ed)) {
+ ares_evsys_win32_afd_enqueue(event, new_flags);
+ }
+}
+
+static size_t ares_evsys_win32_wait(ares_event_thread_t *e,
+ unsigned long timeout_ms)
+{
+ ares_evsys_win32_t *ew = e->ev_sys_data;
+ OVERLAPPED_ENTRY entries[16];
+ ULONG nentries = sizeof(entries) / sizeof(*entries);
+ BOOL status;
+ size_t i;
+ size_t cnt = 0;
+
+ status = GetQueuedCompletionStatusEx(
+ ew->iocp_handle, entries, nentries, &nentries,
+ (timeout_ms == 0) ? INFINITE : (DWORD)timeout_ms, FALSE);
+
+ if (!status) {
+ return 0;
+ }
+
+ for (i = 0; i < (size_t)nentries; i++) {
+ ares_event_flags_t flags = 0;
+ ares_evsys_win32_eventdata_t *ed =
+ (ares_evsys_win32_eventdata_t *)entries[i].lpCompletionKey;
+ ares_event_t *event = ed->event;
+
+ if (ed->socket == ARES_SOCKET_BAD) {
+ /* Some sort of signal event */
+ flags = ARES_EVENT_FLAG_OTHER;
+ } else {
+ /* Process events */
+ if (ed->afd_poll_info.NumberOfHandles > 0) {
+ if (ed->afd_poll_info.Handles[0].Events &
+ (AFD_POLL_RECEIVE | AFD_POLL_DISCONNECT | AFD_POLL_ACCEPT |
+ AFD_POLL_ABORT)) {
+ flags |= ARES_EVENT_FLAG_READ;
+ }
+ if (ed->afd_poll_info.Handles[0].Events &
+ (AFD_POLL_SEND | AFD_POLL_CONNECT_FAIL)) {
+ flags |= ARES_EVENT_FLAG_WRITE;
+ }
+
+ /* XXX: Handle ed->afd_poll_info.Handles[0].Events &
+ * AFD_POLL_LOCAL_CLOSE */
+ }
+
+ if (event == NULL) {
+ /* This means we need to cleanup the private event data as we've been
+ * detached */
+ ares_evsys_win32_eventdata_destroy(ed);
+ } else {
+ /* Re-enqueue so we can get more events on the socket */
+ ares_evsys_win32_afd_enqueue(event, event->flags);
+ }
+ }
+
+ if (event != NULL && flags != 0) {
+ cnt++;
+ event->cb(e, event->fd, event->data, flags);
+ }
+ }
+
+ return cnt;
+}
+
+const ares_event_sys_t ares_evsys_win32 = { "win32",
+ ares_evsys_win32_init,
+ ares_evsys_win32_destroy,
+ ares_evsys_win32_event_add,
+ ares_evsys_win32_event_del,
+ ares_evsys_win32_event_mod,
+ ares_evsys_win32_wait };
+#endif
diff --git a/contrib/libs/c-ares/src/lib/ares_event_win32.h b/contrib/libs/c-ares/src/lib/ares_event_win32.h
new file mode 100644
index 0000000000..99cd5c90f3
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares_event_win32.h
@@ -0,0 +1,119 @@
+/* MIT License
+ *
+ * Copyright (c) 2024 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#ifndef __ARES_EVENT_WIN32_H
+#define __ARES_EVENT_WIN32_H
+
+#ifdef _WIN32
+# ifdef HAVE_WINSOCK2_H
+# include <winsock2.h>
+# endif
+# ifdef HAVE_WS2TCPIP_H
+# include <ws2tcpip.h>
+# endif
+# ifdef HAVE_MSWSOCK_H
+# include <mswsock.h>
+# endif
+# ifdef HAVE_WINDOWS_H
+# include <windows.h>
+# endif
+
+/* From winternl.h */
+
+/* If WDK is not installed and not using MinGW, provide the needed definitions
+ */
+typedef LONG NTSTATUS;
+
+typedef struct _IO_STATUS_BLOCK {
+ union {
+ NTSTATUS Status;
+ PVOID Pointer;
+ };
+
+ ULONG_PTR Information;
+} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
+
+typedef VOID(NTAPI *PIO_APC_ROUTINE)(PVOID ApcContext,
+ PIO_STATUS_BLOCK IoStatusBlock,
+ ULONG Reserved);
+
+/* From ntstatus.h */
+# define STATUS_SUCCESS ((NTSTATUS)0x00000000)
+# ifndef STATUS_PENDING
+# define STATUS_PENDING ((NTSTATUS)0x00000103L)
+# endif
+# define STATUS_CANCELLED ((NTSTATUS)0xC0000120L)
+# define STATUS_NOT_FOUND ((NTSTATUS)0xC0000225L)
+
+/* Not sure what headers might have these */
+# define IOCTL_AFD_POLL 0x00012024
+
+# define AFD_POLL_RECEIVE 0x0001
+# define AFD_POLL_RECEIVE_EXPEDITED 0x0002
+# define AFD_POLL_SEND 0x0004
+# define AFD_POLL_DISCONNECT 0x0008
+# define AFD_POLL_ABORT 0x0010
+# define AFD_POLL_LOCAL_CLOSE 0x0020
+# define AFD_POLL_ACCEPT 0x0080
+# define AFD_POLL_CONNECT_FAIL 0x0100
+
+typedef struct _AFD_POLL_HANDLE_INFO {
+ HANDLE Handle;
+ ULONG Events;
+ NTSTATUS Status;
+} AFD_POLL_HANDLE_INFO, *PAFD_POLL_HANDLE_INFO;
+
+typedef struct _AFD_POLL_INFO {
+ LARGE_INTEGER Timeout;
+ ULONG NumberOfHandles;
+ ULONG Exclusive;
+ AFD_POLL_HANDLE_INFO Handles[1];
+} AFD_POLL_INFO, *PAFD_POLL_INFO;
+
+/* Prototypes for dynamically loaded functions from ntdll.dll */
+typedef NTSTATUS(NTAPI *NtCancelIoFileEx_t)(HANDLE FileHandle,
+ PIO_STATUS_BLOCK IoRequestToCancel,
+ PIO_STATUS_BLOCK IoStatusBlock);
+typedef NTSTATUS(NTAPI *NtDeviceIoControlFile_t)(
+ HANDLE FileHandle, HANDLE Event, PIO_APC_ROUTINE ApcRoutine, PVOID ApcContext,
+ PIO_STATUS_BLOCK IoStatusBlock, ULONG IoControlCode, PVOID InputBuffer,
+ ULONG InputBufferLength, PVOID OutputBuffer, ULONG OutputBufferLength);
+
+/* On UWP/Windows Store, these definitions aren't there for some reason */
+# ifndef SIO_BSP_HANDLE_POLL
+# define SIO_BSP_HANDLE_POLL 0x4800001D
+# endif
+
+# ifndef SIO_BASE_HANDLE
+# define SIO_BASE_HANDLE 0x48000022
+# endif
+
+# ifndef HANDLE_FLAG_INHERIT
+# define HANDLE_FLAG_INHERIT 0x00000001
+# endif
+
+#endif /* _WIN32 */
+
+#endif /* __ARES_EVENT_WIN32_H */
diff --git a/contrib/libs/c-ares/src/lib/ares_expand_name.c b/contrib/libs/c-ares/src/lib/ares_expand_name.c
index 21c4e93d85..280490b86a 100644
--- a/contrib/libs/c-ares/src/lib/ares_expand_name.c
+++ b/contrib/libs/c-ares/src/lib/ares_expand_name.c
@@ -34,289 +34,85 @@
#include "ares_nameser.h"
#include "ares.h"
-#include "ares_nowarn.h"
#include "ares_private.h" /* for the memdebug */
-/* Maximum number of indirections allowed for a name */
-#define MAX_INDIRS 50
-
-static int name_length(const unsigned char *encoded, const unsigned char *abuf,
- int alen, int is_hostname);
-
-/* Reserved characters for names that need to be escaped */
-static int is_reservedch(int ch)
-{
- switch (ch) {
- case '"':
- case '.':
- case ';':
- case '\\':
- case '(':
- case ')':
- case '@':
- case '$':
- return 1;
- default:
- break;
- }
-
- return 0;
-}
-
-static int ares__isprint(int ch)
+ares_status_t ares__expand_name_validated(const unsigned char *encoded,
+ const unsigned char *abuf,
+ size_t alen, char **s, size_t *enclen,
+ ares_bool_t is_hostname)
{
- if (ch >= 0x20 && ch <= 0x7E)
- return 1;
- return 0;
-}
+ ares_status_t status;
+ ares__buf_t *buf = NULL;
+ size_t start_len;
-/* Character set allowed by hostnames. This is to include the normal
- * domain name character set plus:
- * - underscores which are used in SRV records.
- * - Forward slashes such as are used for classless in-addr.arpa
- * delegation (CNAMEs)
- * - Asterisks may be used for wildcard domains in CNAMEs as seen in the
- * real world.
- * While RFC 2181 section 11 does state not to do validation,
- * that applies to servers, not clients. Vulnerabilities have been
- * reported when this validation is not performed. Security is more
- * important than edge-case compatibility (which is probably invalid
- * anyhow). */
-static int is_hostnamech(int ch)
-{
- /* [A-Za-z0-9-*._/]
- * Don't use isalnum() as it is locale-specific
- */
- if (ch >= 'A' && ch <= 'Z')
- return 1;
- if (ch >= 'a' && ch <= 'z')
- return 1;
- if (ch >= '0' && ch <= '9')
- return 1;
- if (ch == '-' || ch == '.' || ch == '_' || ch == '/' || ch == '*')
- return 1;
+ if (encoded == NULL || abuf == NULL || alen == 0 || enclen == NULL) {
+ return ARES_EBADNAME; /* EFORMERR would be better */
+ }
- return 0;
-}
+ if (encoded < abuf || encoded >= abuf + alen) {
+ return ARES_EBADNAME; /* EFORMERR would be better */
+ }
-/* Expand an RFC1035-encoded domain name given by encoded. The
- * containing message is given by abuf and alen. The result given by
- * *s, which is set to a NUL-terminated allocated buffer. *enclen is
- * set to the length of the encoded name (not the length of the
- * expanded name; the goal is to tell the caller how many bytes to
- * move forward to get past the encoded name).
- *
- * In the simple case, an encoded name is a series of labels, each
- * composed of a one-byte length (limited to values between 0 and 63
- * inclusive) followed by the label contents. The name is terminated
- * by a zero-length label.
- *
- * In the more complicated case, a label may be terminated by an
- * indirection pointer, specified by two bytes with the high bits of
- * the first byte (corresponding to INDIR_MASK) set to 11. With the
- * two high bits of the first byte stripped off, the indirection
- * pointer gives an offset from the beginning of the containing
- * message with more labels to decode. Indirection can happen an
- * arbitrary number of times, so we have to detect loops.
- *
- * Since the expanded name uses '.' as a label separator, we use
- * backslashes to escape periods or backslashes in the expanded name.
- *
- * If the result is expected to be a hostname, then no escaped data is allowed
- * and will return error.
- */
+ *enclen = 0;
-int ares__expand_name_validated(const unsigned char *encoded,
- const unsigned char *abuf,
- int alen, char **s, long *enclen,
- int is_hostname)
-{
- int len, indir = 0;
- char *q;
- const unsigned char *p;
- union {
- ares_ssize_t sig;
- size_t uns;
- } nlen;
+ /* NOTE: we allow 's' to be NULL to skip it */
+ if (s) {
+ *s = NULL;
+ }
- nlen.sig = name_length(encoded, abuf, alen, is_hostname);
- if (nlen.sig < 0)
- return ARES_EBADNAME;
+ buf = ares__buf_create_const(abuf, alen);
- *s = ares_malloc(nlen.uns + 1);
- if (!*s)
+ if (buf == NULL) {
return ARES_ENOMEM;
- q = *s;
-
- if (nlen.uns == 0) {
- /* RFC2181 says this should be ".": the root of the DNS tree.
- * Since this function strips trailing dots though, it becomes ""
- */
- q[0] = '\0';
-
- /* indirect root label (like 0xc0 0x0c) is 2 bytes long (stupid, but
- valid) */
- if ((*encoded & INDIR_MASK) == INDIR_MASK)
- *enclen = 2L;
- else
- *enclen = 1L; /* the caller should move one byte to get past this */
-
- return ARES_SUCCESS;
}
- /* No error-checking necessary; it was all done by name_length(). */
- p = encoded;
- while (*p)
- {
- if ((*p & INDIR_MASK) == INDIR_MASK)
- {
- if (!indir)
- {
- *enclen = aresx_uztosl(p + 2U - encoded);
- indir = 1;
- }
- p = abuf + ((*p & ~INDIR_MASK) << 8 | *(p + 1));
- }
- else
- {
- int name_len = *p;
- len = name_len;
- p++;
-
- while (len--)
- {
- /* Output as \DDD for consistency with RFC1035 5.1, except
- * for the special case of a root name response */
- if (!ares__isprint(*p) && !(name_len == 1 && *p == 0))
- {
- *q++ = '\\';
- *q++ = (char)('0' + *p / 100);
- *q++ = (char)('0' + (*p % 100) / 10);
- *q++ = (char)('0' + (*p % 10));
- }
- else if (is_reservedch(*p))
- {
- *q++ = '\\';
- *q++ = *p;
- }
- else
- {
- *q++ = *p;
- }
- p++;
- }
- *q++ = '.';
- }
- }
+ status = ares__buf_set_position(buf, (size_t)(encoded - abuf));
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
- if (!indir)
- *enclen = aresx_uztosl(p + 1U - encoded);
+ start_len = ares__buf_len(buf);
+ status = ares__dns_name_parse(buf, s, is_hostname);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
- /* Nuke the trailing period if we wrote one. */
- if (q > *s)
- *(q - 1) = 0;
- else
- *q = 0; /* zero terminate; LCOV_EXCL_LINE: empty names exit above */
+ *enclen = start_len - ares__buf_len(buf);
- return ARES_SUCCESS;
+done:
+ ares__buf_destroy(buf);
+ return status;
}
-
int ares_expand_name(const unsigned char *encoded, const unsigned char *abuf,
int alen, char **s, long *enclen)
{
- return ares__expand_name_validated(encoded, abuf, alen, s, enclen, 0);
-}
-
-/* Return the length of the expansion of an encoded domain name, or
- * -1 if the encoding is invalid.
- */
-static int name_length(const unsigned char *encoded, const unsigned char *abuf,
- int alen, int is_hostname)
-{
- int n = 0, offset, indir = 0, top;
-
- /* Allow the caller to pass us abuf + alen and have us check for it. */
- if (encoded >= abuf + alen)
- return -1;
-
- while (*encoded)
- {
- top = (*encoded & INDIR_MASK);
- if (top == INDIR_MASK)
- {
- /* Check the offset and go there. */
- if (encoded + 1 >= abuf + alen)
- return -1;
- offset = (*encoded & ~INDIR_MASK) << 8 | *(encoded + 1);
- if (offset >= alen)
- return -1;
- encoded = abuf + offset;
+ /* Keep public API compatible */
+ size_t enclen_temp = 0;
+ ares_status_t status;
- /* If we've seen more indirects than the message length,
- * then there's a loop.
- */
- ++indir;
- if (indir > alen || indir > MAX_INDIRS)
- return -1;
- }
- else if (top == 0x00)
- {
- int name_len = *encoded;
- offset = name_len;
- if (encoded + offset + 1 >= abuf + alen)
- return -1;
- encoded++;
-
- while (offset--)
- {
- if (!ares__isprint(*encoded) && !(name_len == 1 && *encoded == 0))
- {
- if (is_hostname)
- return -1;
- n += 4;
- }
- else if (is_reservedch(*encoded))
- {
- if (is_hostname)
- return -1;
- n += 2;
- }
- else
- {
- if (is_hostname && !is_hostnamech(*encoded))
- return -1;
- n += 1;
- }
- encoded++;
- }
-
- n++;
- }
- else
- {
- /* RFC 1035 4.1.4 says other options (01, 10) for top 2
- * bits are reserved.
- */
- return -1;
- }
- }
+ if (alen < 0) {
+ return ARES_EBADRESP;
+ }
- /* If there were any labels at all, then the number of dots is one
- * less than the number of labels, so subtract one.
- */
- return (n) ? n - 1 : n;
+ status = ares__expand_name_validated(encoded, abuf, (size_t)alen, s,
+ &enclen_temp, ARES_FALSE);
+ *enclen = (long)enclen_temp;
+ return (int)status;
}
/* Like ares_expand_name_validated but returns EBADRESP in case of invalid
* input. */
-int ares__expand_name_for_response(const unsigned char *encoded,
- const unsigned char *abuf, int alen,
- char **s, long *enclen, int is_hostname)
+ares_status_t ares__expand_name_for_response(const unsigned char *encoded,
+ const unsigned char *abuf,
+ size_t alen, char **s,
+ size_t *enclen,
+ ares_bool_t is_hostname)
{
- int status = ares__expand_name_validated(encoded, abuf, alen, s, enclen,
- is_hostname);
- if (status == ARES_EBADNAME)
+ ares_status_t status =
+ ares__expand_name_validated(encoded, abuf, alen, s, enclen, is_hostname);
+ if (status == ARES_EBADNAME) {
status = ARES_EBADRESP;
+ }
return status;
}
diff --git a/contrib/libs/c-ares/src/lib/ares_expand_string.c b/contrib/libs/c-ares/src/lib/ares_expand_string.c
index 2d6daa1497..be7034e271 100644
--- a/contrib/libs/c-ares/src/lib/ares_expand_string.c
+++ b/contrib/libs/c-ares/src/lib/ares_expand_string.c
@@ -41,38 +41,71 @@
* are the characters of the string. The returned result will be NULL
* terminated.
*/
-int ares_expand_string(const unsigned char *encoded,
- const unsigned char *abuf,
- int alen,
- unsigned char **s,
- long *enclen)
+ares_status_t ares_expand_string_ex(const unsigned char *encoded,
+ const unsigned char *abuf, size_t alen,
+ unsigned char **s, size_t *enclen)
{
- unsigned char *q;
- union {
- ares_ssize_t sig;
- size_t uns;
- } elen;
+ ares_status_t status;
+ ares__buf_t *buf = NULL;
+ size_t start_len;
+ size_t len = 0;
- if (encoded == abuf+alen)
- return ARES_EBADSTR;
+ if (encoded == NULL || abuf == NULL || alen == 0 || enclen == NULL) {
+ return ARES_EBADSTR; /* EFORMERR would be better */
+ }
- elen.uns = *encoded;
- if (encoded+elen.sig+1 > abuf+alen)
- return ARES_EBADSTR;
+ if (encoded < abuf || encoded >= abuf + alen) {
+ return ARES_EBADSTR; /* EFORMERR would be better */
+ }
- encoded++;
+ *enclen = 0;
- *s = ares_malloc(elen.uns+1);
- if (*s == NULL)
+ /* NOTE: we allow 's' to be NULL to skip it */
+ if (s) {
+ *s = NULL;
+ }
+
+ buf = ares__buf_create_const(abuf, alen);
+
+ if (buf == NULL) {
return ARES_ENOMEM;
- q = *s;
- strncpy((char *)q, (char *)encoded, elen.uns);
- q[elen.uns] = '\0';
+ }
- *s = q;
+ status = ares__buf_set_position(buf, (size_t)(encoded - abuf));
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
- *enclen = (long)(elen.sig+1);
+ start_len = ares__buf_len(buf);
+ status =
+ ares__buf_parse_dns_binstr(buf, ares__buf_len(buf), s, &len, ARES_FALSE);
+ /* hrm, no way to pass back 'len' with the prototype */
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
- return ARES_SUCCESS;
+ *enclen = start_len - ares__buf_len(buf);
+
+done:
+ ares__buf_destroy(buf);
+ if (status == ARES_EBADNAME || status == ARES_EBADRESP) {
+ status = ARES_EBADSTR;
+ }
+ return status;
}
+int ares_expand_string(const unsigned char *encoded, const unsigned char *abuf,
+ int alen, unsigned char **s, long *enclen)
+{
+ ares_status_t status;
+ size_t temp_enclen = 0;
+
+ if (alen < 0) {
+ return ARES_EBADRESP;
+ }
+
+ status = ares_expand_string_ex(encoded, abuf, (size_t)alen, s, &temp_enclen);
+
+ *enclen = (long)temp_enclen;
+ return (int)status;
+}
diff --git a/contrib/libs/c-ares/src/lib/ares_fds.c b/contrib/libs/c-ares/src/lib/ares_fds.c
index 5ee149f904..e726d4f012 100644
--- a/contrib/libs/c-ares/src/lib/ares_fds.c
+++ b/contrib/libs/c-ares/src/lib/ares_fds.c
@@ -28,42 +28,56 @@
#include "ares_setup.h"
#include "ares.h"
-#include "ares_nowarn.h"
#include "ares_private.h"
-int ares_fds(ares_channel channel, fd_set *read_fds, fd_set *write_fds)
+int ares_fds(ares_channel_t *channel, fd_set *read_fds, fd_set *write_fds)
{
- struct server_state *server;
- ares_socket_t nfds;
- int i;
-
+ ares_socket_t nfds;
+ ares__slist_node_t *snode;
/* Are there any active queries? */
- size_t active_queries = ares__llist_len(channel->all_queries);
+ size_t active_queries;
+
+ if (channel == NULL || read_fds == NULL || write_fds == NULL) {
+ return 0;
+ }
+
+ ares__channel_lock(channel);
+
+ active_queries = ares__llist_len(channel->all_queries);
nfds = 0;
- for (i = 0; i < channel->nservers; i++) {
- ares__llist_node_t *node;
- server = &channel->servers[i];
+ for (snode = ares__slist_node_first(channel->servers); snode != NULL;
+ snode = ares__slist_node_next(snode)) {
+ struct server_state *server = ares__slist_node_val(snode);
+ ares__llist_node_t *node;
- for (node = ares__llist_node_first(server->connections);
- node != NULL;
+ for (node = ares__llist_node_first(server->connections); node != NULL;
node = ares__llist_node_next(node)) {
- struct server_connection *conn = ares__llist_node_val(node);
+ const struct server_connection *conn = ares__llist_node_val(node);
+
+ if (!active_queries && !conn->is_tcp) {
+ continue;
+ }
+
+ /* Silence coverity, shouldn't be possible */
+ if (conn->fd == ARES_SOCKET_BAD) {
+ continue;
+ }
+
+ /* Always wait on read */
+ FD_SET(conn->fd, read_fds);
- /* We only need to register interest in UDP sockets if we have
- * outstanding queries.
- */
- if (active_queries || conn->is_tcp) {
- FD_SET(conn->fd, read_fds);
- if (conn->fd >= nfds)
- nfds = conn->fd + 1;
+ if (conn->fd >= nfds) {
+ nfds = conn->fd + 1;
}
+ /* TCP only wait on write if we have buffered data */
if (conn->is_tcp && ares__buf_len(server->tcp_send)) {
FD_SET(conn->fd, write_fds);
}
}
}
+ ares__channel_unlock(channel);
return (int)nfds;
}
diff --git a/contrib/libs/c-ares/src/lib/ares_free_hostent.c b/contrib/libs/c-ares/src/lib/ares_free_hostent.c
index 0d20673163..a088c1b15c 100644
--- a/contrib/libs/c-ares/src/lib/ares_free_hostent.c
+++ b/contrib/libs/c-ares/src/lib/ares_free_hostent.c
@@ -28,7 +28,7 @@
#include "ares_setup.h"
#ifdef HAVE_NETDB_H
-#include <netdb.h>
+# include <netdb.h>
#endif
#include "ares.h"
@@ -38,16 +38,19 @@ void ares_free_hostent(struct hostent *host)
{
char **p;
- if (!host)
+ if (!host) {
return;
+ }
- ares_free((char *)(host->h_name));
- for (p = host->h_aliases; p && *p; p++)
+ ares_free(host->h_name);
+ for (p = host->h_aliases; p && *p; p++) {
ares_free(*p);
+ }
ares_free(host->h_aliases);
if (host->h_addr_list) {
- ares_free(host->h_addr_list[0]); /* no matter if there is one or many entries,
- there is only one malloc for all of them */
+ ares_free(
+ host->h_addr_list[0]); /* no matter if there is one or many entries,
+ there is only one malloc for all of them */
ares_free(host->h_addr_list);
}
ares_free(host);
diff --git a/contrib/libs/c-ares/src/lib/ares_freeaddrinfo.c b/contrib/libs/c-ares/src/lib/ares_freeaddrinfo.c
index fe458735ee..45d931a3f8 100644
--- a/contrib/libs/c-ares/src/lib/ares_freeaddrinfo.c
+++ b/contrib/libs/c-ares/src/lib/ares_freeaddrinfo.c
@@ -37,34 +37,34 @@
void ares__freeaddrinfo_cnames(struct ares_addrinfo_cname *head)
{
struct ares_addrinfo_cname *current;
- while (head)
- {
- current = head;
- head = head->next;
- ares_free(current->alias);
- ares_free(current->name);
- ares_free(current);
- }
+ while (head) {
+ current = head;
+ head = head->next;
+ ares_free(current->alias);
+ ares_free(current->name);
+ ares_free(current);
+ }
}
void ares__freeaddrinfo_nodes(struct ares_addrinfo_node *head)
{
struct ares_addrinfo_node *current;
- while (head)
- {
- current = head;
- head = head->ai_next;
- ares_free(current->ai_addr);
- ares_free(current);
- }
+ while (head) {
+ current = head;
+ head = head->ai_next;
+ ares_free(current->ai_addr);
+ ares_free(current);
+ }
}
void ares_freeaddrinfo(struct ares_addrinfo *ai)
{
- if (ai == NULL)
+ if (ai == NULL) {
return;
+ }
ares__freeaddrinfo_cnames(ai->cnames);
ares__freeaddrinfo_nodes(ai->nodes);
+
ares_free(ai->name);
ares_free(ai);
}
diff --git a/contrib/libs/c-ares/src/lib/ares_getaddrinfo.c b/contrib/libs/c-ares/src/lib/ares_getaddrinfo.c
index a3a2add1a2..cfc889c70a 100644
--- a/contrib/libs/c-ares/src/lib/ares_getaddrinfo.c
+++ b/contrib/libs/c-ares/src/lib/ares_getaddrinfo.c
@@ -29,9 +29,9 @@
#include "ares_setup.h"
#ifdef HAVE_GETSERVBYNAME_R
-# if !defined(GETSERVBYNAME_R_ARGS) || \
- (GETSERVBYNAME_R_ARGS < 4) || (GETSERVBYNAME_R_ARGS > 6)
-# error "you MUST specifiy a valid number of arguments for getservbyname_r"
+# if !defined(GETSERVBYNAME_R_ARGS) || (GETSERVBYNAME_R_ARGS < 4) || \
+ (GETSERVBYNAME_R_ARGS > 6)
+# error "you MUST specify a valid number of arguments for getservbyname_r"
# endif
#endif
@@ -48,45 +48,51 @@
#include "ares_nameser.h"
#ifdef HAVE_STRINGS_H
-#include <strings.h>
+# include <strings.h>
#endif
#include <assert.h>
#ifdef HAVE_LIMITS_H
-#include <limits.h>
+# include <limits.h>
#endif
#include "ares.h"
-#include "bitncmp.h"
#include "ares_private.h"
#include "ares_dns.h"
#ifdef WATT32
-#undef WIN32
+# undef WIN32
#endif
#ifdef WIN32
# include "ares_platform.h"
#endif
-struct host_query
-{
- ares_channel channel;
- char *name;
- unsigned short port; /* in host order */
- ares_addrinfo_callback callback;
- void *arg;
+struct host_query {
+ ares_channel_t *channel;
+ char *name;
+ unsigned short port; /* in host order */
+ ares_addrinfo_callback callback;
+ void *arg;
struct ares_addrinfo_hints hints;
- int sent_family; /* this family is what was is being used */
- int timeouts; /* number of timeouts we saw for this request */
+ int sent_family; /* this family is what was is being used */
+ size_t timeouts; /* number of timeouts we saw for this request */
+ char *lookups; /* Duplicate memory from channel because of ares_reinit() */
const char *remaining_lookups; /* types of lookup we need to perform ("fb" by
default, file and dns respectively) */
- struct ares_addrinfo *ai; /* store results between lookups */
- unsigned short qid_a; /* qid for A request */
- unsigned short qid_aaaa; /* qid for AAAA request */
- int remaining; /* number of DNS answers waiting for */
- int next_domain; /* next search domain to try */
- int nodata_cnt; /* Track nodata responses to possibly override final result */
+ /* Search order for names */
+ char **names;
+ size_t names_cnt;
+ size_t next_name_idx; /* next name index being attempted */
+
+ struct ares_addrinfo *ai; /* store results between lookups */
+ unsigned short qid_a; /* qid for A request */
+ unsigned short qid_aaaa; /* qid for AAAA request */
+
+ size_t remaining; /* number of DNS answers waiting for */
+
+ /* Track nodata responses to possibly override final result */
+ size_t nodata_cnt;
};
static const struct ares_addrinfo_hints default_hints = {
@@ -96,139 +102,84 @@ static const struct ares_addrinfo_hints default_hints = {
0, /* ai_protocol */
};
-static const struct ares_addrinfo_cname empty_addrinfo_cname = {
- INT_MAX, /* ttl */
- NULL, /* alias */
- NULL, /* name */
- NULL, /* next */
-};
-
-static const struct ares_addrinfo_node empty_addrinfo_node = {
- 0, /* ai_ttl */
- 0, /* ai_flags */
- 0, /* ai_family */
- 0, /* ai_socktype */
- 0, /* ai_protocol */
- 0, /* ai_addrlen */
- NULL, /* ai_addr */
- NULL /* ai_next */
-};
-
-static const struct ares_addrinfo empty_addrinfo = {
- NULL, /* cnames */
- NULL, /* nodes */
- NULL /* name */
-};
-
/* forward declarations */
-static void host_callback(void *arg, int status, int timeouts,
- unsigned char *abuf, int alen);
-static int as_is_first(const struct host_query *hquery);
-static int as_is_only(const struct host_query* hquery);
-static int next_dns_lookup(struct host_query *hquery);
+static ares_bool_t next_dns_lookup(struct host_query *hquery);
-static struct ares_addrinfo_cname *ares__malloc_addrinfo_cname(void)
+struct ares_addrinfo_cname *
+ ares__append_addrinfo_cname(struct ares_addrinfo_cname **head)
{
- struct ares_addrinfo_cname *cname = ares_malloc(sizeof(struct ares_addrinfo_cname));
- if (!cname)
- return NULL;
+ struct ares_addrinfo_cname *tail = ares_malloc_zero(sizeof(*tail));
+ struct ares_addrinfo_cname *last = *head;
- *cname = empty_addrinfo_cname;
- return cname;
-}
+ if (tail == NULL) {
+ return NULL;
+ }
-struct ares_addrinfo_cname *ares__append_addrinfo_cname(struct ares_addrinfo_cname **head)
-{
- struct ares_addrinfo_cname *tail = ares__malloc_addrinfo_cname();
- struct ares_addrinfo_cname *last = *head;
- if (!last)
- {
- *head = tail;
- return tail;
- }
+ if (!last) {
+ *head = tail;
+ return tail;
+ }
- while (last->next)
- {
- last = last->next;
- }
+ while (last->next) {
+ last = last->next;
+ }
last->next = tail;
return tail;
}
void ares__addrinfo_cat_cnames(struct ares_addrinfo_cname **head,
- struct ares_addrinfo_cname *tail)
+ struct ares_addrinfo_cname *tail)
{
struct ares_addrinfo_cname *last = *head;
- if (!last)
- {
- *head = tail;
- return;
- }
+ if (!last) {
+ *head = tail;
+ return;
+ }
- while (last->next)
- {
- last = last->next;
- }
+ while (last->next) {
+ last = last->next;
+ }
last->next = tail;
}
-static struct ares_addrinfo *ares__malloc_addrinfo(void)
+/* Allocate new addrinfo and append to the tail. */
+struct ares_addrinfo_node *
+ ares__append_addrinfo_node(struct ares_addrinfo_node **head)
{
- struct ares_addrinfo *ai = ares_malloc(sizeof(struct ares_addrinfo));
- if (!ai)
- return NULL;
-
- *ai = empty_addrinfo;
- return ai;
-}
+ struct ares_addrinfo_node *tail = ares_malloc_zero(sizeof(*tail));
+ struct ares_addrinfo_node *last = *head;
-static struct ares_addrinfo_node *ares__malloc_addrinfo_node(void)
-{
- struct ares_addrinfo_node *node =
- ares_malloc(sizeof(*node));
- if (!node)
+ if (tail == NULL) {
return NULL;
+ }
- *node = empty_addrinfo_node;
- return node;
-}
-
-/* Allocate new addrinfo and append to the tail. */
-struct ares_addrinfo_node *ares__append_addrinfo_node(struct ares_addrinfo_node **head)
-{
- struct ares_addrinfo_node *tail = ares__malloc_addrinfo_node();
- struct ares_addrinfo_node *last = *head;
- if (!last)
- {
- *head = tail;
- return tail;
- }
+ if (!last) {
+ *head = tail;
+ return tail;
+ }
- while (last->ai_next)
- {
- last = last->ai_next;
- }
+ while (last->ai_next) {
+ last = last->ai_next;
+ }
last->ai_next = tail;
return tail;
}
void ares__addrinfo_cat_nodes(struct ares_addrinfo_node **head,
- struct ares_addrinfo_node *tail)
+ struct ares_addrinfo_node *tail)
{
struct ares_addrinfo_node *last = *head;
- if (!last)
- {
- *head = tail;
- return;
- }
+ if (!last) {
+ *head = tail;
+ return;
+ }
- while (last->ai_next)
- {
- last = last->ai_next;
- }
+ while (last->ai_next) {
+ last = last->ai_next;
+ }
last->ai_next = tail;
}
@@ -238,385 +189,331 @@ void ares__addrinfo_cat_nodes(struct ares_addrinfo_node **head,
*/
static unsigned short lookup_service(const char *service, int flags)
{
- const char *proto;
+ const char *proto;
struct servent *sep;
#ifdef HAVE_GETSERVBYNAME_R
struct servent se;
- char tmpbuf[4096];
+ char tmpbuf[4096];
#endif
- if (service)
- {
- if (flags & ARES_NI_UDP)
- proto = "udp";
- else if (flags & ARES_NI_SCTP)
- proto = "sctp";
- else if (flags & ARES_NI_DCCP)
- proto = "dccp";
- else
- proto = "tcp";
+ if (service) {
+ if (flags & ARES_NI_UDP) {
+ proto = "udp";
+ } else if (flags & ARES_NI_SCTP) {
+ proto = "sctp";
+ } else if (flags & ARES_NI_DCCP) {
+ proto = "dccp";
+ } else {
+ proto = "tcp";
+ }
#ifdef HAVE_GETSERVBYNAME_R
- memset(&se, 0, sizeof(se));
- sep = &se;
- memset(tmpbuf, 0, sizeof(tmpbuf));
-#if GETSERVBYNAME_R_ARGS == 6
- if (getservbyname_r(service, proto, &se, (void *)tmpbuf, sizeof(tmpbuf),
- &sep) != 0)
- sep = NULL; /* LCOV_EXCL_LINE: buffer large so this never fails */
-#elif GETSERVBYNAME_R_ARGS == 5
- sep =
- getservbyname_r(service, proto, &se, (void *)tmpbuf, sizeof(tmpbuf));
-#elif GETSERVBYNAME_R_ARGS == 4
- if (getservbyname_r(service, proto, &se, (void *)tmpbuf) != 0)
- sep = NULL;
-#else
- /* Lets just hope the OS uses TLS! */
- sep = getservbyname(service, proto);
-#endif
-#else
- /* Lets just hope the OS uses TLS! */
-#if (defined(NETWARE) && !defined(__NOVELL_LIBC__))
- sep = getservbyname(service, (char *)proto);
+ memset(&se, 0, sizeof(se));
+ sep = &se;
+ memset(tmpbuf, 0, sizeof(tmpbuf));
+# if GETSERVBYNAME_R_ARGS == 6
+ if (getservbyname_r(service, proto, &se, (void *)tmpbuf, sizeof(tmpbuf),
+ &sep) != 0) {
+ sep = NULL; /* LCOV_EXCL_LINE: buffer large so this never fails */
+ }
+# elif GETSERVBYNAME_R_ARGS == 5
+ sep = getservbyname_r(service, proto, &se, (void *)tmpbuf, sizeof(tmpbuf));
+# elif GETSERVBYNAME_R_ARGS == 4
+ if (getservbyname_r(service, proto, &se, (void *)tmpbuf) != 0) {
+ sep = NULL;
+ }
+# else
+ /* Lets just hope the OS uses TLS! */
+ sep = getservbyname(service, proto);
+# endif
#else
- sep = getservbyname(service, proto);
-#endif
+ /* Lets just hope the OS uses TLS! */
+# if (defined(NETWARE) && !defined(__NOVELL_LIBC__))
+ sep = getservbyname(service, (char *)proto);
+# else
+ sep = getservbyname(service, proto);
+# endif
#endif
- return (sep ? ntohs((unsigned short)sep->s_port) : 0);
- }
+ return (sep ? ntohs((unsigned short)sep->s_port) : 0);
+ }
return 0;
}
-/* If the name looks like an IP address or an error occured,
+/* If the name looks like an IP address or an error occurred,
* fake up a host entry, end the query immediately, and return true.
* Otherwise return false.
*/
-static int fake_addrinfo(const char *name,
- unsigned short port,
- const struct ares_addrinfo_hints *hints,
- struct ares_addrinfo *ai,
- ares_addrinfo_callback callback,
- void *arg)
+static ares_bool_t fake_addrinfo(const char *name, unsigned short port,
+ const struct ares_addrinfo_hints *hints,
+ struct ares_addrinfo *ai,
+ ares_addrinfo_callback callback, void *arg)
{
struct ares_addrinfo_cname *cname;
- int status = ARES_SUCCESS;
- int result = 0;
- int family = hints->ai_family;
- if (family == AF_INET || family == AF_INET6 || family == AF_UNSPEC)
- {
- /* It only looks like an IP address if it's all numbers and dots. */
- int numdots = 0, valid = 1;
- const char *p;
- for (p = name; *p; p++)
- {
- if (!ISDIGIT(*p) && *p != '.')
- {
- valid = 0;
- break;
- }
- else if (*p == '.')
- {
- numdots++;
- }
- }
+ ares_status_t status = ARES_SUCCESS;
+ ares_bool_t result = ARES_FALSE;
+ int family = hints->ai_family;
+ if (family == AF_INET || family == AF_INET6 || family == AF_UNSPEC) {
+ /* It only looks like an IP address if it's all numbers and dots. */
+ size_t numdots = 0;
+ ares_bool_t valid = ARES_TRUE;
+ const char *p;
+ for (p = name; *p; p++) {
+ if (!ISDIGIT(*p) && *p != '.') {
+ valid = ARES_FALSE;
+ break;
+ } else if (*p == '.') {
+ numdots++;
+ }
+ }
- /* if we don't have 3 dots, it is illegal
- * (although inet_pton doesn't think so).
- */
- if (numdots != 3 || !valid)
- result = 0;
- else
- {
- struct in_addr addr4;
- result = ares_inet_pton(AF_INET, name, &addr4) < 1 ? 0 : 1;
- if (result)
- {
- status = ares_append_ai_node(AF_INET, port, 0, &addr4, &ai->nodes);
- if (status != ARES_SUCCESS)
- {
- callback(arg, status, 0, NULL);
- return 1;
- }
- }
+ /* if we don't have 3 dots, it is illegal
+ * (although inet_pton doesn't think so).
+ */
+ if (numdots != 3 || !valid) {
+ result = ARES_FALSE;
+ } else {
+ struct in_addr addr4;
+ result =
+ ares_inet_pton(AF_INET, name, &addr4) < 1 ? ARES_FALSE : ARES_TRUE;
+ if (result) {
+ status = ares_append_ai_node(AF_INET, port, 0, &addr4, &ai->nodes);
+ if (status != ARES_SUCCESS) {
+ callback(arg, (int)status, 0, NULL);
+ return ARES_TRUE;
}
+ }
}
+ }
- if (!result && (family == AF_INET6 || family == AF_UNSPEC))
- {
- struct ares_in6_addr addr6;
- result = ares_inet_pton(AF_INET6, name, &addr6) < 1 ? 0 : 1;
- if (result)
- {
- status = ares_append_ai_node(AF_INET6, port, 0, &addr6, &ai->nodes);
- if (status != ARES_SUCCESS)
- {
- callback(arg, status, 0, NULL);
- return 1;
- }
- }
+ if (!result && (family == AF_INET6 || family == AF_UNSPEC)) {
+ struct ares_in6_addr addr6;
+ result =
+ ares_inet_pton(AF_INET6, name, &addr6) < 1 ? ARES_FALSE : ARES_TRUE;
+ if (result) {
+ status = ares_append_ai_node(AF_INET6, port, 0, &addr6, &ai->nodes);
+ if (status != ARES_SUCCESS) {
+ callback(arg, (int)status, 0, NULL);
+ return ARES_TRUE;
+ }
}
+ }
- if (!result)
- return 0;
-
- if (hints->ai_flags & ARES_AI_CANONNAME)
- {
- cname = ares__append_addrinfo_cname(&ai->cnames);
- if (!cname)
- {
- ares_freeaddrinfo(ai);
- callback(arg, ARES_ENOMEM, 0, NULL);
- return 1;
- }
+ if (!result) {
+ return ARES_FALSE;
+ }
- /* Duplicate the name, to avoid a constness violation. */
- cname->name = ares_strdup(name);
- if (!cname->name)
- {
- ares_freeaddrinfo(ai);
- callback(arg, ARES_ENOMEM, 0, NULL);
- return 1;
- }
+ if (hints->ai_flags & ARES_AI_CANONNAME) {
+ cname = ares__append_addrinfo_cname(&ai->cnames);
+ if (!cname) {
+ ares_freeaddrinfo(ai);
+ callback(arg, ARES_ENOMEM, 0, NULL);
+ return ARES_TRUE;
+ }
+
+ /* Duplicate the name, to avoid a constness violation. */
+ cname->name = ares_strdup(name);
+ if (!cname->name) {
+ ares_freeaddrinfo(ai);
+ callback(arg, ARES_ENOMEM, 0, NULL);
+ return ARES_TRUE;
}
+ }
ai->nodes->ai_socktype = hints->ai_socktype;
ai->nodes->ai_protocol = hints->ai_protocol;
callback(arg, ARES_SUCCESS, 0, ai);
- return 1;
+ return ARES_TRUE;
}
-static void end_hquery(struct host_query *hquery, int status)
+static void hquery_free(struct host_query *hquery, ares_bool_t cleanup_ai)
{
- struct ares_addrinfo_node sentinel;
- struct ares_addrinfo_node *next;
+ if (cleanup_ai) {
+ ares_freeaddrinfo(hquery->ai);
+ }
+ ares__strsplit_free(hquery->names, hquery->names_cnt);
+ ares_free(hquery->name);
+ ares_free(hquery->lookups);
+ ares_free(hquery);
+}
- if (status == ARES_SUCCESS)
- {
- if (!(hquery->hints.ai_flags & ARES_AI_NOSORT) && hquery->ai->nodes)
- {
- sentinel.ai_next = hquery->ai->nodes;
- ares__sortaddrinfo(hquery->channel, &sentinel);
- hquery->ai->nodes = sentinel.ai_next;
- }
- next = hquery->ai->nodes;
+static void end_hquery(struct host_query *hquery, ares_status_t status)
+{
+ struct ares_addrinfo_node sentinel;
+ struct ares_addrinfo_node *next;
- while (next)
- {
- next->ai_socktype = hquery->hints.ai_socktype;
- next->ai_protocol = hquery->hints.ai_protocol;
- next = next->ai_next;
- }
- }
- else
- {
- /* Clean up what we have collected by so far. */
- ares_freeaddrinfo(hquery->ai);
- hquery->ai = NULL;
- }
+ if (status == ARES_SUCCESS) {
+ if (!(hquery->hints.ai_flags & ARES_AI_NOSORT) && hquery->ai->nodes) {
+ sentinel.ai_next = hquery->ai->nodes;
+ ares__sortaddrinfo(hquery->channel, &sentinel);
+ hquery->ai->nodes = sentinel.ai_next;
+ }
+ next = hquery->ai->nodes;
+
+ while (next) {
+ next->ai_socktype = hquery->hints.ai_socktype;
+ next->ai_protocol = hquery->hints.ai_protocol;
+ next = next->ai_next;
+ }
+ } else {
+ /* Clean up what we have collected by so far. */
+ ares_freeaddrinfo(hquery->ai);
+ hquery->ai = NULL;
+ }
- hquery->callback(hquery->arg, status, hquery->timeouts, hquery->ai);
- ares_free(hquery->name);
- ares_free(hquery);
+ hquery->callback(hquery->arg, (int)status, (int)hquery->timeouts, hquery->ai);
+ hquery_free(hquery, ARES_FALSE);
}
-static int is_localhost(const char *name)
+ares_bool_t ares__is_localhost(const char *name)
{
- /* RFC6761 6.3 says : The domain "localhost." and any names falling within ".localhost." */
+ /* RFC6761 6.3 says : The domain "localhost." and any names falling within
+ * ".localhost." */
size_t len;
- if (name == NULL)
- return 0;
+ if (name == NULL) {
+ return ARES_FALSE;
+ }
- if (strcmp(name, "localhost") == 0)
- return 1;
+ if (strcmp(name, "localhost") == 0) {
+ return ARES_TRUE;
+ }
- len = strlen(name);
- if (len < 10 /* strlen(".localhost") */)
- return 0;
+ len = ares_strlen(name);
+ if (len < 10 /* strlen(".localhost") */) {
+ return ARES_FALSE;
+ }
- if (strcmp(name + (len - 10 /* strlen(".localhost") */), ".localhost") == 0)
- return 1;
+ if (strcmp(name + (len - 10 /* strlen(".localhost") */), ".localhost") == 0) {
+ return ARES_TRUE;
+ }
- return 0;
+ return ARES_FALSE;
}
-static int file_lookup(struct host_query *hquery)
+static ares_status_t file_lookup(struct host_query *hquery)
{
- FILE *fp;
- int error;
- int status;
- char *path_hosts = NULL;
-
- if (hquery->hints.ai_flags & ARES_AI_ENVHOSTS)
- {
- path_hosts = ares_strdup(getenv("CARES_HOSTS"));
- if (!path_hosts)
- return ARES_ENOMEM;
- }
+ const ares_hosts_entry_t *entry;
+ ares_status_t status;
- if (hquery->channel->hosts_path)
- {
- path_hosts = ares_strdup(hquery->channel->hosts_path);
- if (!path_hosts)
- return ARES_ENOMEM;
- }
+ /* Per RFC 7686, reject queries for ".onion" domain names with NXDOMAIN. */
+ if (ares__is_onion_domain(hquery->name)) {
+ return ARES_ENOTFOUND;
+ }
- if (!path_hosts)
- {
-#ifdef WIN32
- char PATH_HOSTS[MAX_PATH];
- win_platform platform;
-
- PATH_HOSTS[0] = '\0';
-
- platform = ares__getplatform();
-
- if (platform == WIN_NT)
- {
- char tmp[MAX_PATH];
- HKEY hkeyHosts;
-
- if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0, KEY_READ,
- &hkeyHosts) == ERROR_SUCCESS)
- {
- DWORD dwLength = MAX_PATH;
- RegQueryValueExA(hkeyHosts, DATABASEPATH, NULL, NULL, (LPBYTE)tmp,
- &dwLength);
- ExpandEnvironmentStringsA(tmp, PATH_HOSTS, MAX_PATH);
- RegCloseKey(hkeyHosts);
- }
- }
- else if (platform == WIN_9X)
- GetWindowsDirectoryA(PATH_HOSTS, MAX_PATH);
- else
- return ARES_ENOTFOUND;
+ status = ares__hosts_search_host(
+ hquery->channel,
+ (hquery->hints.ai_flags & ARES_AI_ENVHOSTS) ? ARES_TRUE : ARES_FALSE,
+ hquery->name, &entry);
- strcat(PATH_HOSTS, WIN_PATH_HOSTS);
-#elif defined(WATT32)
- const char *PATH_HOSTS = _w32_GetHostsFile();
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
- if (!PATH_HOSTS)
- return ARES_ENOTFOUND;
-#endif
- path_hosts = ares_strdup(PATH_HOSTS);
- if (!path_hosts)
- return ARES_ENOMEM;
- }
+ status = ares__hosts_entry_to_addrinfo(
+ entry, hquery->name, hquery->hints.ai_family, hquery->port,
+ (hquery->hints.ai_flags & ARES_AI_CANONNAME) ? ARES_TRUE : ARES_FALSE,
+ hquery->ai);
+
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
- fp = fopen(path_hosts, "r");
- if (!fp)
- {
- error = ERRNO;
- switch (error)
- {
- case ENOENT:
- case ESRCH:
- status = ARES_ENOTFOUND;
- break;
- default:
- DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n", error,
- strerror(error)));
- DEBUGF(fprintf(stderr, "Error opening file: %s\n", path_hosts));
- status = ARES_EFILE;
- break;
- }
- }
- else
- {
- status = ares__readaddrinfo(fp, hquery->name, hquery->port, &hquery->hints, hquery->ai);
- fclose(fp);
- }
- ares_free(path_hosts);
+done:
/* RFC6761 section 6.3 #3 states that "Name resolution APIs and libraries
* SHOULD recognize localhost names as special and SHOULD always return the
* IP loopback address for address queries".
* We will also ignore ALL errors when trying to resolve localhost, such
* as permissions errors reading /etc/hosts or a malformed /etc/hosts */
- if (status != ARES_SUCCESS && is_localhost(hquery->name))
- {
- return ares__addrinfo_localhost(hquery->name, hquery->port,
- &hquery->hints, hquery->ai);
- }
+ if (status != ARES_SUCCESS && status != ARES_ENOMEM &&
+ ares__is_localhost(hquery->name)) {
+ return ares__addrinfo_localhost(hquery->name, hquery->port, &hquery->hints,
+ hquery->ai);
+ }
return status;
}
-static void next_lookup(struct host_query *hquery, int status)
+static void next_lookup(struct host_query *hquery, ares_status_t status)
{
- switch (*hquery->remaining_lookups)
- {
- case 'b':
- /* RFC6761 section 6.3 #3 says "Name resolution APIs SHOULD NOT send
- * queries for localhost names to their configured caching DNS
- * server(s)." */
- if (!is_localhost(hquery->name))
- {
- /* DNS lookup */
- if (next_dns_lookup(hquery))
- break;
- }
-
- hquery->remaining_lookups++;
- next_lookup(hquery, status);
- break;
-
- case 'f':
- /* Host file lookup */
- if (file_lookup(hquery) == ARES_SUCCESS)
- {
- end_hquery(hquery, ARES_SUCCESS);
- break;
- }
- hquery->remaining_lookups++;
- next_lookup(hquery, status);
- break;
- default:
- /* No lookup left */
- end_hquery(hquery, status);
- break;
- }
-}
+ switch (*hquery->remaining_lookups) {
+ case 'b':
+ /* RFC6761 section 6.3 #3 says "Name resolution APIs SHOULD NOT send
+ * queries for localhost names to their configured caching DNS
+ * server(s)."
+ * Otherwise, DNS lookup. */
+ if (!ares__is_localhost(hquery->name) && next_dns_lookup(hquery)) {
+ break;
+ }
+
+ hquery->remaining_lookups++;
+ next_lookup(hquery, status);
+ break;
+ case 'f':
+ /* Host file lookup */
+ if (file_lookup(hquery) == ARES_SUCCESS) {
+ end_hquery(hquery, ARES_SUCCESS);
+ break;
+ }
+ hquery->remaining_lookups++;
+ next_lookup(hquery, status);
+ break;
+ default:
+ /* No lookup left */
+ end_hquery(hquery, status);
+ break;
+ }
+}
-static void terminate_retries(struct host_query *hquery, unsigned short qid)
+static void terminate_retries(const struct host_query *hquery,
+ unsigned short qid)
{
- unsigned short term_qid = (qid == hquery->qid_a)?hquery->qid_aaaa:hquery->qid_a;
- ares_channel channel = hquery->channel;
- struct query *query = NULL;
+ unsigned short term_qid =
+ (qid == hquery->qid_a) ? hquery->qid_aaaa : hquery->qid_a;
+ const ares_channel_t *channel = hquery->channel;
+ struct query *query = NULL;
/* No other outstanding queries, nothing to do */
- if (!hquery->remaining)
+ if (!hquery->remaining) {
return;
+ }
- query = ares__htable_stvp_get_direct(channel->queries_by_qid, term_qid);
- if (query == NULL)
+ query = ares__htable_szvp_get_direct(channel->queries_by_qid, term_qid);
+ if (query == NULL) {
return;
+ }
- query->no_retries = 1;
+ query->no_retries = ARES_TRUE;
}
-
-static void host_callback(void *arg, int status, int timeouts,
- unsigned char *abuf, int alen)
+static void host_callback(void *arg, ares_status_t status, size_t timeouts,
+ const ares_dns_record_t *dnsrec)
{
- struct host_query *hquery = (struct host_query*)arg;
- int addinfostatus = ARES_SUCCESS;
- unsigned short qid = 0;
- hquery->timeouts += timeouts;
+ struct host_query *hquery = (struct host_query *)arg;
+ ares_status_t addinfostatus = ARES_SUCCESS;
+ hquery->timeouts += timeouts;
hquery->remaining--;
if (status == ARES_SUCCESS) {
- addinfostatus = ares__parse_into_addrinfo(abuf, alen, 1, hquery->port,
- hquery->ai);
- if (addinfostatus == ARES_SUCCESS && alen >= HFIXEDSZ) {
- qid = DNS_HEADER_QID(abuf); /* Converts to host byte order */
- terminate_retries(hquery, qid);
+ if (dnsrec == NULL) {
+ addinfostatus = ARES_EBADRESP;
+ } else {
+ addinfostatus =
+ ares__parse_into_addrinfo(dnsrec, ARES_TRUE, hquery->port, hquery->ai);
+ }
+ if (addinfostatus == ARES_SUCCESS) {
+ terminate_retries(hquery, ares_dns_record_get_id(dnsrec));
}
}
if (!hquery->remaining) {
- if (addinfostatus != ARES_SUCCESS && addinfostatus != ARES_ENODATA) {
+ if (status == ARES_EDESTRUCTION || status == ARES_ECANCELLED) {
+ /* must make sure we don't do next_lookup() on destroy or cancel,
+ * and return the appropriate status. We won't return a partial
+ * result in this case. */
+ end_hquery(hquery, status);
+ } else if (addinfostatus != ARES_SUCCESS && addinfostatus != ARES_ENODATA) {
/* error in parsing result e.g. no memory */
if (addinfostatus == ARES_EBADRESP && hquery->ai->nodes) {
/* We got a bad response from server, but at least one query
@@ -628,14 +525,12 @@ static void host_callback(void *arg, int status, int timeouts,
} else if (hquery->ai->nodes) {
/* at least one query ended with ARES_SUCCESS */
end_hquery(hquery, ARES_SUCCESS);
- } else if (status == ARES_EDESTRUCTION || status == ARES_ECANCELLED) {
- /* must make sure we don't do next_lookup() on destroy or cancel */
- end_hquery(hquery, status);
} else if (status == ARES_ENOTFOUND || status == ARES_ENODATA ||
addinfostatus == ARES_ENODATA) {
- if (status == ARES_ENODATA || addinfostatus == ARES_ENODATA)
+ if (status == ARES_ENODATA || addinfostatus == ARES_ENODATA) {
hquery->nodata_cnt++;
- next_lookup(hquery, hquery->nodata_cnt?ARES_ENODATA:status);
+ }
+ next_lookup(hquery, hquery->nodata_cnt ? ARES_ENODATA : status);
} else {
end_hquery(hquery, status);
}
@@ -644,234 +539,162 @@ static void host_callback(void *arg, int status, int timeouts,
/* at this point we keep on waiting for the next query to finish */
}
-void ares_getaddrinfo(ares_channel channel,
- const char* name, const char* service,
- const struct ares_addrinfo_hints* hints,
- ares_addrinfo_callback callback, void* arg)
+static void ares_getaddrinfo_int(ares_channel_t *channel, const char *name,
+ const char *service,
+ const struct ares_addrinfo_hints *hints,
+ ares_addrinfo_callback callback, void *arg)
{
- struct host_query *hquery;
- unsigned short port = 0;
- int family;
+ struct host_query *hquery;
+ unsigned short port = 0;
+ int family;
struct ares_addrinfo *ai;
- char *alias_name = NULL;
- int status;
+ ares_status_t status;
- if (!hints)
- {
- hints = &default_hints;
- }
+ if (!hints) {
+ hints = &default_hints;
+ }
family = hints->ai_family;
/* Right now we only know how to look up Internet addresses
and unspec means try both basically. */
- if (family != AF_INET &&
- family != AF_INET6 &&
- family != AF_UNSPEC)
- {
- callback(arg, ARES_ENOTIMP, 0, NULL);
- return;
- }
-
- if (ares__is_onion_domain(name))
- {
- callback(arg, ARES_ENOTFOUND, 0, NULL);
- return;
- }
+ if (family != AF_INET && family != AF_INET6 && family != AF_UNSPEC) {
+ callback(arg, ARES_ENOTIMP, 0, NULL);
+ return;
+ }
- /* perform HOSTALIAS resolution (technically this function does some other
- * things we are going to ignore) */
- status = ares__single_domain(channel, name, &alias_name);
- if (status != ARES_SUCCESS) {
- callback(arg, status, 0, NULL);
+ if (ares__is_onion_domain(name)) {
+ callback(arg, ARES_ENOTFOUND, 0, NULL);
return;
}
- if (alias_name)
- name = alias_name;
-
- if (service)
- {
- if (hints->ai_flags & ARES_AI_NUMERICSERV)
- {
- unsigned long val;
- errno = 0;
- val = strtoul(service, NULL, 0);
- if ((val == 0 && errno != 0) || val > 65535)
- {
- ares_free(alias_name);
- callback(arg, ARES_ESERVICE, 0, NULL);
- return;
- }
- port = (unsigned short)val;
- }
- else
- {
- port = lookup_service(service, 0);
- if (!port)
- {
- unsigned long val;
- errno = 0;
- val = strtoul(service, NULL, 0);
- if ((val == 0 && errno != 0) || val > 65535)
- {
- ares_free(alias_name);
- callback(arg, ARES_ESERVICE, 0, NULL);
- return;
- }
- port = (unsigned short)val;
- }
+ if (service) {
+ if (hints->ai_flags & ARES_AI_NUMERICSERV) {
+ unsigned long val;
+ errno = 0;
+ val = strtoul(service, NULL, 0);
+ if ((val == 0 && errno != 0) || val > 65535) {
+ callback(arg, ARES_ESERVICE, 0, NULL);
+ return;
+ }
+ port = (unsigned short)val;
+ } else {
+ port = lookup_service(service, 0);
+ if (!port) {
+ unsigned long val;
+ errno = 0;
+ val = strtoul(service, NULL, 0);
+ if ((val == 0 && errno != 0) || val > 65535) {
+ callback(arg, ARES_ESERVICE, 0, NULL);
+ return;
}
+ port = (unsigned short)val;
+ }
}
+ }
- ai = ares__malloc_addrinfo();
- if (!ai)
- {
- ares_free(alias_name);
- callback(arg, ARES_ENOMEM, 0, NULL);
- return;
- }
+ ai = ares_malloc_zero(sizeof(*ai));
+ if (!ai) {
+ callback(arg, ARES_ENOMEM, 0, NULL);
+ return;
+ }
- if (fake_addrinfo(name, port, hints, ai, callback, arg))
- {
- ares_free(alias_name);
- return;
- }
+ if (fake_addrinfo(name, port, hints, ai, callback, arg)) {
+ return;
+ }
/* Allocate and fill in the host query structure. */
- hquery = ares_malloc(sizeof(*hquery));
- if (!hquery)
- {
- ares_free(alias_name);
- ares_freeaddrinfo(ai);
- callback(arg, ARES_ENOMEM, 0, NULL);
- return;
- }
- memset(hquery, 0, sizeof(*hquery));
- hquery->name = ares_strdup(name);
- ares_free(alias_name);
- if (!hquery->name)
- {
- ares_free(hquery);
- ares_freeaddrinfo(ai);
- callback(arg, ARES_ENOMEM, 0, NULL);
- return;
- }
+ hquery = ares_malloc_zero(sizeof(*hquery));
+ if (!hquery) {
+ ares_freeaddrinfo(ai);
+ callback(arg, ARES_ENOMEM, 0, NULL);
+ return;
+ }
- hquery->port = port;
- hquery->channel = channel;
- hquery->hints = *hints;
+ hquery->port = port;
+ hquery->channel = channel;
+ hquery->hints = *hints;
hquery->sent_family = -1; /* nothing is sent yet */
- hquery->callback = callback;
- hquery->arg = arg;
- hquery->remaining_lookups = channel->lookups;
- hquery->ai = ai;
- hquery->next_domain = -1;
+ hquery->callback = callback;
+ hquery->arg = arg;
+ hquery->ai = ai;
+ hquery->name = ares_strdup(name);
+ if (hquery->name == NULL) {
+ hquery_free(hquery, ARES_TRUE);
+ callback(arg, ARES_ENOMEM, 0, NULL);
+ return;
+ }
- /* Start performing lookups according to channel->lookups. */
- next_lookup(hquery, ARES_ECONNREFUSED /* initial error code */);
-}
+ status =
+ ares__search_name_list(channel, name, &hquery->names, &hquery->names_cnt);
+ if (status != ARES_SUCCESS) {
+ hquery_free(hquery, ARES_TRUE);
+ callback(arg, (int)status, 0, NULL);
+ return;
+ }
+ hquery->next_name_idx = 0;
-static int next_dns_lookup(struct host_query *hquery)
-{
- char *s = NULL;
- int is_s_allocated = 0;
- int status;
-
- /* if next_domain == -1 and as_is_first is true, try hquery->name */
- if (hquery->next_domain == -1)
- {
- if (as_is_first(hquery))
- {
- s = hquery->name;
- }
- hquery->next_domain = 0;
- }
- /* if as_is_first is false, try hquery->name at last */
- if (!s && hquery->next_domain == hquery->channel->ndomains) {
- if (!as_is_first(hquery))
- {
- s = hquery->name;
- }
- hquery->next_domain++;
- }
-
- if (!s && hquery->next_domain < hquery->channel->ndomains && !as_is_only(hquery))
- {
- status = ares__cat_domain(
- hquery->name,
- hquery->channel->domains[hquery->next_domain++],
- &s);
- if (status == ARES_SUCCESS)
- {
- is_s_allocated = 1;
- }
- }
+ hquery->lookups = ares_strdup(channel->lookups);
+ if (hquery->lookups == NULL) {
+ hquery_free(hquery, ARES_TRUE);
+ callback(arg, ARES_ENOMEM, 0, NULL);
+ return;
+ }
+ hquery->remaining_lookups = hquery->lookups;
- if (s)
- {
- /* NOTE: hquery may be invalidated during the call to ares_query_qid(),
- * so should not be referenced after this point */
- switch (hquery->hints.ai_family)
- {
- case AF_INET:
- hquery->remaining += 1;
- ares_query_qid(hquery->channel, s, C_IN, T_A, host_callback, hquery,
- &hquery->qid_a);
- break;
- case AF_INET6:
- hquery->remaining += 1;
- ares_query_qid(hquery->channel, s, C_IN, T_AAAA, host_callback,
- hquery, &hquery->qid_aaaa);
- break;
- case AF_UNSPEC:
- hquery->remaining += 2;
- ares_query_qid(hquery->channel, s, C_IN, T_A, host_callback,
- hquery, &hquery->qid_a);
- ares_query_qid(hquery->channel, s, C_IN, T_AAAA, host_callback,
- hquery, &hquery->qid_aaaa);
- break;
- default: break;
- }
- if (is_s_allocated)
- {
- ares_free(s);
- }
- return 1;
- }
- else
- {
- assert(!hquery->ai->nodes);
- return 0;
- }
+ /* Start performing lookups according to channel->lookups. */
+ next_lookup(hquery, ARES_ECONNREFUSED /* initial error code */);
}
-static int as_is_first(const struct host_query* hquery)
+void ares_getaddrinfo(ares_channel_t *channel, const char *name,
+ const char *service,
+ const struct ares_addrinfo_hints *hints,
+ ares_addrinfo_callback callback, void *arg)
{
- char* p;
- int ndots = 0;
- size_t nname = hquery->name?strlen(hquery->name):0;
- for (p = hquery->name; p && *p; p++)
- {
- if (*p == '.')
- {
- ndots++;
- }
- }
- if (nname && hquery->name[nname-1] == '.')
- {
- /* prevent ARES_EBADNAME for valid FQDN, where ndots < channel->ndots */
- return 1;
- }
- return ndots >= hquery->channel->ndots;
+ if (channel == NULL) {
+ return;
+ }
+ ares__channel_lock(channel);
+ ares_getaddrinfo_int(channel, name, service, hints, callback, arg);
+ ares__channel_unlock(channel);
}
-static int as_is_only(const struct host_query* hquery)
+static ares_bool_t next_dns_lookup(struct host_query *hquery)
{
- size_t nname = hquery->name?strlen(hquery->name):0;
- if (nname && hquery->name[nname-1] == '.')
- return 1;
- return 0;
-}
+ const char *name = NULL;
+
+ if (hquery->next_name_idx >= hquery->names_cnt) {
+ return ARES_FALSE;
+ }
+ name = hquery->names[hquery->next_name_idx++];
+
+ /* NOTE: hquery may be invalidated during the call to ares_query_qid(),
+ * so should not be referenced after this point */
+ switch (hquery->hints.ai_family) {
+ case AF_INET:
+ hquery->remaining += 1;
+ ares_query_dnsrec(hquery->channel, name, ARES_CLASS_IN, ARES_REC_TYPE_A,
+ host_callback, hquery, &hquery->qid_a);
+ break;
+ case AF_INET6:
+ hquery->remaining += 1;
+ ares_query_dnsrec(hquery->channel, name, ARES_CLASS_IN,
+ ARES_REC_TYPE_AAAA, host_callback, hquery,
+ &hquery->qid_aaaa);
+ break;
+ case AF_UNSPEC:
+ hquery->remaining += 2;
+ ares_query_dnsrec(hquery->channel, name, ARES_CLASS_IN, ARES_REC_TYPE_A,
+ host_callback, hquery, &hquery->qid_a);
+ ares_query_dnsrec(hquery->channel, name, ARES_CLASS_IN,
+ ARES_REC_TYPE_AAAA, host_callback, hquery,
+ &hquery->qid_aaaa);
+ break;
+ default:
+ break;
+ }
+
+ return ARES_TRUE;
+}
diff --git a/contrib/libs/c-ares/src/lib/ares_gethostbyaddr.c b/contrib/libs/c-ares/src/lib/ares_gethostbyaddr.c
index 628813057b..453673260d 100644
--- a/contrib/libs/c-ares/src/lib/ares_gethostbyaddr.c
+++ b/contrib/libs/c-ares/src/lib/ares_gethostbyaddr.c
@@ -45,255 +45,190 @@
#include "ares_private.h"
#ifdef WATT32
-#undef WIN32
+# undef WIN32
#endif
struct addr_query {
/* Arguments passed to ares_gethostbyaddr() */
- ares_channel channel;
- struct ares_addr addr;
+ ares_channel_t *channel;
+ struct ares_addr addr;
ares_host_callback callback;
- void *arg;
-
+ void *arg;
+ char *lookups; /* duplicate memory from channel for ares_reinit() */
const char *remaining_lookups;
- int timeouts;
+ size_t timeouts;
};
static void next_lookup(struct addr_query *aquery);
-static void addr_callback(void *arg, int status, int timeouts,
- unsigned char *abuf, int alen);
-static void end_aquery(struct addr_query *aquery, int status,
+static void addr_callback(void *arg, ares_status_t status, size_t timeouts,
+ const ares_dns_record_t *dnsrec);
+static void end_aquery(struct addr_query *aquery, ares_status_t status,
struct hostent *host);
-static int file_lookup(struct ares_addr *addr, struct hostent **host);
-static void ptr_rr_name(char *name, int name_size, const struct ares_addr *addr);
+static ares_status_t file_lookup(ares_channel_t *channel,
+ const struct ares_addr *addr,
+ struct hostent **host);
-void ares_gethostbyaddr(ares_channel channel, const void *addr, int addrlen,
- int family, ares_host_callback callback, void *arg)
+static void ares_gethostbyaddr_int(ares_channel_t *channel, const void *addr,
+ int addrlen, int family,
+ ares_host_callback callback, void *arg)
{
struct addr_query *aquery;
- if (family != AF_INET && family != AF_INET6)
- {
- callback(arg, ARES_ENOTIMP, 0, NULL);
- return;
- }
+ if (family != AF_INET && family != AF_INET6) {
+ callback(arg, ARES_ENOTIMP, 0, NULL);
+ return;
+ }
- if ((family == AF_INET && addrlen != sizeof(aquery->addr.addrV4)) ||
- (family == AF_INET6 && addrlen != sizeof(aquery->addr.addrV6)))
- {
- callback(arg, ARES_ENOTIMP, 0, NULL);
- return;
- }
+ if ((family == AF_INET && addrlen != sizeof(aquery->addr.addr.addr4)) ||
+ (family == AF_INET6 && addrlen != sizeof(aquery->addr.addr.addr6))) {
+ callback(arg, ARES_ENOTIMP, 0, NULL);
+ return;
+ }
aquery = ares_malloc(sizeof(struct addr_query));
- if (!aquery)
- {
- callback(arg, ARES_ENOMEM, 0, NULL);
- return;
- }
+ if (!aquery) {
+ callback(arg, ARES_ENOMEM, 0, NULL);
+ return;
+ }
+ aquery->lookups = ares_strdup(channel->lookups);
+ if (aquery->lookups == NULL) {
+ ares_free(aquery);
+ callback(arg, ARES_ENOMEM, 0, NULL);
+ return;
+ }
aquery->channel = channel;
- if (family == AF_INET)
- memcpy(&aquery->addr.addrV4, addr, sizeof(aquery->addr.addrV4));
- else
- memcpy(&aquery->addr.addrV6, addr, sizeof(aquery->addr.addrV6));
- aquery->addr.family = family;
- aquery->callback = callback;
- aquery->arg = arg;
- aquery->remaining_lookups = channel->lookups;
- aquery->timeouts = 0;
+ if (family == AF_INET) {
+ memcpy(&aquery->addr.addr.addr4, addr, sizeof(aquery->addr.addr.addr4));
+ } else {
+ memcpy(&aquery->addr.addr.addr6, addr, sizeof(aquery->addr.addr.addr6));
+ }
+ aquery->addr.family = family;
+ aquery->callback = callback;
+ aquery->arg = arg;
+ aquery->remaining_lookups = aquery->lookups;
+ aquery->timeouts = 0;
next_lookup(aquery);
}
+void ares_gethostbyaddr(ares_channel_t *channel, const void *addr, int addrlen,
+ int family, ares_host_callback callback, void *arg)
+{
+ if (channel == NULL) {
+ return;
+ }
+ ares__channel_lock(channel);
+ ares_gethostbyaddr_int(channel, addr, addrlen, family, callback, arg);
+ ares__channel_unlock(channel);
+}
+
static void next_lookup(struct addr_query *aquery)
{
- const char *p;
- char name[128];
- int status;
+ const char *p;
+ ares_status_t status;
struct hostent *host;
-
- for (p = aquery->remaining_lookups; *p; p++)
- {
- switch (*p)
- {
- case 'b':
- ptr_rr_name(name, sizeof(name), &aquery->addr);
- aquery->remaining_lookups = p + 1;
- ares_query(aquery->channel, name, C_IN, T_PTR, addr_callback,
- aquery);
+ char *name;
+
+ for (p = aquery->remaining_lookups; *p; p++) {
+ switch (*p) {
+ case 'b':
+ name = ares_dns_addr_to_ptr(&aquery->addr);
+ if (name == NULL) {
+ end_aquery(aquery, ARES_ENOMEM, NULL);
+ return;
+ }
+ aquery->remaining_lookups = p + 1;
+ ares_query_dnsrec(aquery->channel, name, ARES_CLASS_IN,
+ ARES_REC_TYPE_PTR, addr_callback, aquery, NULL);
+ ares_free(name);
+ return;
+ case 'f':
+ status = file_lookup(aquery->channel, &aquery->addr, &host);
+
+ /* this status check below previously checked for !ARES_ENOTFOUND,
+ but we should not assume that this single error code is the one
+ that can occur, as that is in fact no longer the case */
+ if (status == ARES_SUCCESS) {
+ end_aquery(aquery, status, host);
return;
- case 'f':
- status = file_lookup(&aquery->addr, &host);
-
- /* this status check below previously checked for !ARES_ENOTFOUND,
- but we should not assume that this single error code is the one
- that can occur, as that is in fact no longer the case */
- if (status == ARES_SUCCESS)
- {
- end_aquery(aquery, status, host);
- return;
- }
- break;
}
+ break;
+ default:
+ break;
}
+ }
end_aquery(aquery, ARES_ENOTFOUND, NULL);
}
-static void addr_callback(void *arg, int status, int timeouts,
- unsigned char *abuf, int alen)
+static void addr_callback(void *arg, ares_status_t status, size_t timeouts,
+ const ares_dns_record_t *dnsrec)
{
- struct addr_query *aquery = (struct addr_query *) arg;
- struct hostent *host;
- size_t addrlen;
+ struct addr_query *aquery = (struct addr_query *)arg;
+ struct hostent *host;
+ size_t addrlen;
aquery->timeouts += timeouts;
- if (status == ARES_SUCCESS)
- {
- if (aquery->addr.family == AF_INET)
- {
- addrlen = sizeof(aquery->addr.addrV4);
- status = ares_parse_ptr_reply(abuf, alen, &aquery->addr.addrV4,
- (int)addrlen, AF_INET, &host);
- }
- else
- {
- addrlen = sizeof(aquery->addr.addrV6);
- status = ares_parse_ptr_reply(abuf, alen, &aquery->addr.addrV6,
- (int)addrlen, AF_INET6, &host);
- }
- end_aquery(aquery, status, host);
+ if (status == ARES_SUCCESS) {
+ if (aquery->addr.family == AF_INET) {
+ addrlen = sizeof(aquery->addr.addr.addr4);
+ status = ares_parse_ptr_reply_dnsrec(dnsrec, &aquery->addr.addr.addr4,
+ (int)addrlen, AF_INET, &host);
+ } else {
+ addrlen = sizeof(aquery->addr.addr.addr6);
+ status = ares_parse_ptr_reply_dnsrec(dnsrec, &aquery->addr.addr.addr6,
+ (int)addrlen, AF_INET6, &host);
}
- else if (status == ARES_EDESTRUCTION || status == ARES_ECANCELLED)
+ end_aquery(aquery, status, host);
+ } else if (status == ARES_EDESTRUCTION || status == ARES_ECANCELLED) {
end_aquery(aquery, status, NULL);
- else
+ } else {
next_lookup(aquery);
+ }
}
-static void end_aquery(struct addr_query *aquery, int status,
+static void end_aquery(struct addr_query *aquery, ares_status_t status,
struct hostent *host)
{
- aquery->callback(aquery->arg, status, aquery->timeouts, host);
- if (host)
+ aquery->callback(aquery->arg, (int)status, (int)aquery->timeouts, host);
+ if (host) {
ares_free_hostent(host);
+ }
+ ares_free(aquery->lookups);
ares_free(aquery);
}
-static int file_lookup(struct ares_addr *addr, struct hostent **host)
+static ares_status_t file_lookup(ares_channel_t *channel,
+ const struct ares_addr *addr,
+ struct hostent **host)
{
- FILE *fp;
- int status;
- int error;
-
-#ifdef WIN32
- char PATH_HOSTS[MAX_PATH];
- win_platform platform;
-
- PATH_HOSTS[0] = '\0';
-
- platform = ares__getplatform();
-
- if (platform == WIN_NT) {
- char tmp[MAX_PATH];
- HKEY hkeyHosts;
-
- if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0, KEY_READ,
- &hkeyHosts) == ERROR_SUCCESS)
- {
- DWORD dwLength = MAX_PATH;
- RegQueryValueExA(hkeyHosts, DATABASEPATH, NULL, NULL, (LPBYTE)tmp,
- &dwLength);
- ExpandEnvironmentStringsA(tmp, PATH_HOSTS, MAX_PATH);
- RegCloseKey(hkeyHosts);
- }
+ char ipaddr[INET6_ADDRSTRLEN];
+ const void *ptr = NULL;
+ const ares_hosts_entry_t *entry;
+ ares_status_t status;
+
+ if (addr->family == AF_INET) {
+ ptr = &addr->addr.addr4;
+ } else if (addr->family == AF_INET6) {
+ ptr = &addr->addr.addr6;
}
- else if (platform == WIN_9X)
- GetWindowsDirectoryA(PATH_HOSTS, MAX_PATH);
- else
- return ARES_ENOTFOUND;
- strcat(PATH_HOSTS, WIN_PATH_HOSTS);
-
-#elif defined(WATT32)
- const char *PATH_HOSTS = _w32_GetHostsFile();
+ if (ptr == NULL) {
+ return ARES_ENOTFOUND;
+ }
- if (!PATH_HOSTS)
+ if (!ares_inet_ntop(addr->family, ptr, ipaddr, sizeof(ipaddr))) {
return ARES_ENOTFOUND;
-#endif
+ }
- fp = fopen(PATH_HOSTS, "r");
- if (!fp)
- {
- error = ERRNO;
- switch(error)
- {
- case ENOENT:
- case ESRCH:
- return ARES_ENOTFOUND;
- default:
- DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n",
- error, strerror(error)));
- DEBUGF(fprintf(stderr, "Error opening file: %s\n",
- PATH_HOSTS));
- *host = NULL;
- return ARES_EFILE;
- }
- }
- while ((status = ares__get_hostent(fp, addr->family, host)) == ARES_SUCCESS)
- {
- if (addr->family != (*host)->h_addrtype)
- {
- ares_free_hostent(*host);
- continue;
- }
- if (addr->family == AF_INET)
- {
- if (memcmp((*host)->h_addr, &addr->addrV4,
- sizeof(addr->addrV4)) == 0)
- break;
- }
- else if (addr->family == AF_INET6)
- {
- if (memcmp((*host)->h_addr, &addr->addrV6,
- sizeof(addr->addrV6)) == 0)
- break;
- }
- ares_free_hostent(*host);
- }
- fclose(fp);
- if (status == ARES_EOF)
- status = ARES_ENOTFOUND;
- if (status != ARES_SUCCESS)
- *host = NULL;
- return status;
-}
+ status = ares__hosts_search_ipaddr(channel, ARES_FALSE, ipaddr, &entry);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
-static void ptr_rr_name(char *name, int name_size, const struct ares_addr *addr)
-{
- if (addr->family == AF_INET)
- {
- unsigned long laddr = ntohl(addr->addrV4.s_addr);
- unsigned long a1 = (laddr >> 24UL) & 0xFFUL;
- unsigned long a2 = (laddr >> 16UL) & 0xFFUL;
- unsigned long a3 = (laddr >> 8UL) & 0xFFUL;
- unsigned long a4 = laddr & 0xFFUL;
- snprintf(name, name_size, "%lu.%lu.%lu.%lu.in-addr.arpa", a4, a3, a2, a1);
- }
- else
- {
- unsigned char *bytes = (unsigned char *)&addr->addrV6;
- /* There are too many arguments to do this in one line using
- * minimally C89-compliant compilers */
- snprintf(name, name_size,
- "%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.",
- bytes[15]&0xf, bytes[15] >> 4, bytes[14]&0xf, bytes[14] >> 4,
- bytes[13]&0xf, bytes[13] >> 4, bytes[12]&0xf, bytes[12] >> 4,
- bytes[11]&0xf, bytes[11] >> 4, bytes[10]&0xf, bytes[10] >> 4,
- bytes[9]&0xf, bytes[9] >> 4, bytes[8]&0xf, bytes[8] >> 4);
- snprintf(name+strlen(name), name_size-strlen(name),
- "%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.ip6.arpa",
- bytes[7]&0xf, bytes[7] >> 4, bytes[6]&0xf, bytes[6] >> 4,
- bytes[5]&0xf, bytes[5] >> 4, bytes[4]&0xf, bytes[4] >> 4,
- bytes[3]&0xf, bytes[3] >> 4, bytes[2]&0xf, bytes[2] >> 4,
- bytes[1]&0xf, bytes[1] >> 4, bytes[0]&0xf, bytes[0] >> 4);
- }
+ status = ares__hosts_entry_to_hostent(entry, addr->family, host);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ return ARES_SUCCESS;
}
diff --git a/contrib/libs/c-ares/src/lib/ares_gethostbyname.c b/contrib/libs/c-ares/src/lib/ares_gethostbyname.c
index 343bd7b733..299c35b416 100644
--- a/contrib/libs/c-ares/src/lib/ares_gethostbyname.c
+++ b/contrib/libs/c-ares/src/lib/ares_gethostbyname.c
@@ -40,60 +40,57 @@
#include "ares_nameser.h"
#ifdef HAVE_STRINGS_H
-#include <strings.h>
+# include <strings.h>
#endif
#include "ares.h"
#include "ares_inet_net_pton.h"
-#include "bitncmp.h"
#include "ares_platform.h"
-#include "ares_nowarn.h"
#include "ares_private.h"
-static void sort_addresses(struct hostent *host,
- const struct apattern *sortlist, int nsort);
-static void sort6_addresses(struct hostent *host,
- const struct apattern *sortlist, int nsort);
-static int get_address_index(const struct in_addr *addr,
- const struct apattern *sortlist, int nsort);
-static int get6_address_index(const struct ares_in6_addr *addr,
- const struct apattern *sortlist, int nsort);
+static void sort_addresses(const struct hostent *host,
+ const struct apattern *sortlist, size_t nsort);
+static void sort6_addresses(const struct hostent *host,
+ const struct apattern *sortlist, size_t nsort);
+static size_t get_address_index(const struct in_addr *addr,
+ const struct apattern *sortlist, size_t nsort);
+static size_t get6_address_index(const struct ares_in6_addr *addr,
+ const struct apattern *sortlist, size_t nsort);
struct host_query {
ares_host_callback callback;
- void *arg;
- ares_channel channel;
+ void *arg;
+ ares_channel_t *channel;
};
static void ares_gethostbyname_callback(void *arg, int status, int timeouts,
struct ares_addrinfo *result)
{
- struct hostent *hostent = NULL;
+ struct hostent *hostent = NULL;
struct host_query *ghbn_arg = arg;
- if (status == ARES_SUCCESS)
- {
- status = ares__addrinfo2hostent(result, AF_UNSPEC, &hostent);
- }
+ if (status == ARES_SUCCESS) {
+ status = (int)ares__addrinfo2hostent(result, AF_UNSPEC, &hostent);
+ }
/* addrinfo2hostent will only return ENODATA if there are no addresses _and_
* no cname/aliases. However, gethostbyname will return ENODATA even if there
* is cname/alias data */
if (status == ARES_SUCCESS && hostent &&
- (!hostent->h_addr_list || !hostent->h_addr_list[0]))
- {
- status = ARES_ENODATA;
- }
+ (!hostent->h_addr_list || !hostent->h_addr_list[0])) {
+ status = ARES_ENODATA;
+ }
- if (status == ARES_SUCCESS && ghbn_arg->channel->nsort && hostent)
- {
- if (hostent->h_addrtype == AF_INET6)
- sort6_addresses(hostent, ghbn_arg->channel->sortlist,
- ghbn_arg->channel->nsort);
- if (hostent->h_addrtype == AF_INET)
- sort_addresses(hostent, ghbn_arg->channel->sortlist,
- ghbn_arg->channel->nsort);
+ if (status == ARES_SUCCESS && ghbn_arg->channel->nsort && hostent) {
+ if (hostent->h_addrtype == AF_INET6) {
+ sort6_addresses(hostent, ghbn_arg->channel->sortlist,
+ ghbn_arg->channel->nsort);
+ }
+ if (hostent->h_addrtype == AF_INET) {
+ sort_addresses(hostent, ghbn_arg->channel->sortlist,
+ ghbn_arg->channel->nsort);
}
+ }
ghbn_arg->callback(ghbn_arg->arg, status, timeouts, hostent);
@@ -102,249 +99,232 @@ static void ares_gethostbyname_callback(void *arg, int status, int timeouts,
ares_free_hostent(hostent);
}
-void ares_gethostbyname(ares_channel channel, const char *name, int family,
+void ares_gethostbyname(ares_channel_t *channel, const char *name, int family,
ares_host_callback callback, void *arg)
{
const struct ares_addrinfo_hints hints = { ARES_AI_CANONNAME, family, 0, 0 };
- struct host_query *ghbn_arg;
+ struct host_query *ghbn_arg;
- if (!callback)
+ if (!callback) {
return;
+ }
ghbn_arg = ares_malloc(sizeof(*ghbn_arg));
- if (!ghbn_arg)
- {
- callback(arg, ARES_ENOMEM, 0, NULL);
- return;
- }
+ if (!ghbn_arg) {
+ callback(arg, ARES_ENOMEM, 0, NULL);
+ return;
+ }
- ghbn_arg->callback=callback;
- ghbn_arg->arg=arg;
- ghbn_arg->channel=channel;
+ ghbn_arg->callback = callback;
+ ghbn_arg->arg = arg;
+ ghbn_arg->channel = channel;
+ /* NOTE: ares_getaddrinfo() locks the channel, we don't use the channel
+ * outside so no need to lock */
ares_getaddrinfo(channel, name, NULL, &hints, ares_gethostbyname_callback,
ghbn_arg);
}
-
-static void sort_addresses(struct hostent *host,
- const struct apattern *sortlist, int nsort)
+static void sort_addresses(const struct hostent *host,
+ const struct apattern *sortlist, size_t nsort)
{
- struct in_addr a1, a2;
- int i1, i2, ind1, ind2;
+ struct in_addr a1;
+ struct in_addr a2;
+ int i1;
+ int i2;
+ size_t ind1;
+ size_t ind2;
/* This is a simple insertion sort, not optimized at all. i1 walks
* through the address list, with the loop invariant that everything
* to the left of i1 is sorted. In the loop body, the value at i1 is moved
* back through the list (via i2) until it is in sorted order.
*/
- for (i1 = 0; host->h_addr_list[i1]; i1++)
- {
- memcpy(&a1, host->h_addr_list[i1], sizeof(struct in_addr));
- ind1 = get_address_index(&a1, sortlist, nsort);
- for (i2 = i1 - 1; i2 >= 0; i2--)
- {
- memcpy(&a2, host->h_addr_list[i2], sizeof(struct in_addr));
- ind2 = get_address_index(&a2, sortlist, nsort);
- if (ind2 <= ind1)
- break;
- memcpy(host->h_addr_list[i2 + 1], &a2, sizeof(struct in_addr));
- }
- memcpy(host->h_addr_list[i2 + 1], &a1, sizeof(struct in_addr));
+ for (i1 = 0; host->h_addr_list[i1]; i1++) {
+ memcpy(&a1, host->h_addr_list[i1], sizeof(struct in_addr));
+ ind1 = get_address_index(&a1, sortlist, nsort);
+ for (i2 = i1 - 1; i2 >= 0; i2--) {
+ memcpy(&a2, host->h_addr_list[i2], sizeof(struct in_addr));
+ ind2 = get_address_index(&a2, sortlist, nsort);
+ if (ind2 <= ind1) {
+ break;
+ }
+ memcpy(host->h_addr_list[i2 + 1], &a2, sizeof(struct in_addr));
}
+ memcpy(host->h_addr_list[i2 + 1], &a1, sizeof(struct in_addr));
+ }
}
/* Find the first entry in sortlist which matches addr. Return nsort
* if none of them match.
*/
-static int get_address_index(const struct in_addr *addr,
- const struct apattern *sortlist,
- int nsort)
+static size_t get_address_index(const struct in_addr *addr,
+ const struct apattern *sortlist, size_t nsort)
{
- int i;
-
- for (i = 0; i < nsort; i++)
- {
- if (sortlist[i].family != AF_INET)
- continue;
- if (sortlist[i].type == PATTERN_MASK)
- {
- if ((addr->s_addr & sortlist[i].mask.addr4.s_addr)
- == sortlist[i].addrV4.s_addr)
- break;
- }
- else
- {
- if (!ares__bitncmp(&addr->s_addr, &sortlist[i].addrV4.s_addr,
- sortlist[i].mask.bits))
- break;
- }
+ size_t i;
+ struct ares_addr aaddr;
+
+ memset(&aaddr, 0, sizeof(aaddr));
+ aaddr.family = AF_INET;
+ memcpy(&aaddr.addr.addr4, addr, 4);
+
+ for (i = 0; i < nsort; i++) {
+ if (sortlist[i].addr.family != AF_INET) {
+ continue;
+ }
+
+ if (ares__subnet_match(&aaddr, &sortlist[i].addr, sortlist[i].mask)) {
+ break;
}
+ }
+
return i;
}
-static void sort6_addresses(struct hostent *host,
- const struct apattern *sortlist, int nsort)
+static void sort6_addresses(const struct hostent *host,
+ const struct apattern *sortlist, size_t nsort)
{
- struct ares_in6_addr a1, a2;
- int i1, i2, ind1, ind2;
+ struct ares_in6_addr a1;
+ struct ares_in6_addr a2;
+ int i1;
+ int i2;
+ size_t ind1;
+ size_t ind2;
/* This is a simple insertion sort, not optimized at all. i1 walks
* through the address list, with the loop invariant that everything
* to the left of i1 is sorted. In the loop body, the value at i1 is moved
* back through the list (via i2) until it is in sorted order.
*/
- for (i1 = 0; host->h_addr_list[i1]; i1++)
- {
- memcpy(&a1, host->h_addr_list[i1], sizeof(struct ares_in6_addr));
- ind1 = get6_address_index(&a1, sortlist, nsort);
- for (i2 = i1 - 1; i2 >= 0; i2--)
- {
- memcpy(&a2, host->h_addr_list[i2], sizeof(struct ares_in6_addr));
- ind2 = get6_address_index(&a2, sortlist, nsort);
- if (ind2 <= ind1)
- break;
- memcpy(host->h_addr_list[i2 + 1], &a2, sizeof(struct ares_in6_addr));
- }
- memcpy(host->h_addr_list[i2 + 1], &a1, sizeof(struct ares_in6_addr));
+ for (i1 = 0; host->h_addr_list[i1]; i1++) {
+ memcpy(&a1, host->h_addr_list[i1], sizeof(struct ares_in6_addr));
+ ind1 = get6_address_index(&a1, sortlist, nsort);
+ for (i2 = i1 - 1; i2 >= 0; i2--) {
+ memcpy(&a2, host->h_addr_list[i2], sizeof(struct ares_in6_addr));
+ ind2 = get6_address_index(&a2, sortlist, nsort);
+ if (ind2 <= ind1) {
+ break;
+ }
+ memcpy(host->h_addr_list[i2 + 1], &a2, sizeof(struct ares_in6_addr));
}
+ memcpy(host->h_addr_list[i2 + 1], &a1, sizeof(struct ares_in6_addr));
+ }
}
/* Find the first entry in sortlist which matches addr. Return nsort
* if none of them match.
*/
-static int get6_address_index(const struct ares_in6_addr *addr,
- const struct apattern *sortlist,
- int nsort)
+static size_t get6_address_index(const struct ares_in6_addr *addr,
+ const struct apattern *sortlist, size_t nsort)
{
- int i;
+ size_t i;
+ struct ares_addr aaddr;
- for (i = 0; i < nsort; i++)
- {
- if (sortlist[i].family != AF_INET6)
- continue;
- if (!ares__bitncmp(addr, &sortlist[i].addrV6, sortlist[i].mask.bits))
- break;
+ memset(&aaddr, 0, sizeof(aaddr));
+ aaddr.family = AF_INET6;
+ memcpy(&aaddr.addr.addr6, addr, 16);
+
+ for (i = 0; i < nsort; i++) {
+ if (sortlist[i].addr.family != AF_INET6) {
+ continue;
+ }
+
+ if (ares__subnet_match(&aaddr, &sortlist[i].addr, sortlist[i].mask)) {
+ break;
}
+ }
return i;
}
+static ares_status_t ares__hostent_localhost(const char *name, int family,
+ struct hostent **host_out)
+{
+ ares_status_t status;
+ struct ares_addrinfo *ai = NULL;
+ struct ares_addrinfo_hints hints;
+
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = family;
+
+ ai = ares_malloc_zero(sizeof(*ai));
+ if (ai == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ status = ares__addrinfo_localhost(name, 0, &hints, ai);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
-static int file_lookup(const char *name, int family, struct hostent **host);
+ status = ares__addrinfo2hostent(ai, family, host_out);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+done:
+ ares_freeaddrinfo(ai);
+ return status;
+}
/* I really have no idea why this is exposed as a public function, but since
* it is, we can't kill this legacy function. */
-int ares_gethostbyname_file(ares_channel channel, const char *name,
- int family, struct hostent **host)
+static ares_status_t ares_gethostbyname_file_int(ares_channel_t *channel,
+ const char *name, int family,
+ struct hostent **host)
{
- int result;
+ const ares_hosts_entry_t *entry;
+ ares_status_t status;
/* We only take the channel to ensure that ares_init() been called. */
- if(channel == NULL)
- {
- /* Anything will do, really. This seems fine, and is consistent with
- other error cases. */
+ if (channel == NULL || name == NULL || host == NULL) {
+ /* Anything will do, really. This seems fine, and is consistent with
+ other error cases. */
+ if (host != NULL) {
*host = NULL;
- return ARES_ENOTFOUND;
}
+ return ARES_ENOTFOUND;
+ }
- /* Just chain to the internal implementation we use here; it's exactly
- * what we want.
- */
- result = file_lookup(name, family, host);
- if(result != ARES_SUCCESS)
- {
- /* We guarantee a NULL hostent on failure. */
- *host = NULL;
- }
- return result;
-}
+ /* Per RFC 7686, reject queries for ".onion" domain names with NXDOMAIN. */
+ if (ares__is_onion_domain(name)) {
+ return ARES_ENOTFOUND;
+ }
-static int file_lookup(const char *name, int family, struct hostent **host)
-{
- FILE *fp;
- char **alias;
- int status;
- int error;
-
-#ifdef WIN32
- char PATH_HOSTS[MAX_PATH];
- win_platform platform;
-
- PATH_HOSTS[0] = '\0';
-
- platform = ares__getplatform();
-
- if (platform == WIN_NT) {
- char tmp[MAX_PATH];
- HKEY hkeyHosts;
-
- if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0, KEY_READ,
- &hkeyHosts) == ERROR_SUCCESS)
- {
- DWORD dwLength = MAX_PATH;
- RegQueryValueExA(hkeyHosts, DATABASEPATH, NULL, NULL, (LPBYTE)tmp,
- &dwLength);
- ExpandEnvironmentStringsA(tmp, PATH_HOSTS, MAX_PATH);
- RegCloseKey(hkeyHosts);
- }
+ status = ares__hosts_search_host(channel, ARES_FALSE, name, &entry);
+ if (status != ARES_SUCCESS) {
+ goto done;
}
- else if (platform == WIN_9X)
- GetWindowsDirectoryA(PATH_HOSTS, MAX_PATH);
- else
- return ARES_ENOTFOUND;
- strcat(PATH_HOSTS, WIN_PATH_HOSTS);
+ status = ares__hosts_entry_to_hostent(entry, family, host);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
-#elif defined(WATT32)
- const char *PATH_HOSTS = _w32_GetHostsFile();
+done:
+ /* RFC6761 section 6.3 #3 states that "Name resolution APIs and libraries
+ * SHOULD recognize localhost names as special and SHOULD always return the
+ * IP loopback address for address queries".
+ * We will also ignore ALL errors when trying to resolve localhost, such
+ * as permissions errors reading /etc/hosts or a malformed /etc/hosts */
+ if (status != ARES_SUCCESS && status != ARES_ENOMEM &&
+ ares__is_localhost(name)) {
+ return ares__hostent_localhost(name, family, host);
+ }
- if (!PATH_HOSTS)
- return ARES_ENOTFOUND;
-#endif
+ return status;
+}
- /* Per RFC 7686, reject queries for ".onion" domain names with NXDOMAIN. */
- if (ares__is_onion_domain(name))
+int ares_gethostbyname_file(ares_channel_t *channel, const char *name,
+ int family, struct hostent **host)
+{
+ ares_status_t status;
+ if (channel == NULL) {
return ARES_ENOTFOUND;
+ }
-
- fp = fopen(PATH_HOSTS, "r");
- if (!fp)
- {
- error = ERRNO;
- switch(error)
- {
- case ENOENT:
- case ESRCH:
- return ARES_ENOTFOUND;
- default:
- DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n",
- error, strerror(error)));
- DEBUGF(fprintf(stderr, "Error opening file: %s\n",
- PATH_HOSTS));
- *host = NULL;
- return ARES_EFILE;
- }
- }
- while ((status = ares__get_hostent(fp, family, host)) == ARES_SUCCESS)
- {
- if (strcasecmp((*host)->h_name, name) == 0)
- break;
- for (alias = (*host)->h_aliases; *alias; alias++)
- {
- if (strcasecmp(*alias, name) == 0)
- break;
- }
- if (*alias)
- break;
- ares_free_hostent(*host);
- }
- fclose(fp);
- if (status == ARES_EOF)
- status = ARES_ENOTFOUND;
- if (status != ARES_SUCCESS)
- *host = NULL;
- return status;
+ ares__channel_lock(channel);
+ status = ares_gethostbyname_file_int(channel, name, family, host);
+ ares__channel_unlock(channel);
+ return (int)status;
}
-
diff --git a/contrib/libs/c-ares/src/lib/ares_getnameinfo.c b/contrib/libs/c-ares/src/lib/ares_getnameinfo.c
index 0d97a318bf..8889e9eec6 100644
--- a/contrib/libs/c-ares/src/lib/ares_getnameinfo.c
+++ b/contrib/libs/c-ares/src/lib/ares_getnameinfo.c
@@ -26,9 +26,9 @@
#include "ares_setup.h"
#ifdef HAVE_GETSERVBYPORT_R
-# if !defined(GETSERVBYPORT_R_ARGS) || \
- (GETSERVBYPORT_R_ARGS < 4) || (GETSERVBYPORT_R_ARGS > 6)
-# error "you MUST specifiy a valid number of arguments for getservbyport_r"
+# if !defined(GETSERVBYPORT_R_ARGS) || (GETSERVBYPORT_R_ARGS < 4) || \
+ (GETSERVBYPORT_R_ARGS > 6)
+# error "you MUST specify a valid number of arguments for getservbyport_r"
# endif
#endif
@@ -45,413 +45,394 @@
#include "ares_nameser.h"
#ifdef HAVE_NET_IF_H
-#include <net/if.h>
+# include <net/if.h>
+#endif
+#if defined(USE_WINSOCK) && defined(HAVE_IPHLPAPI_H)
+# include <iphlpapi.h>
#endif
#include "ares.h"
#include "ares_ipv6.h"
-#include "ares_nowarn.h"
#include "ares_private.h"
struct nameinfo_query {
ares_nameinfo_callback callback;
- void *arg;
+ void *arg;
+
union {
- struct sockaddr_in addr4;
+ struct sockaddr_in addr4;
struct sockaddr_in6 addr6;
} addr;
- int family;
- int flags;
- int timeouts;
+
+ int family;
+ unsigned int flags;
+ size_t timeouts;
};
-#ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID
-#define IPBUFSIZ \
- (sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255") + IF_NAMESIZE)
+#ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID
+# define IPBUFSIZ \
+ (sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255") + IF_NAMESIZE)
#else
-#define IPBUFSIZ \
- (sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"))
+# define IPBUFSIZ (sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"))
#endif
-static void nameinfo_callback(void *arg, int status, int timeouts,
- struct hostent *host);
-static char *lookup_service(unsigned short port, int flags,
- char *buf, size_t buflen);
-#ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID
-static void append_scopeid(struct sockaddr_in6 *addr6, unsigned int scopeid,
- char *buf, size_t buflen);
+static void nameinfo_callback(void *arg, int status, int timeouts,
+ struct hostent *host);
+static char *lookup_service(unsigned short port, unsigned int flags, char *buf,
+ size_t buflen);
+#ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID
+static void append_scopeid(const struct sockaddr_in6 *addr6,
+ unsigned int scopeid, char *buf, size_t buflen);
#endif
-STATIC_TESTABLE char *ares_striendstr(const char *s1, const char *s2);
+static char *ares_striendstr(const char *s1, const char *s2);
-void ares_getnameinfo(ares_channel channel, const struct sockaddr *sa,
- ares_socklen_t salen,
- int flags, ares_nameinfo_callback callback, void *arg)
+static void ares_getnameinfo_int(ares_channel_t *channel,
+ const struct sockaddr *sa,
+ ares_socklen_t salen, int flags_int,
+ ares_nameinfo_callback callback, void *arg)
{
- struct sockaddr_in *addr = NULL;
- struct sockaddr_in6 *addr6 = NULL;
- struct nameinfo_query *niquery;
- unsigned int port = 0;
+ const struct sockaddr_in *addr = NULL;
+ const struct sockaddr_in6 *addr6 = NULL;
+ struct nameinfo_query *niquery;
+ unsigned short port = 0;
+ unsigned int flags = (unsigned int)flags_int;
/* Validate socket address family and length */
- if ((sa->sa_family == AF_INET) &&
- (salen == sizeof(struct sockaddr_in)))
- {
- addr = CARES_INADDR_CAST(struct sockaddr_in *, sa);
- port = addr->sin_port;
- }
- else if ((sa->sa_family == AF_INET6) &&
- (salen == sizeof(struct sockaddr_in6)))
- {
- addr6 = CARES_INADDR_CAST(struct sockaddr_in6 *, sa);
- port = addr6->sin6_port;
- }
- else
- {
- callback(arg, ARES_ENOTIMP, 0, NULL, NULL);
- return;
- }
+ if ((sa->sa_family == AF_INET) && (salen == sizeof(struct sockaddr_in))) {
+ addr = CARES_INADDR_CAST(struct sockaddr_in *, sa);
+ port = addr->sin_port;
+ } else if ((sa->sa_family == AF_INET6) &&
+ (salen == sizeof(struct sockaddr_in6))) {
+ addr6 = CARES_INADDR_CAST(struct sockaddr_in6 *, sa);
+ port = addr6->sin6_port;
+ } else {
+ callback(arg, ARES_ENOTIMP, 0, NULL, NULL);
+ return;
+ }
/* If neither, assume they want a host */
- if (!(flags & ARES_NI_LOOKUPSERVICE) && !(flags & ARES_NI_LOOKUPHOST))
+ if (!(flags & ARES_NI_LOOKUPSERVICE) && !(flags & ARES_NI_LOOKUPHOST)) {
flags |= ARES_NI_LOOKUPHOST;
+ }
/* All they want is a service, no need for DNS */
- if ((flags & ARES_NI_LOOKUPSERVICE) && !(flags & ARES_NI_LOOKUPHOST))
- {
- char buf[33], *service;
+ if ((flags & ARES_NI_LOOKUPSERVICE) && !(flags & ARES_NI_LOOKUPHOST)) {
+ char buf[33];
+ char *service;
- service = lookup_service((unsigned short)(port & 0xffff),
- flags, buf, sizeof(buf));
- callback(arg, ARES_SUCCESS, 0, NULL, service);
- return;
- }
+ service =
+ lookup_service((unsigned short)(port & 0xffff), flags, buf, sizeof(buf));
+ callback(arg, ARES_SUCCESS, 0, NULL, service);
+ return;
+ }
/* They want a host lookup */
- if ((flags & ARES_NI_LOOKUPHOST))
- {
- /* A numeric host can be handled without DNS */
- if ((flags & ARES_NI_NUMERICHOST))
- {
- char ipbuf[IPBUFSIZ];
- char srvbuf[33];
- char *service = NULL;
- ipbuf[0] = 0;
-
- /* Specifying not to lookup a host, but then saying a host
- * is required has to be illegal.
- */
- if (flags & ARES_NI_NAMEREQD)
- {
- callback(arg, ARES_EBADFLAGS, 0, NULL, NULL);
- return;
- }
- if (salen == sizeof(struct sockaddr_in6))
- {
- ares_inet_ntop(AF_INET6, &addr6->sin6_addr, ipbuf, IPBUFSIZ);
- /* If the system supports scope IDs, use it */
-#ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID
- append_scopeid(addr6, flags, ipbuf, sizeof(ipbuf));
-#endif
- }
- else
- {
- ares_inet_ntop(AF_INET, &addr->sin_addr, ipbuf, IPBUFSIZ);
- }
- /* They also want a service */
- if (flags & ARES_NI_LOOKUPSERVICE)
- service = lookup_service((unsigned short)(port & 0xffff),
- flags, srvbuf, sizeof(srvbuf));
- callback(arg, ARES_SUCCESS, 0, ipbuf, service);
+ if (flags & ARES_NI_LOOKUPHOST) {
+ /* A numeric host can be handled without DNS */
+ if (flags & ARES_NI_NUMERICHOST) {
+ char ipbuf[IPBUFSIZ];
+ char srvbuf[33];
+ char *service = NULL;
+ ipbuf[0] = 0;
+
+ /* Specifying not to lookup a host, but then saying a host
+ * is required has to be illegal.
+ */
+ if (flags & ARES_NI_NAMEREQD) {
+ callback(arg, ARES_EBADFLAGS, 0, NULL, NULL);
return;
}
+ if (salen == sizeof(struct sockaddr_in6)) {
+ ares_inet_ntop(AF_INET6, &addr6->sin6_addr, ipbuf, IPBUFSIZ);
+ /* If the system supports scope IDs, use it */
+#ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID
+ append_scopeid(addr6, flags, ipbuf, sizeof(ipbuf));
+#endif
+ } else {
+ ares_inet_ntop(AF_INET, &addr->sin_addr, ipbuf, IPBUFSIZ);
+ }
+ /* They also want a service */
+ if (flags & ARES_NI_LOOKUPSERVICE) {
+ service = lookup_service((unsigned short)(port & 0xffff), flags, srvbuf,
+ sizeof(srvbuf));
+ }
+ callback(arg, ARES_SUCCESS, 0, ipbuf, service);
+ return;
+ }
/* This is where a DNS lookup becomes necessary */
- else
- {
- niquery = ares_malloc(sizeof(struct nameinfo_query));
- if (!niquery)
- {
- callback(arg, ARES_ENOMEM, 0, NULL, NULL);
- return;
- }
- niquery->callback = callback;
- niquery->arg = arg;
- niquery->flags = flags;
- niquery->timeouts = 0;
- if (sa->sa_family == AF_INET)
- {
- niquery->family = AF_INET;
- memcpy(&niquery->addr.addr4, addr, sizeof(niquery->addr.addr4));
- ares_gethostbyaddr(channel, &addr->sin_addr,
- sizeof(struct in_addr), AF_INET,
- nameinfo_callback, niquery);
- }
- else
- {
- niquery->family = AF_INET6;
- memcpy(&niquery->addr.addr6, addr6, sizeof(niquery->addr.addr6));
- ares_gethostbyaddr(channel, &addr6->sin6_addr,
- sizeof(struct ares_in6_addr), AF_INET6,
- nameinfo_callback, niquery);
- }
+ else {
+ niquery = ares_malloc(sizeof(struct nameinfo_query));
+ if (!niquery) {
+ callback(arg, ARES_ENOMEM, 0, NULL, NULL);
+ return;
+ }
+ niquery->callback = callback;
+ niquery->arg = arg;
+ niquery->flags = flags;
+ niquery->timeouts = 0;
+ if (sa->sa_family == AF_INET) {
+ niquery->family = AF_INET;
+ memcpy(&niquery->addr.addr4, addr, sizeof(niquery->addr.addr4));
+ ares_gethostbyaddr(channel, &addr->sin_addr, sizeof(struct in_addr),
+ AF_INET, nameinfo_callback, niquery);
+ } else {
+ niquery->family = AF_INET6;
+ memcpy(&niquery->addr.addr6, addr6, sizeof(niquery->addr.addr6));
+ ares_gethostbyaddr(channel, &addr6->sin6_addr,
+ sizeof(struct ares_in6_addr), AF_INET6,
+ nameinfo_callback, niquery);
}
}
+ }
+}
+
+void ares_getnameinfo(ares_channel_t *channel, const struct sockaddr *sa,
+ ares_socklen_t salen, int flags_int,
+ ares_nameinfo_callback callback, void *arg)
+{
+ if (channel == NULL) {
+ return;
+ }
+
+ ares__channel_lock(channel);
+ ares_getnameinfo_int(channel, sa, salen, flags_int, callback, arg);
+ ares__channel_unlock(channel);
}
static void nameinfo_callback(void *arg, int status, int timeouts,
struct hostent *host)
{
- struct nameinfo_query *niquery = (struct nameinfo_query *) arg;
- char srvbuf[33];
- char *service = NULL;
-
- niquery->timeouts += timeouts;
- if (status == ARES_SUCCESS)
- {
- /* They want a service too */
- if (niquery->flags & ARES_NI_LOOKUPSERVICE)
- {
- if (niquery->family == AF_INET)
- service = lookup_service(niquery->addr.addr4.sin_port,
- niquery->flags, srvbuf, sizeof(srvbuf));
- else
- service = lookup_service(niquery->addr.addr6.sin6_port,
- niquery->flags, srvbuf, sizeof(srvbuf));
- }
- /* NOFQDN means we have to strip off the domain name portion. We do
- this by determining our own domain name, then searching the string
- for this domain name and removing it.
- */
+ struct nameinfo_query *niquery = (struct nameinfo_query *)arg;
+ char srvbuf[33];
+ char *service = NULL;
+
+ niquery->timeouts += (size_t)timeouts;
+ if (status == ARES_SUCCESS) {
+ /* They want a service too */
+ if (niquery->flags & ARES_NI_LOOKUPSERVICE) {
+ if (niquery->family == AF_INET) {
+ service = lookup_service(niquery->addr.addr4.sin_port, niquery->flags,
+ srvbuf, sizeof(srvbuf));
+ } else {
+ service = lookup_service(niquery->addr.addr6.sin6_port, niquery->flags,
+ srvbuf, sizeof(srvbuf));
+ }
+ }
+ /* NOFQDN means we have to strip off the domain name portion. We do
+ this by determining our own domain name, then searching the string
+ for this domain name and removing it.
+ */
#ifdef HAVE_GETHOSTNAME
- if (niquery->flags & ARES_NI_NOFQDN)
- {
- char buf[255];
- char *domain;
- gethostname(buf, 255);
- if ((domain = strchr(buf, '.')) != NULL)
- {
- char *end = ares_striendstr(host->h_name, domain);
- if (end)
- *end = 0;
- }
+ if (niquery->flags & ARES_NI_NOFQDN) {
+ char buf[255];
+ const char *domain;
+ gethostname(buf, 255);
+ if ((domain = strchr(buf, '.')) != NULL) {
+ char *end = ares_striendstr(host->h_name, domain);
+ if (end) {
+ *end = 0;
}
-#endif
- niquery->callback(niquery->arg, ARES_SUCCESS, niquery->timeouts,
- (char *)(host->h_name),
- service);
- ares_free(niquery);
- return;
+ }
}
+#endif
+ niquery->callback(niquery->arg, ARES_SUCCESS, (int)niquery->timeouts,
+ host->h_name, service);
+ ares_free(niquery);
+ return;
+ }
/* We couldn't find the host, but it's OK, we can use the IP */
- else if (status == ARES_ENOTFOUND && !(niquery->flags & ARES_NI_NAMEREQD))
- {
- char ipbuf[IPBUFSIZ];
- if (niquery->family == AF_INET)
- ares_inet_ntop(AF_INET, &niquery->addr.addr4.sin_addr, ipbuf,
- IPBUFSIZ);
- else
- {
- ares_inet_ntop(AF_INET6, &niquery->addr.addr6.sin6_addr, ipbuf,
- IPBUFSIZ);
-#ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID
- append_scopeid(&niquery->addr.addr6, niquery->flags, ipbuf,
- sizeof(ipbuf));
+ else if (status == ARES_ENOTFOUND && !(niquery->flags & ARES_NI_NAMEREQD)) {
+ char ipbuf[IPBUFSIZ];
+ if (niquery->family == AF_INET) {
+ ares_inet_ntop(AF_INET, &niquery->addr.addr4.sin_addr, ipbuf, IPBUFSIZ);
+ } else {
+ ares_inet_ntop(AF_INET6, &niquery->addr.addr6.sin6_addr, ipbuf, IPBUFSIZ);
+#ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID
+ append_scopeid(&niquery->addr.addr6, niquery->flags, ipbuf,
+ sizeof(ipbuf));
#endif
- }
- /* They want a service too */
- if (niquery->flags & ARES_NI_LOOKUPSERVICE)
- {
- if (niquery->family == AF_INET)
- service = lookup_service(niquery->addr.addr4.sin_port,
- niquery->flags, srvbuf, sizeof(srvbuf));
- else
- service = lookup_service(niquery->addr.addr6.sin6_port,
- niquery->flags, srvbuf, sizeof(srvbuf));
- }
- niquery->callback(niquery->arg, ARES_SUCCESS, niquery->timeouts, ipbuf,
- service);
- ares_free(niquery);
- return;
}
- niquery->callback(niquery->arg, status, niquery->timeouts, NULL, NULL);
+ /* They want a service too */
+ if (niquery->flags & ARES_NI_LOOKUPSERVICE) {
+ if (niquery->family == AF_INET) {
+ service = lookup_service(niquery->addr.addr4.sin_port, niquery->flags,
+ srvbuf, sizeof(srvbuf));
+ } else {
+ service = lookup_service(niquery->addr.addr6.sin6_port, niquery->flags,
+ srvbuf, sizeof(srvbuf));
+ }
+ }
+ niquery->callback(niquery->arg, ARES_SUCCESS, (int)niquery->timeouts, ipbuf,
+ service);
+ ares_free(niquery);
+ return;
+ }
+ niquery->callback(niquery->arg, status, (int)niquery->timeouts, NULL, NULL);
ares_free(niquery);
}
-static char *lookup_service(unsigned short port, int flags,
- char *buf, size_t buflen)
+static char *lookup_service(unsigned short port, unsigned int flags, char *buf,
+ size_t buflen)
{
- const char *proto;
+ const char *proto;
struct servent *sep;
#ifdef HAVE_GETSERVBYPORT_R
struct servent se;
#endif
- char tmpbuf[4096];
- char *name;
- size_t name_len;
+ char tmpbuf[4096];
+ const char *name;
+ size_t name_len;
- if (port)
- {
- if (flags & ARES_NI_NUMERICSERV)
- sep = NULL;
- else
- {
- if (flags & ARES_NI_UDP)
- proto = "udp";
- else if (flags & ARES_NI_SCTP)
- proto = "sctp";
- else if (flags & ARES_NI_DCCP)
- proto = "dccp";
- else
- proto = "tcp";
+ if (port) {
+ if (flags & ARES_NI_NUMERICSERV) {
+ sep = NULL;
+ } else {
+ if (flags & ARES_NI_UDP) {
+ proto = "udp";
+ } else if (flags & ARES_NI_SCTP) {
+ proto = "sctp";
+ } else if (flags & ARES_NI_DCCP) {
+ proto = "dccp";
+ } else {
+ proto = "tcp";
+ }
#ifdef HAVE_GETSERVBYPORT_R
- memset(&se, 0, sizeof(se));
- sep = &se;
- memset(tmpbuf, 0, sizeof(tmpbuf));
-#if GETSERVBYPORT_R_ARGS == 6
- if (getservbyport_r(port, proto, &se, (void *)tmpbuf,
- sizeof(tmpbuf), &sep) != 0)
- sep = NULL; /* LCOV_EXCL_LINE: buffer large so this never fails */
-#elif GETSERVBYPORT_R_ARGS == 5
- sep = getservbyport_r(port, proto, &se, (void *)tmpbuf,
- sizeof(tmpbuf));
-#elif GETSERVBYPORT_R_ARGS == 4
- if (getservbyport_r(port, proto, &se, (void *)tmpbuf) != 0)
- sep = NULL;
-#else
- /* Lets just hope the OS uses TLS! */
- sep = getservbyport(port, proto);
-#endif
-#else
- /* Lets just hope the OS uses TLS! */
-#if (defined(NETWARE) && !defined(__NOVELL_LIBC__))
- sep = getservbyport(port, (char*)proto);
+ memset(&se, 0, sizeof(se));
+ sep = &se;
+ memset(tmpbuf, 0, sizeof(tmpbuf));
+# if GETSERVBYPORT_R_ARGS == 6
+ if (getservbyport_r(port, proto, &se, (void *)tmpbuf, sizeof(tmpbuf),
+ &sep) != 0) {
+ sep = NULL; /* LCOV_EXCL_LINE: buffer large so this never fails */
+ }
+# elif GETSERVBYPORT_R_ARGS == 5
+ sep = getservbyport_r(port, proto, &se, (void *)tmpbuf, sizeof(tmpbuf));
+# elif GETSERVBYPORT_R_ARGS == 4
+ if (getservbyport_r(port, proto, &se, (void *)tmpbuf) != 0) {
+ sep = NULL;
+ }
+# else
+ /* Lets just hope the OS uses TLS! */
+ sep = getservbyport(port, proto);
+# endif
#else
- sep = getservbyport(port, proto);
-#endif
+ /* Lets just hope the OS uses TLS! */
+# if (defined(NETWARE) && !defined(__NOVELL_LIBC__))
+ sep = getservbyport(port, (char *)proto);
+# else
+ sep = getservbyport(port, proto);
+# endif
#endif
- }
- if (sep && sep->s_name)
- {
- /* get service name */
- name = sep->s_name;
- }
- else
- {
- /* get port as a string */
- snprintf(tmpbuf, sizeof(tmpbuf), "%u", (unsigned int)ntohs(port));
- name = tmpbuf;
- }
- name_len = strlen(name);
- if (name_len < buflen)
- /* return it if buffer big enough */
- memcpy(buf, name, name_len + 1);
- else
- /* avoid reusing previous one */
- buf[0] = '\0'; /* LCOV_EXCL_LINE: no real service names are too big */
- return buf;
}
+ if (sep && sep->s_name) {
+ /* get service name */
+ name = sep->s_name;
+ } else {
+ /* get port as a string */
+ snprintf(tmpbuf, sizeof(tmpbuf), "%u", (unsigned int)ntohs(port));
+ name = tmpbuf;
+ }
+ name_len = ares_strlen(name);
+ if (name_len < buflen) {
+ /* return it if buffer big enough */
+ memcpy(buf, name, name_len + 1);
+ } else {
+ /* avoid reusing previous one */
+ buf[0] = '\0'; /* LCOV_EXCL_LINE: no real service names are too big */
+ }
+ return buf;
+ }
buf[0] = '\0';
return NULL;
}
-#ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID
-static void append_scopeid(struct sockaddr_in6 *addr6, unsigned int flags,
+#ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID
+static void append_scopeid(const struct sockaddr_in6 *addr6, unsigned int flags,
char *buf, size_t buflen)
{
-#ifdef HAVE_IF_INDEXTONAME
- int is_ll, is_mcll;
-#endif
- char tmpbuf[IF_NAMESIZE + 2];
+# ifdef HAVE_IF_INDEXTONAME
+ int is_ll;
+ int is_mcll;
+# endif
+ char tmpbuf[IF_NAMESIZE + 2];
size_t bufl;
- int is_scope_long = sizeof(addr6->sin6_scope_id) > sizeof(unsigned int);
tmpbuf[0] = '%';
-#ifdef HAVE_IF_INDEXTONAME
- is_ll = IN6_IS_ADDR_LINKLOCAL(&addr6->sin6_addr);
+# ifdef HAVE_IF_INDEXTONAME
+ is_ll = IN6_IS_ADDR_LINKLOCAL(&addr6->sin6_addr);
is_mcll = IN6_IS_ADDR_MC_LINKLOCAL(&addr6->sin6_addr);
- if ((flags & ARES_NI_NUMERICSCOPE) ||
- (!is_ll && !is_mcll))
- {
- if (is_scope_long)
- {
- snprintf(&tmpbuf[1], sizeof(tmpbuf)-1, "%lu", (unsigned long)addr6->sin6_scope_id);
- }
- else
- {
- snprintf(&tmpbuf[1], sizeof(tmpbuf)-1, "%u", (unsigned int)addr6->sin6_scope_id);
- }
- }
- else
- {
- if (if_indextoname(addr6->sin6_scope_id, &tmpbuf[1]) == NULL)
- {
- if (is_scope_long)
- {
- snprintf(&tmpbuf[1], sizeof(tmpbuf)-1, "%lu", (unsigned long)addr6->sin6_scope_id);
- }
- else
- {
- snprintf(&tmpbuf[1], sizeof(tmpbuf)-1, "%u", (unsigned int)addr6->sin6_scope_id);
- }
- }
+ if ((flags & ARES_NI_NUMERICSCOPE) || (!is_ll && !is_mcll)) {
+ snprintf(&tmpbuf[1], sizeof(tmpbuf) - 1, "%lu",
+ (unsigned long)addr6->sin6_scope_id);
+ } else {
+ if (if_indextoname(addr6->sin6_scope_id, &tmpbuf[1]) == NULL) {
+ snprintf(&tmpbuf[1], sizeof(tmpbuf) - 1, "%lu",
+ (unsigned long)addr6->sin6_scope_id);
}
-#else
- if (is_scope_long)
- {
- snprintf(&tmpbuf[1], sizeof(tmpbuf)-1, "%lu", (unsigned long)addr6->sin6_scope_id);
- }
- else
- {
- snprintf(&tmpbuf[1], sizeof(tmpbuf)-1, "%u", (unsigned int)addr6->sin6_scope_id);
- }
- (void) flags;
-#endif
+ }
+# else
+ snprintf(&tmpbuf[1], sizeof(tmpbuf) - 1, "%lu",
+ (unsigned long)addr6->sin6_scope_id);
+ (void)flags;
+# endif
tmpbuf[IF_NAMESIZE + 1] = '\0';
- bufl = strlen(buf);
+ bufl = ares_strlen(buf);
- if(bufl + strlen(tmpbuf) < buflen)
+ if (bufl + ares_strlen(tmpbuf) < buflen) {
/* only append the scopeid string if it fits in the target buffer */
- strcpy(&buf[bufl], tmpbuf);
+ ares_strcpy(&buf[bufl], tmpbuf, buflen - bufl);
+ }
}
#endif
/* Determines if s1 ends with the string in s2 (case-insensitive) */
-STATIC_TESTABLE char *ares_striendstr(const char *s1, const char *s2)
+static char *ares_striendstr(const char *s1, const char *s2)
{
- const char *c1, *c2, *c1_begin;
- int lo1, lo2;
- size_t s1_len = strlen(s1), s2_len = strlen(s2);
+ const char *c1;
+ const char *c2;
+ const char *c1_begin;
+ int lo1;
+ int lo2;
+ size_t s1_len = ares_strlen(s1);
+ size_t s2_len = ares_strlen(s2);
+
+ if (s1 == NULL || s2 == NULL) {
+ return NULL;
+ }
/* If the substr is longer than the full str, it can't match */
- if (s2_len > s1_len)
+ if (s2_len > s1_len) {
return NULL;
+ }
/* Jump to the end of s1 minus the length of s2 */
- c1_begin = s1+s1_len-s2_len;
- c1 = (const char *)c1_begin;
- c2 = s2;
- while (c2 < s2+s2_len)
- {
- lo1 = TOLOWER(*c1);
- lo2 = TOLOWER(*c2);
- if (lo1 != lo2)
- return NULL;
- else
- {
- c1++;
- c2++;
- }
+ c1_begin = s1 + s1_len - s2_len;
+ c1 = c1_begin;
+ c2 = s2;
+ while (c2 < s2 + s2_len) {
+ lo1 = TOLOWER(*c1);
+ lo2 = TOLOWER(*c2);
+ if (lo1 != lo2) {
+ return NULL;
+ } else {
+ c1++;
+ c2++;
}
- return (char *)c1_begin;
+ }
+ /* Cast off const */
+ return (char *)((size_t)c1_begin);
}
-int ares__is_onion_domain(const char *name)
+ares_bool_t ares__is_onion_domain(const char *name)
{
- if (ares_striendstr(name, ".onion"))
- return 1;
+ if (ares_striendstr(name, ".onion")) {
+ return ARES_TRUE;
+ }
- if (ares_striendstr(name, ".onion."))
- return 1;
+ if (ares_striendstr(name, ".onion.")) {
+ return ARES_TRUE;
+ }
- return 0;
+ return ARES_FALSE;
}
diff --git a/contrib/libs/c-ares/src/lib/ares_getsock.c b/contrib/libs/c-ares/src/lib/ares_getsock.c
index 48c9076a66..0353bad639 100644
--- a/contrib/libs/c-ares/src/lib/ares_getsock.c
+++ b/contrib/libs/c-ares/src/lib/ares_getsock.c
@@ -29,37 +29,44 @@
#include "ares.h"
#include "ares_private.h"
-int ares_getsock(ares_channel channel,
- ares_socket_t *socks,
+int ares_getsock(ares_channel_t *channel, ares_socket_t *socks,
int numsocks) /* size of the 'socks' array */
{
- struct server_state *server;
- int i;
- int sockindex=0;
- int bitmap = 0;
- unsigned int setbits = 0xffffffff;
+ ares__slist_node_t *snode;
+ size_t sockindex = 0;
+ unsigned int bitmap = 0;
+ unsigned int setbits = 0xffffffff;
/* Are there any active queries? */
- size_t active_queries = ares__llist_len(channel->all_queries);
+ size_t active_queries;
- for (i = 0; i < channel->nservers; i++) {
- ares__llist_node_t *node;
- server = &channel->servers[i];
+ if (channel == NULL || numsocks <= 0) {
+ return 0;
+ }
- for (node = ares__llist_node_first(server->connections);
- node != NULL;
- node = ares__llist_node_next(node)) {
+ ares__channel_lock(channel);
+
+ active_queries = ares__llist_len(channel->all_queries);
+
+ for (snode = ares__slist_node_first(channel->servers); snode != NULL;
+ snode = ares__slist_node_next(snode)) {
+ struct server_state *server = ares__slist_node_val(snode);
+ ares__llist_node_t *node;
- struct server_connection *conn = ares__llist_node_val(node);
+ for (node = ares__llist_node_first(server->connections); node != NULL;
+ node = ares__llist_node_next(node)) {
+ const struct server_connection *conn = ares__llist_node_val(node);
- if (sockindex >= numsocks || sockindex >= ARES_GETSOCK_MAXNUM)
+ if (sockindex >= (size_t)numsocks || sockindex >= ARES_GETSOCK_MAXNUM) {
break;
+ }
/* We only need to register interest in UDP sockets if we have
* outstanding queries.
*/
- if (!active_queries && !conn->is_tcp)
+ if (!active_queries && !conn->is_tcp) {
continue;
+ }
socks[sockindex] = conn->fd;
@@ -75,5 +82,7 @@ int ares_getsock(ares_channel channel,
sockindex++;
}
}
- return bitmap;
+
+ ares__channel_unlock(channel);
+ return (int)bitmap;
}
diff --git a/contrib/libs/c-ares/src/lib/ares_inet_net_pton.h b/contrib/libs/c-ares/src/lib/ares_inet_net_pton.h
index 179d36d972..0a52855bd8 100644
--- a/contrib/libs/c-ares/src/lib/ares_inet_net_pton.h
+++ b/contrib/libs/c-ares/src/lib/ares_inet_net_pton.h
@@ -27,7 +27,7 @@
#define HEADER_CARES_INET_NET_PTON_H
#ifdef HAVE_INET_NET_PTON
-#define ares_inet_net_pton(w,x,y,z) inet_net_pton(w,x,y,z)
+# define ares_inet_net_pton(w, x, y, z) inet_net_pton(w, x, y, z)
#else
int ares_inet_net_pton(int af, const char *src, void *dst, size_t size);
#endif
diff --git a/contrib/libs/c-ares/src/lib/ares_init.c b/contrib/libs/c-ares/src/lib/ares_init.c
index 25f1d8dfc0..27147fa64d 100644
--- a/contrib/libs/c-ares/src/lib/ares_init.c
+++ b/contrib/libs/c-ares/src/lib/ares_init.c
@@ -28,87 +28,50 @@
#include "ares_setup.h"
#ifdef HAVE_SYS_PARAM_H
-#include <sys/param.h>
+# include <sys/param.h>
#endif
#ifdef HAVE_NETINET_IN_H
-#include <netinet/in.h>
+# include <netinet/in.h>
#endif
#ifdef HAVE_NETDB_H
-#include <netdb.h>
+# include <netdb.h>
#endif
#ifdef HAVE_ARPA_INET_H
-#include <arpa/inet.h>
+# include <arpa/inet.h>
#endif
#include "ares_nameser.h"
#if defined(ANDROID) || defined(__ANDROID__)
-#include <sys/system_properties.h>
-#include "ares_android.h"
+# include <sys/system_properties.h>
+# include "ares_android.h"
/* From the Bionic sources */
-#define DNS_PROP_NAME_PREFIX "net.dns"
-#define MAX_DNS_PROPERTIES 8
+# define DNS_PROP_NAME_PREFIX "net.dns"
+# define MAX_DNS_PROPERTIES 8
#endif
#if defined(CARES_USE_LIBRESOLV)
-#include <resolv.h>
+# include <resolv.h>
#endif
-#if defined(USE_WINSOCK)
+#if defined(USE_WINSOCK) && defined(HAVE_IPHLPAPI_H)
# include <iphlpapi.h>
#endif
#include "ares.h"
#include "ares_inet_net_pton.h"
-#include "ares_nowarn.h"
#include "ares_platform.h"
#include "ares_private.h"
#ifdef WATT32
-#undef WIN32 /* Redefined in MingW/MSVC headers */
-#endif
-
-
-static int init_by_options(ares_channel channel,
- const struct ares_options *options,
- int optmask);
-static int init_by_environment(ares_channel channel);
-static int init_by_resolv_conf(ares_channel channel);
-static int init_by_defaults(ares_channel channel);
-
-#ifndef WATT32
-static int config_nameserver(struct server_state **servers, int *nservers,
- const char *str);
-#endif
-static int set_search(ares_channel channel, const char *str);
-static int set_options(ares_channel channel, const char *str);
-static const char *try_option(const char *p, const char *q, const char *opt);
-
-static int config_sortlist(struct apattern **sortlist, int *nsort,
- const char *str);
-static int sortlist_alloc(struct apattern **sortlist, int *nsort,
- struct apattern *pat);
-static int ip_addr(const char *s, ares_ssize_t len, struct in_addr *addr);
-static void natural_mask(struct apattern *pat);
-#if !defined(WIN32) && !defined(WATT32) && \
- !defined(ANDROID) && !defined(__ANDROID__) && !defined(CARES_USE_LIBRESOLV)
-static int config_domain(ares_channel channel, char *str);
-static int config_lookup(ares_channel channel, const char *str,
- const char *bindch, const char *altbindch,
- const char *filech);
-static char *try_config(char *s, const char *opt, char scc);
+# undef WIN32 /* Redefined in MingW/MSVC headers */
#endif
-#define ARES_CONFIG_CHECK(x) (x->lookups && x->nsort > -1 && \
- x->nservers > -1 && \
- x->ndomains > -1 && \
- x->ndots > -1 && x->timeout > -1 && \
- x->tries > -1)
-int ares_init(ares_channel *channelptr)
+int ares_init(ares_channel_t **channelptr)
{
return ares_init_options(channelptr, NULL, 0);
}
@@ -118,1556 +81,112 @@ static int ares_query_timeout_cmp_cb(const void *arg1, const void *arg2)
const struct query *q1 = arg1;
const struct query *q2 = arg2;
- if (q1->timeout.tv_sec > q2->timeout.tv_sec)
+ if (q1->timeout.tv_sec > q2->timeout.tv_sec) {
return 1;
- if (q1->timeout.tv_sec < q2->timeout.tv_sec)
- return -1;
-
- if (q1->timeout.tv_usec > q2->timeout.tv_usec)
- return 1;
- if (q1->timeout.tv_usec < q2->timeout.tv_usec)
- return -1;
-
- return 0;
-}
-
-int ares_init_options(ares_channel *channelptr, struct ares_options *options,
- int optmask)
-{
- ares_channel channel;
- int status = ARES_SUCCESS;
-
- if (ares_library_initialized() != ARES_SUCCESS)
- return ARES_ENOTINITIALIZED; /* LCOV_EXCL_LINE: n/a on non-WinSock */
-
- channel = ares_malloc(sizeof(*channel));
- if (!channel) {
- *channelptr = NULL;
- return ARES_ENOMEM;
- }
-
- memset(channel, 0, sizeof(*channel));
-
- /* Set everything to distinguished values so we know they haven't
- * been set yet.
- */
- channel->flags = -1;
- channel->timeout = -1;
- channel->maxtimeout = -1;
- channel->jitter = -1;
- channel->jitter_rand_state = -1;
- channel->tries = -1;
- channel->ndots = -1;
- channel->rotate = -1;
- channel->udp_port = -1;
- channel->tcp_port = -1;
- channel->ednspsz = -1;
- channel->socket_send_buffer_size = -1;
- channel->socket_receive_buffer_size = -1;
- channel->nservers = -1;
- channel->ndomains = -1;
- channel->nsort = -1;
-
- /* Generate random key */
-
- channel->rand_state = ares__init_rand_state();
- if (channel->rand_state == NULL) {
- status = ARES_ENOMEM;
- DEBUGF(fprintf(stderr, "Error: init_id_key failed: %s\n",
- ares_strerror(status)));
- goto done;
- }
-
- /* Initialize our lists of queries */
- channel->all_queries = ares__llist_create(NULL);
- if (channel->all_queries == NULL) {
- status = ARES_ENOMEM;
- goto done;
}
-
- channel->queries_by_qid = ares__htable_stvp_create(NULL);
- if (channel->queries_by_qid == NULL) {
- status = ARES_ENOMEM;
- goto done;
- }
-
- channel->queries_by_timeout = ares__slist_create(channel->rand_state,
- ares_query_timeout_cmp_cb,
- NULL);
- if (channel->queries_by_timeout == NULL) {
- status = ARES_ENOMEM;
- goto done;
- }
-
- channel->connnode_by_socket = ares__htable_asvp_create(NULL);
- if (channel->connnode_by_socket == NULL) {
- status = ARES_ENOMEM;
- goto done;
- }
-
- /* Initialize configuration by each of the four sources, from highest
- * precedence to lowest.
- */
-
- status = init_by_options(channel, options, optmask);
- if (status != ARES_SUCCESS) {
- DEBUGF(fprintf(stderr, "Error: init_by_options failed: %s\n",
- ares_strerror(status)));
- /* If we fail to apply user-specified options, fail the whole init process */
- goto done;
- }
- status = init_by_environment(channel);
- if (status != ARES_SUCCESS)
- DEBUGF(fprintf(stderr, "Error: init_by_environment failed: %s\n",
- ares_strerror(status)));
- if (status == ARES_SUCCESS) {
- status = init_by_resolv_conf(channel);
- if (status != ARES_SUCCESS)
- DEBUGF(fprintf(stderr, "Error: init_by_resolv_conf failed: %s\n",
- ares_strerror(status)));
- }
-
- /*
- * No matter what failed or succeeded, seed defaults to provide
- * useful behavior for things that we missed.
- */
- status = init_by_defaults(channel);
- if (status != ARES_SUCCESS)
- DEBUGF(fprintf(stderr, "Error: init_by_defaults failed: %s\n",
- ares_strerror(status)));
-
- /* Trim to one server if ARES_FLAG_PRIMARY is set. */
- if ((channel->flags & ARES_FLAG_PRIMARY) && channel->nservers > 1)
- channel->nservers = 1;
-
- status = ares__init_servers_state(channel);
- if (status != ARES_SUCCESS) {
- goto done;
- }
-
-done:
- if (status != ARES_SUCCESS)
- {
- /* Something failed; clean up memory we may have allocated. */
- if (channel->servers) {
- ares_free(channel->servers);
- }
- if (channel->ndomains != -1)
- ares__strsplit_free(channel->domains, channel->ndomains);
- if (channel->sortlist)
- ares_free(channel->sortlist);
- if(channel->lookups)
- ares_free(channel->lookups);
- if(channel->resolvconf_path)
- ares_free(channel->resolvconf_path);
- if(channel->hosts_path)
- ares_free(channel->hosts_path);
- if (channel->rand_state)
- ares__destroy_rand_state(channel->rand_state);
-
- ares__htable_stvp_destroy(channel->queries_by_qid);
- ares__llist_destroy(channel->all_queries);
- ares__slist_destroy(channel->queries_by_timeout);
- ares__htable_asvp_destroy(channel->connnode_by_socket);
- ares_free(channel);
- return status;
- }
-
- *channelptr = channel;
- return ARES_SUCCESS;
-}
-
-/* ares_dup() duplicates a channel handle with all its options and returns a
- new channel handle */
-int ares_dup(ares_channel *dest, ares_channel src)
-{
- struct ares_options opts;
- struct ares_addr_port_node *servers;
- int non_v4_default_port = 0;
- int i, rc;
- int optmask;
-
- *dest = NULL; /* in case of failure return NULL explicitly */
-
- /* First get the options supported by the old ares_save_options() function,
- which is most of them */
- rc = ares_save_options(src, &opts, &optmask);
- if(rc)
- {
- ares_destroy_options(&opts);
- return rc;
- }
-
- /* Then create the new channel with those options */
- rc = ares_init_options(dest, &opts, optmask);
-
- /* destroy the options copy to not leak any memory */
- ares_destroy_options(&opts);
-
- if(rc)
- return rc;
-
- /* Now clone the options that ares_save_options() doesn't support. */
- (*dest)->sock_create_cb = src->sock_create_cb;
- (*dest)->sock_create_cb_data = src->sock_create_cb_data;
- (*dest)->sock_config_cb = src->sock_config_cb;
- (*dest)->sock_config_cb_data = src->sock_config_cb_data;
- (*dest)->sock_funcs = src->sock_funcs;
- (*dest)->sock_func_cb_data = src->sock_func_cb_data;
-
- strncpy((*dest)->local_dev_name, src->local_dev_name,
- sizeof((*dest)->local_dev_name));
- (*dest)->local_ip4 = src->local_ip4;
- memcpy((*dest)->local_ip6, src->local_ip6, sizeof(src->local_ip6));
-
- /* Full name server cloning required if there is a non-IPv4, or non-default port, nameserver */
- for (i = 0; i < src->nservers; i++)
- {
- if ((src->servers[i].addr.family != AF_INET) ||
- (src->servers[i].addr.udp_port != 0) ||
- (src->servers[i].addr.tcp_port != 0)) {
- non_v4_default_port++;
- break;
- }
- }
- if (non_v4_default_port) {
- rc = ares_get_servers_ports(src, &servers);
- if (rc != ARES_SUCCESS) {
- ares_destroy(*dest);
- *dest = NULL;
- return rc;
- }
- rc = ares_set_servers_ports(*dest, servers);
- ares_free_data(servers);
- if (rc != ARES_SUCCESS) {
- ares_destroy(*dest);
- *dest = NULL;
- return rc;
- }
- }
-
- return ARES_SUCCESS; /* everything went fine */
-}
-
-/* Save options from initialized channel */
-int ares_save_options(ares_channel channel, struct ares_options *options,
- int *optmask)
-{
- int i, j;
- int ipv4_nservers = 0;
-
- /* Zero everything out */
- memset(options, 0, sizeof(struct ares_options));
-
- if (!ARES_CONFIG_CHECK(channel))
- return ARES_ENODATA;
-
- /* Traditionally the optmask wasn't saved in the channel struct so it was
- recreated here. ROTATE is the first option that has no struct field of
- its own in the public config struct */
- (*optmask) = (ARES_OPT_FLAGS|ARES_OPT_TRIES|ARES_OPT_NDOTS|
- ARES_OPT_UDP_PORT|ARES_OPT_TCP_PORT|ARES_OPT_SOCK_STATE_CB|
- ARES_OPT_SERVERS|ARES_OPT_DOMAINS|ARES_OPT_LOOKUPS|
- ARES_OPT_SORTLIST|ARES_OPT_TIMEOUTMS|ARES_OPT_MAXTIMEOUTMS|
- ARES_OPT_JITTER);
- (*optmask) |= (channel->rotate ? ARES_OPT_ROTATE : ARES_OPT_NOROTATE);
-
- if (channel->resolvconf_path)
- (*optmask) |= ARES_OPT_RESOLVCONF;
-
- if (channel->hosts_path)
- (*optmask) |= ARES_OPT_HOSTS_FILE;
-
- /* Copy easy stuff */
- options->flags = channel->flags;
-
- /* We return full millisecond resolution but that's only because we don't
- set the ARES_OPT_TIMEOUT anymore, only the new ARES_OPT_TIMEOUTMS */
- options->timeout = channel->timeout;
- options->maxtimeout = channel->maxtimeout;
- options->jitter = channel->jitter;
- options->jitter_rand_seed = channel->jitter_rand_state;
- options->tries = channel->tries;
- options->ndots = channel->ndots;
- options->udp_port = ntohs(aresx_sitous(channel->udp_port));
- options->tcp_port = ntohs(aresx_sitous(channel->tcp_port));
- options->sock_state_cb = channel->sock_state_cb;
- options->sock_state_cb_data = channel->sock_state_cb_data;
-
- /* Copy IPv4 servers that use the default port */
- if (channel->nservers) {
- for (i = 0; i < channel->nservers; i++)
- {
- if ((channel->servers[i].addr.family == AF_INET) &&
- (channel->servers[i].addr.udp_port == 0) &&
- (channel->servers[i].addr.tcp_port == 0))
- ipv4_nservers++;
- }
- if (ipv4_nservers) {
- options->servers = ares_malloc(ipv4_nservers * sizeof(struct in_addr));
- if (!options->servers)
- return ARES_ENOMEM;
-
- for (i = j = 0; i < channel->nservers; i++)
- {
- if ((channel->servers[i].addr.family == AF_INET) &&
- (channel->servers[i].addr.udp_port == 0) &&
- (channel->servers[i].addr.tcp_port == 0))
- memcpy(&options->servers[j++],
- &channel->servers[i].addr.addrV4,
- sizeof(channel->servers[i].addr.addrV4));
- }
- }
- }
- options->nservers = ipv4_nservers;
-
- /* copy domains */
- if (channel->ndomains) {
- options->domains = ares_malloc(channel->ndomains * sizeof(char *));
- if (!options->domains)
- return ARES_ENOMEM;
-
- for (i = 0; i < channel->ndomains; i++)
- {
- options->ndomains = i;
- options->domains[i] = ares_strdup(channel->domains[i]);
- if (!options->domains[i])
- return ARES_ENOMEM;
- }
- }
- options->ndomains = channel->ndomains;
-
- /* copy lookups */
- if (channel->lookups) {
- options->lookups = ares_strdup(channel->lookups);
- if (!options->lookups && channel->lookups)
- return ARES_ENOMEM;
- }
-
- /* copy sortlist */
- if (channel->nsort) {
- options->sortlist = ares_malloc(channel->nsort * sizeof(struct apattern));
- if (!options->sortlist)
- return ARES_ENOMEM;
- for (i = 0; i < channel->nsort; i++)
- options->sortlist[i] = channel->sortlist[i];
- }
- options->nsort = channel->nsort;
-
- /* copy path for resolv.conf file */
- if (channel->resolvconf_path) {
- options->resolvconf_path = ares_strdup(channel->resolvconf_path);
- if (!options->resolvconf_path)
- return ARES_ENOMEM;
- }
-
- /* copy path for hosts file */
- if (channel->hosts_path) {
- options->hosts_path = ares_strdup(channel->hosts_path);
- if (!options->hosts_path)
- return ARES_ENOMEM;
- }
-
- if (channel->udp_max_queries > 0) {
- (*optmask) |= ARES_OPT_UDP_MAX_QUERIES;
- options->udp_max_queries = channel->udp_max_queries;
+ if (q1->timeout.tv_sec < q2->timeout.tv_sec) {
+ return -1;
}
- return ARES_SUCCESS;
-}
-
-static int init_by_options(ares_channel channel,
- const struct ares_options *options,
- int optmask)
-{
- int i;
-
- /* Easy stuff. */
- if ((optmask & ARES_OPT_FLAGS) && channel->flags == -1)
- channel->flags = options->flags;
- if ((optmask & ARES_OPT_TIMEOUTMS) && channel->timeout == -1)
- channel->timeout = options->timeout;
- else if ((optmask & ARES_OPT_TIMEOUT) && channel->timeout == -1)
- channel->timeout = options->timeout * 1000;
- if ((optmask & ARES_OPT_MAXTIMEOUTMS) && channel->maxtimeout == -1)
- channel->maxtimeout = options->maxtimeout;
- if ((optmask & ARES_OPT_JITTER) && channel->jitter == -1)
- {
- channel->jitter = options->jitter;
- channel->jitter_rand_state = options->jitter_rand_seed;
- }
- if ((optmask & ARES_OPT_TRIES) && channel->tries == -1)
- channel->tries = options->tries;
- if ((optmask & ARES_OPT_NDOTS) && channel->ndots == -1)
- channel->ndots = options->ndots;
- if ((optmask & ARES_OPT_ROTATE) && channel->rotate == -1)
- channel->rotate = 1;
- if ((optmask & ARES_OPT_NOROTATE) && channel->rotate == -1)
- channel->rotate = 0;
- if ((optmask & ARES_OPT_UDP_PORT) && channel->udp_port == -1)
- channel->udp_port = htons(options->udp_port);
- if ((optmask & ARES_OPT_TCP_PORT) && channel->tcp_port == -1)
- channel->tcp_port = htons(options->tcp_port);
- if ((optmask & ARES_OPT_SOCK_STATE_CB) && channel->sock_state_cb == NULL)
- {
- channel->sock_state_cb = options->sock_state_cb;
- channel->sock_state_cb_data = options->sock_state_cb_data;
- }
- if ((optmask & ARES_OPT_SOCK_SNDBUF)
- && channel->socket_send_buffer_size == -1)
- channel->socket_send_buffer_size = options->socket_send_buffer_size;
- if ((optmask & ARES_OPT_SOCK_RCVBUF)
- && channel->socket_receive_buffer_size == -1)
- channel->socket_receive_buffer_size = options->socket_receive_buffer_size;
-
- if ((optmask & ARES_OPT_EDNSPSZ) && channel->ednspsz == -1)
- channel->ednspsz = options->ednspsz;
-
- /* Copy the IPv4 servers, if given. */
- if ((optmask & ARES_OPT_SERVERS) && channel->nservers == -1)
- {
- /* Avoid zero size allocations at any cost */
- if (options->nservers > 0)
- {
- channel->servers =
- ares_malloc(options->nservers * sizeof(*channel->servers));
- if (!channel->servers)
- return ARES_ENOMEM;
- memset(channel->servers, 0, options->nservers * sizeof(*channel->servers));
- for (i = 0; i < options->nservers; i++)
- {
- channel->servers[i].addr.family = AF_INET;
- channel->servers[i].addr.udp_port = 0;
- channel->servers[i].addr.tcp_port = 0;
- memcpy(&channel->servers[i].addr.addrV4,
- &options->servers[i],
- sizeof(channel->servers[i].addr.addrV4));
- }
- }
- channel->nservers = options->nservers;
- }
-
- /* Copy the domains, if given. Keep channel->ndomains consistent so
- * we can clean up in case of error.
- */
- if ((optmask & ARES_OPT_DOMAINS) && channel->ndomains == -1)
- {
- /* Avoid zero size allocations at any cost */
- if (options->ndomains > 0)
- {
- channel->domains = ares_malloc(options->ndomains * sizeof(char *));
- if (!channel->domains)
- return ARES_ENOMEM;
- for (i = 0; i < options->ndomains; i++)
- {
- channel->ndomains = i;
- channel->domains[i] = ares_strdup(options->domains[i]);
- if (!channel->domains[i])
- return ARES_ENOMEM;
- }
- }
- channel->ndomains = options->ndomains;
- }
-
- /* Set lookups, if given. */
- if ((optmask & ARES_OPT_LOOKUPS) && !channel->lookups)
- {
- channel->lookups = ares_strdup(options->lookups);
- if (!channel->lookups)
- return ARES_ENOMEM;
- }
-
- /* copy sortlist */
- if ((optmask & ARES_OPT_SORTLIST) && (channel->nsort == -1)) {
- if (options->nsort > 0) {
- channel->sortlist = ares_malloc(options->nsort * sizeof(struct apattern));
- if (!channel->sortlist)
- return ARES_ENOMEM;
- for (i = 0; i < options->nsort; i++)
- channel->sortlist[i] = options->sortlist[i];
- }
- channel->nsort = options->nsort;
+ if (q1->timeout.tv_usec > q2->timeout.tv_usec) {
+ return 1;
}
-
- /* Set path for resolv.conf file, if given. */
- if ((optmask & ARES_OPT_RESOLVCONF) && !channel->resolvconf_path)
- {
- channel->resolvconf_path = ares_strdup(options->resolvconf_path);
- if (!channel->resolvconf_path && options->resolvconf_path)
- return ARES_ENOMEM;
- }
-
- /* Set path for hosts file, if given. */
- if ((optmask & ARES_OPT_HOSTS_FILE) && !channel->hosts_path)
- {
- channel->hosts_path = ares_strdup(options->hosts_path);
- if (!channel->hosts_path && options->hosts_path)
- return ARES_ENOMEM;
- }
-
- if (optmask & ARES_OPT_UDP_MAX_QUERIES)
- channel->udp_max_queries = options->udp_max_queries;
-
- channel->optmask = optmask;
-
- return ARES_SUCCESS;
-}
-
-static int init_by_environment(ares_channel channel)
-{
- const char *localdomain, *res_options;
- int status;
-
- localdomain = getenv("LOCALDOMAIN");
- if (localdomain && channel->ndomains == -1)
- {
- status = set_search(channel, localdomain);
- if (status != ARES_SUCCESS)
- return status;
- }
-
- res_options = getenv("RES_OPTIONS");
- if (res_options)
- {
- status = set_options(channel, res_options);
- if (status != ARES_SUCCESS)
- return status; /* LCOV_EXCL_LINE: set_options() never fails */
- }
-
- return ARES_SUCCESS;
-}
-
-#ifdef WIN32
-/*
- * get_REG_SZ()
- *
- * Given a 'hKey' handle to an open registry key and a 'leafKeyName' pointer
- * to the name of the registry leaf key to be queried, fetch it's string
- * value and return a pointer in *outptr to a newly allocated memory area
- * holding it as a null-terminated string.
- *
- * Returns 0 and nullifies *outptr upon inability to return a string value.
- *
- * Returns 1 and sets *outptr when returning a dynamically allocated string.
- *
- * Supported on Windows NT 3.5 and newer.
- */
-static int get_REG_SZ(HKEY hKey, const char *leafKeyName, char **outptr)
-{
- DWORD size = 0;
- int res;
-
- *outptr = NULL;
-
- /* Find out size of string stored in registry */
- res = RegQueryValueExA(hKey, leafKeyName, 0, NULL, NULL, &size);
- if ((res != ERROR_SUCCESS && res != ERROR_MORE_DATA) || !size)
- return 0;
-
- /* Allocate buffer of indicated size plus one given that string
- might have been stored without null termination */
- *outptr = ares_malloc(size+1);
- if (!*outptr)
- return 0;
-
- /* Get the value for real */
- res = RegQueryValueExA(hKey, leafKeyName, 0, NULL,
- (unsigned char *)*outptr, &size);
- if ((res != ERROR_SUCCESS) || (size == 1))
- {
- ares_free(*outptr);
- *outptr = NULL;
- return 0;
+ if (q1->timeout.tv_usec < q2->timeout.tv_usec) {
+ return -1;
}
- /* Null terminate buffer allways */
- *(*outptr + size) = '\0';
-
- return 1;
-}
-
-static void commanjoin(char** dst, const char* const src, const size_t len)
-{
- char *newbuf;
- size_t newsize;
-
- /* 1 for terminating 0 and 2 for , and terminating 0 */
- newsize = len + (*dst ? (strlen(*dst) + 2) : 1);
- newbuf = ares_realloc(*dst, newsize);
- if (!newbuf)
- return;
- if (*dst == NULL)
- *newbuf = '\0';
- *dst = newbuf;
- if (strlen(*dst) != 0)
- strcat(*dst, ",");
- strncat(*dst, src, len);
-}
-
-/*
- * commajoin()
- *
- * RTF code.
- */
-static void commajoin(char **dst, const char *src)
-{
- commanjoin(dst, src, strlen(src));
-}
-
-
-/* A structure to hold the string form of IPv4 and IPv6 addresses so we can
- * sort them by a metric.
- */
-typedef struct
-{
- /* The metric we sort them by. */
- ULONG metric;
-
- /* Original index of the item, used as a secondary sort parameter to make
- * qsort() stable if the metrics are equal */
- size_t orig_idx;
-
- /* Room enough for the string form of any IPv4 or IPv6 address that
- * ares_inet_ntop() will create. Based on the existing c-ares practice.
- */
- char text[INET6_ADDRSTRLEN + 8]; /* [%s]:NNNNN */
-} Address;
-
-/* Sort Address values \a left and \a right by metric, returning the usual
- * indicators for qsort().
- */
-static int compareAddresses(const void *arg1,
- const void *arg2)
-{
- const Address * const left = arg1;
- const Address * const right = arg2;
- /* Lower metric the more preferred */
- if(left->metric < right->metric) return -1;
- if(left->metric > right->metric) return 1;
- /* If metrics are equal, lower original index more preferred */
- if(left->orig_idx < right->orig_idx) return -1;
- if(left->orig_idx > right->orig_idx) return 1;
return 0;
}
-/* There can be multiple routes to "the Internet". And there can be different
- * DNS servers associated with each of the interfaces that offer those routes.
- * We have to assume that any DNS server can serve any request. But, some DNS
- * servers may only respond if requested over their associated interface. But
- * we also want to use "the preferred route to the Internet" whenever possible
- * (and not use DNS servers on a non-preferred route even by forcing request
- * to go out on the associated non-preferred interface). i.e. We want to use
- * the DNS servers associated with the same interface that we would use to
- * make a general request to anything else.
- *
- * But, Windows won't sort the DNS servers by the metrics associated with the
- * routes and interfaces _even_ though it obviously sends IP packets based on
- * those same routes and metrics. So, we must do it ourselves.
- *
- * So, we sort the DNS servers by the same metric values used to determine how
- * an outgoing IP packet will go, thus effectively using the DNS servers
- * associated with the interface that the DNS requests themselves will
- * travel. This gives us optimal routing and avoids issues where DNS servers
- * won't respond to requests that don't arrive via some specific subnetwork
- * (and thus some specific interface).
- *
- * This function computes the metric we use to sort. On the interface
- * identified by \a luid, it determines the best route to \a dest and combines
- * that route's metric with \a interfaceMetric to compute a metric for the
- * destination address on that interface. This metric can be used as a weight
- * to sort the DNS server addresses associated with each interface (lower is
- * better).
- *
- * Note that by restricting the route search to the specific interface with
- * which the DNS servers are associated, this function asks the question "What
- * is the metric for sending IP packets to this DNS server?" which allows us
- * to sort the DNS servers correctly.
- */
-static ULONG getBestRouteMetric(IF_LUID * const luid, /* Can't be const :( */
- const SOCKADDR_INET * const dest,
- const ULONG interfaceMetric)
+static int server_sort_cb(const void *data1, const void *data2)
{
- /* On this interface, get the best route to that destination. */
-#if defined(__WATCOMC__)
- /* OpenWatcom's builtin Windows SDK does not have a definition for
- * MIB_IPFORWARD_ROW2, and also does not allow the usage of SOCKADDR_INET
- * as a variable. Let's work around this by returning the worst possible
- * metric, but only when using the OpenWatcom compiler.
- * It may be worth investigating using a different version of the Windows
- * SDK with OpenWatcom in the future, though this may be fixed in OpenWatcom
- * 2.0.
- */
- return (ULONG)-1;
-#else
- MIB_IPFORWARD_ROW2 row;
- SOCKADDR_INET ignored;
- if(GetBestRoute2(/* The interface to use. The index is ignored since we are
- * passing a LUID.
- */
- luid, 0,
- /* No specific source address. */
- NULL,
- /* Our destination address. */
- dest,
- /* No options. */
- 0,
- /* The route row. */
- &row,
- /* The best source address, which we don't need. */
- &ignored) != NO_ERROR
- /* If the metric is "unused" (-1) or too large for us to add the two
- * metrics, use the worst possible, thus sorting this last.
- */
- || row.Metric == (ULONG)-1
- || row.Metric > ((ULONG)-1) - interfaceMetric) {
- /* Return the worst possible metric. */
- return (ULONG)-1;
- }
+ const struct server_state *s1 = data1;
+ const struct server_state *s2 = data2;
- /* Return the metric value from that row, plus the interface metric.
- *
- * See
- * http://msdn.microsoft.com/en-us/library/windows/desktop/aa814494(v=vs.85).aspx
- * which describes the combination as a "sum".
- */
- return row.Metric + interfaceMetric;
-#endif /* __WATCOMC__ */
-}
-
-/*
- * get_DNS_Windows()
- *
- * Locates DNS info using GetAdaptersAddresses() function from the Internet
- * Protocol Helper (IP Helper) API. When located, this returns a pointer
- * in *outptr to a newly allocated memory area holding a null-terminated
- * string with a space or comma seperated list of DNS IP addresses.
- *
- * Returns 0 and nullifies *outptr upon inability to return DNSes string.
- *
- * Returns 1 and sets *outptr when returning a dynamically allocated string.
- *
- * Implementation supports Windows XP and newer.
- */
-#define IPAA_INITIAL_BUF_SZ 15 * 1024
-#define IPAA_MAX_TRIES 3
-static int get_DNS_Windows(char **outptr)
-{
- IP_ADAPTER_DNS_SERVER_ADDRESS *ipaDNSAddr;
- IP_ADAPTER_ADDRESSES *ipaa, *newipaa, *ipaaEntry;
- ULONG ReqBufsz = IPAA_INITIAL_BUF_SZ;
- ULONG Bufsz = IPAA_INITIAL_BUF_SZ;
- ULONG AddrFlags = 0;
- int trying = IPAA_MAX_TRIES;
- int res;
-
- /* The capacity of addresses, in elements. */
- size_t addressesSize;
- /* The number of elements in addresses. */
- size_t addressesIndex = 0;
- /* The addresses we will sort. */
- Address *addresses;
-
- union {
- struct sockaddr *sa;
- struct sockaddr_in *sa4;
- struct sockaddr_in6 *sa6;
- } namesrvr;
-
- *outptr = NULL;
-
- ipaa = ares_malloc(Bufsz);
- if (!ipaa)
- return 0;
-
- /* Start with enough room for a few DNS server addresses and we'll grow it
- * as we encounter more.
- */
- addressesSize = 4;
- addresses = (Address*)ares_malloc(sizeof(Address) * addressesSize);
- if(addresses == NULL) {
- /* We need room for at least some addresses to function. */
- ares_free(ipaa);
- return 0;
- }
-
- /* Usually this call suceeds with initial buffer size */
- res = GetAdaptersAddresses(AF_UNSPEC, AddrFlags, NULL, ipaa, &ReqBufsz);
- if ((res != ERROR_BUFFER_OVERFLOW) && (res != ERROR_SUCCESS))
- goto done;
-
- while ((res == ERROR_BUFFER_OVERFLOW) && (--trying))
- {
- if (Bufsz < ReqBufsz)
- {
- newipaa = ares_realloc(ipaa, ReqBufsz);
- if (!newipaa)
- goto done;
- Bufsz = ReqBufsz;
- ipaa = newipaa;
- }
- res = GetAdaptersAddresses(AF_UNSPEC, AddrFlags, NULL, ipaa, &ReqBufsz);
- if (res == ERROR_SUCCESS)
- break;
+ if (s1->consec_failures < s2->consec_failures) {
+ return -1;
}
- if (res != ERROR_SUCCESS)
- goto done;
-
- for (ipaaEntry = ipaa; ipaaEntry; ipaaEntry = ipaaEntry->Next)
- {
- if(ipaaEntry->OperStatus != IfOperStatusUp)
- continue;
-
- /* For each interface, find any associated DNS servers as IPv4 or IPv6
- * addresses. For each found address, find the best route to that DNS
- * server address _on_ _that_ _interface_ (at this moment in time) and
- * compute the resulting total metric, just as Windows routing will do.
- * Then, sort all the addresses found by the metric.
- */
- for (ipaDNSAddr = ipaaEntry->FirstDnsServerAddress;
- ipaDNSAddr;
- ipaDNSAddr = ipaDNSAddr->Next)
- {
- char ipaddr[INET6_ADDRSTRLEN] = "";
- namesrvr.sa = ipaDNSAddr->Address.lpSockaddr;
-
- if (namesrvr.sa->sa_family == AF_INET)
- {
- if ((namesrvr.sa4->sin_addr.S_un.S_addr == INADDR_ANY) ||
- (namesrvr.sa4->sin_addr.S_un.S_addr == INADDR_NONE))
- continue;
-
- /* Allocate room for another address, if necessary, else skip. */
- if(addressesIndex == addressesSize) {
- const size_t newSize = addressesSize + 4;
- Address * const newMem =
- (Address*)ares_realloc(addresses, sizeof(Address) * newSize);
- if(newMem == NULL) {
- continue;
- }
- addresses = newMem;
- addressesSize = newSize;
- }
-
- addresses[addressesIndex].metric =
- getBestRouteMetric(&ipaaEntry->Luid,
- (SOCKADDR_INET*)(namesrvr.sa),
- ipaaEntry->Ipv4Metric);
-
- /* Record insertion index to make qsort stable */
- addresses[addressesIndex].orig_idx = addressesIndex;
-
- if (!ares_inet_ntop(AF_INET, &namesrvr.sa4->sin_addr,
- ipaddr, sizeof(ipaddr))) {
- continue;
- }
- snprintf(addresses[addressesIndex].text,
- sizeof(addresses[addressesIndex].text),
- "[%s]:%u",
- ipaddr,
- ntohs(namesrvr.sa4->sin_port));
- ++addressesIndex;
- }
- else if (namesrvr.sa->sa_family == AF_INET6)
- {
- if (memcmp(&namesrvr.sa6->sin6_addr, &ares_in6addr_any,
- sizeof(namesrvr.sa6->sin6_addr)) == 0)
- continue;
-
- /* Allocate room for another address, if necessary, else skip. */
- if(addressesIndex == addressesSize) {
- const size_t newSize = addressesSize + 4;
- Address * const newMem =
- (Address*)ares_realloc(addresses, sizeof(Address) * newSize);
- if(newMem == NULL) {
- continue;
- }
- addresses = newMem;
- addressesSize = newSize;
- }
-
- addresses[addressesIndex].metric =
- getBestRouteMetric(&ipaaEntry->Luid,
- (SOCKADDR_INET*)(namesrvr.sa),
- ipaaEntry->Ipv6Metric);
-
- /* Record insertion index to make qsort stable */
- addresses[addressesIndex].orig_idx = addressesIndex;
-
- if (!ares_inet_ntop(AF_INET6, &namesrvr.sa6->sin6_addr,
- ipaddr, sizeof(ipaddr))) {
- continue;
- }
- snprintf(addresses[addressesIndex].text,
- sizeof(addresses[addressesIndex].text),
- "[%s]:%u",
- ipaddr,
- ntohs(namesrvr.sa6->sin6_port));
- ++addressesIndex;
- }
- else {
- /* Skip non-IPv4/IPv6 addresses completely. */
- continue;
- }
- }
+ if (s1->consec_failures > s2->consec_failures) {
+ return 1;
}
-
- /* Sort all of the textual addresses by their metric (and original index if
- * metrics are equal). */
- qsort(addresses, addressesIndex, sizeof(*addresses), compareAddresses);
-
- /* Join them all into a single string, removing duplicates. */
- {
- size_t i;
- for(i = 0; i < addressesIndex; ++i) {
- size_t j;
- /* Look for this address text appearing previously in the results. */
- for(j = 0; j < i; ++j) {
- if(strcmp(addresses[j].text, addresses[i].text) == 0) {
- break;
- }
- }
- /* Iff we didn't emit this address already, emit it now. */
- if(j == i) {
- /* Add that to outptr (if we can). */
- commajoin(outptr, addresses[i].text);
- }
- }
+ if (s1->idx < s2->idx) {
+ return -1;
}
-
-done:
- ares_free(addresses);
-
- if (ipaa)
- ares_free(ipaa);
-
- if (!*outptr) {
- return 0;
+ if (s1->idx > s2->idx) {
+ return 1;
}
-
- return 1;
+ return 0;
}
-/*
- * get_SuffixList_Windows()
- *
- * Reads the "DNS Suffix Search List" from registry and writes the list items
- * whitespace separated to outptr. If the Search List is empty, the
- * "Primary Dns Suffix" is written to outptr.
- *
- * Returns 0 and nullifies *outptr upon inability to return the suffix list.
- *
- * Returns 1 and sets *outptr when returning a dynamically allocated string.
- *
- * Implementation supports Windows Server 2003 and newer
- */
-static int get_SuffixList_Windows(char **outptr)
+static void server_destroy_cb(void *data)
{
- HKEY hKey, hKeyEnum;
- char keyName[256];
- DWORD keyNameBuffSize;
- DWORD keyIdx = 0;
- char *p = NULL;
-
- *outptr = NULL;
-
- if (ares__getplatform() != WIN_NT)
- return 0;
-
- /* 1. Global DNS Suffix Search List */
- if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0,
- KEY_READ, &hKey) == ERROR_SUCCESS)
- {
- get_REG_SZ(hKey, SEARCHLIST_KEY, outptr);
- if (get_REG_SZ(hKey, DOMAIN_KEY, &p))
- {
- commajoin(outptr, p);
- ares_free(p);
- p = NULL;
- }
- RegCloseKey(hKey);
- }
-
- if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_NT_DNSCLIENT, 0,
- KEY_READ, &hKey) == ERROR_SUCCESS)
- {
- if (get_REG_SZ(hKey, SEARCHLIST_KEY, &p))
- {
- commajoin(outptr, p);
- ares_free(p);
- p = NULL;
- }
- RegCloseKey(hKey);
- }
-
- /* 2. Connection Specific Search List composed of:
- * a. Primary DNS Suffix */
- if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_DNSCLIENT, 0,
- KEY_READ, &hKey) == ERROR_SUCCESS)
- {
- if (get_REG_SZ(hKey, PRIMARYDNSSUFFIX_KEY, &p))
- {
- commajoin(outptr, p);
- ares_free(p);
- p = NULL;
- }
- RegCloseKey(hKey);
- }
-
- /* b. Interface SearchList, Domain, DhcpDomain */
- if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY "\\" INTERFACES_KEY, 0,
- KEY_READ, &hKey) == ERROR_SUCCESS)
- {
- for(;;)
- {
- keyNameBuffSize = sizeof(keyName);
- if (RegEnumKeyExA(hKey, keyIdx++, keyName, &keyNameBuffSize,
- 0, NULL, NULL, NULL)
- != ERROR_SUCCESS)
- break;
- if (RegOpenKeyExA(hKey, keyName, 0, KEY_QUERY_VALUE, &hKeyEnum)
- != ERROR_SUCCESS)
- continue;
- /* p can be comma separated (SearchList) */
- if (get_REG_SZ(hKeyEnum, SEARCHLIST_KEY, &p))
- {
- commajoin(outptr, p);
- ares_free(p);
- p = NULL;
- }
- if (get_REG_SZ(hKeyEnum, DOMAIN_KEY, &p))
- {
- commajoin(outptr, p);
- ares_free(p);
- p = NULL;
- }
- if (get_REG_SZ(hKeyEnum, DHCPDOMAIN_KEY, &p))
- {
- commajoin(outptr, p);
- ares_free(p);
- p = NULL;
- }
- RegCloseKey(hKeyEnum);
- }
- RegCloseKey(hKey);
+ if (data == NULL) {
+ return;
}
-
- return *outptr != NULL;
+ ares__destroy_server(data);
}
-#endif
-
-static int init_by_resolv_conf(ares_channel channel)
+static ares_status_t init_by_defaults(ares_channel_t *channel)
{
-#if !defined(ANDROID) && !defined(__ANDROID__) && !defined(WATT32) && \
- !defined(CARES_USE_LIBRESOLV)
- char *line = NULL;
+ char *hostname = NULL;
+ ares_status_t rc = ARES_SUCCESS;
+#ifdef HAVE_GETHOSTNAME
+ const char *dot;
#endif
- int status = -1, nservers = 0, nsort = 0;
- struct server_state *servers = NULL;
- struct apattern *sortlist = NULL;
-
-#ifdef WIN32
-
- if (channel->nservers > -1) /* don't override ARES_OPT_SERVER */
- return ARES_SUCCESS;
-
- if (get_DNS_Windows(&line))
- {
- status = config_nameserver(&servers, &nservers, line);
- ares_free(line);
- }
-
- if (channel->ndomains == -1 && get_SuffixList_Windows(&line))
- {
- status = set_search(channel, line);
- ares_free(line);
- }
+ struct ares_addr addr;
+ ares__llist_t *sconfig = NULL;
- if (status == ARES_SUCCESS)
- status = ARES_EOF;
- else
- /* Catch the case when all the above checks fail (which happens when there
- is no network card or the cable is unplugged) */
- status = ARES_EFILE;
-#elif defined(__MVS__)
-
- struct __res_state *res = 0;
- int count4, count6;
- __STATEEXTIPV6 *v6;
- struct server_state *pserver;
- if (0 == res) {
- int rc = res_init();
- while (rc == -1 && h_errno == TRY_AGAIN) {
- rc = res_init();
- }
- if (rc == -1) {
- return ARES_ENOMEM;
- }
- res = __res();
- }
-
- v6 = res->__res_extIPv6;
- count4 = res->nscount;
- if (v6) {
- count6 = v6->__stat_nscount;
- } else {
- count6 = 0;
- }
-
- nservers = count4 + count6;
- servers = ares_malloc(nservers * sizeof(*servers));
- if (!servers)
- return ARES_ENOMEM;
-
- memset(servers, 0, nservers * sizeof(*servers));
-
- pserver = servers;
- for (int i = 0; i < count4; ++i, ++pserver) {
- struct sockaddr_in *addr_in = &(res->nsaddr_list[i]);
- pserver->addr.addrV4.s_addr = addr_in->sin_addr.s_addr;
- pserver->addr.family = AF_INET;
- pserver->addr.udp_port = addr_in->sin_port;
- pserver->addr.tcp_port = addr_in->sin_port;
- }
-
- for (int j = 0; j < count6; ++j, ++pserver) {
- struct sockaddr_in6 *addr_in = &(v6->__stat_nsaddr_list[j]);
- memcpy(&(pserver->addr.addr.addr6), &(addr_in->sin6_addr),
- sizeof(addr_in->sin6_addr));
- pserver->addr.family = AF_INET6;
- pserver->addr.udp_port = addr_in->sin6_port;
- pserver->addr.tcp_port = addr_in->sin6_port;
+ /* Enable EDNS by default */
+ if (!(channel->optmask & ARES_OPT_FLAGS)) {
+ channel->flags = ARES_FLAG_EDNS;
}
-
- status = ARES_EOF;
-
-#elif defined(__riscos__)
-
- /* Under RISC OS, name servers are listed in the
- system variable Inet$Resolvers, space separated. */
-
- line = getenv("Inet$Resolvers");
- status = ARES_EOF;
- if (line) {
- char *resolvers = ares_strdup(line), *pos, *space;
-
- if (!resolvers)
- return ARES_ENOMEM;
-
- pos = resolvers;
- do {
- space = strchr(pos, ' ');
- if (space)
- *space = '\0';
- status = config_nameserver(&servers, &nservers, pos);
- if (status != ARES_SUCCESS)
- break;
- pos = space + 1;
- } while (space);
-
- if (status == ARES_SUCCESS)
- status = ARES_EOF;
-
- ares_free(resolvers);
- }
-
-#elif defined(WATT32)
- int i;
-
- sock_init();
- for (i = 0; def_nameservers[i]; i++)
- ;
- if (i == 0)
- return ARES_SUCCESS; /* use localhost DNS server */
-
- nservers = i;
- servers = ares_malloc(sizeof(*servers));
- if (!servers)
- return ARES_ENOMEM;
- memset(servers, 0, sizeof(*servers));
-
- for (i = 0; def_nameservers[i]; i++)
- {
- servers[i].addr.addrV4.s_addr = htonl(def_nameservers[i]);
- servers[i].addr.family = AF_INET;
- servers[i].addr.udp_port = 0;
- servers[i].addr.tcp_port = 0;
- }
- status = ARES_EOF;
-
-#elif defined(ANDROID) || defined(__ANDROID__)
- unsigned int i;
- char **dns_servers;
- char *domains;
- size_t num_servers;
-
- /* Use the Android connectivity manager to get a list
- * of DNS servers. As of Android 8 (Oreo) net.dns#
- * system properties are no longer available. Google claims this
- * improves privacy. Apps now need the ACCESS_NETWORK_STATE
- * permission and must use the ConnectivityManager which
- * is Java only. */
- dns_servers = ares_get_android_server_list(MAX_DNS_PROPERTIES, &num_servers);
- if (dns_servers != NULL)
- {
- for (i = 0; i < num_servers; i++)
- {
- status = config_nameserver(&servers, &nservers, dns_servers[i]);
- if (status != ARES_SUCCESS)
- break;
- status = ARES_EOF;
- }
- for (i = 0; i < num_servers; i++)
- {
- ares_free(dns_servers[i]);
- }
- ares_free(dns_servers);
- }
- if (channel->ndomains == -1)
- {
- domains = ares_get_android_search_domains_list();
- set_search(channel, domains);
- ares_free(domains);
- }
-
-# ifdef HAVE___SYSTEM_PROPERTY_GET
- /* Old way using the system property still in place as
- * a fallback. Older android versions can still use this.
- * it's possible for older apps not not have added the new
- * permission and we want to try to avoid breaking those.
- *
- * We'll only run this if we don't have any dns servers
- * because this will get the same ones (if it works). */
- if (status != ARES_EOF) {
- char propname[PROP_NAME_MAX];
- char propvalue[PROP_VALUE_MAX]="";
- for (i = 1; i <= MAX_DNS_PROPERTIES; i++) {
- snprintf(propname, sizeof(propname), "%s%u", DNS_PROP_NAME_PREFIX, i);
- if (__system_property_get(propname, propvalue) < 1) {
- status = ARES_EOF;
- break;
- }
-
- status = config_nameserver(&servers, &nservers, propvalue);
- if (status != ARES_SUCCESS)
- break;
- status = ARES_EOF;
- }
+ if (channel->ednspsz == 0) {
+ channel->ednspsz = EDNSPACKETSZ;
}
-# endif /* HAVE___SYSTEM_PROPERTY_GET */
-#elif defined(CARES_USE_LIBRESOLV)
- struct __res_state res;
- int result;
- memset(&res, 0, sizeof(res));
- result = res_ninit(&res);
- if (result == 0 && (res.options & RES_INIT)) {
- status = ARES_EOF;
-
- if (channel->nservers == -1) {
- union res_sockaddr_union addr[MAXNS];
- int nscount = res_getservers(&res, addr, MAXNS);
- int i;
- for (i = 0; i < nscount; ++i) {
- char ipaddr[INET6_ADDRSTRLEN] = "";
- char ipaddr_port[INET6_ADDRSTRLEN + 8]; /* [%s]:NNNNN */
- unsigned short port = 0;
- int config_status;
- sa_family_t family = addr[i].sin.sin_family;
- if (family == AF_INET) {
- ares_inet_ntop(family, &addr[i].sin.sin_addr, ipaddr, sizeof(ipaddr));
- port = ntohs(addr[i].sin.sin_port);
- } else if (family == AF_INET6) {
- ares_inet_ntop(family, &addr[i].sin6.sin6_addr, ipaddr, sizeof(ipaddr));
- port = ntohs(addr[i].sin6.sin6_port);
- } else {
- continue;
- }
-
- if (port) {
- snprintf(ipaddr_port, sizeof(ipaddr_port), "[%s]:%u", ipaddr, port);
- } else {
- snprintf(ipaddr_port, sizeof(ipaddr_port), "%s", ipaddr);
- }
-
- config_status = config_nameserver(&servers, &nservers, ipaddr_port);
- if (config_status != ARES_SUCCESS) {
- status = config_status;
- break;
- }
- }
- }
- if (channel->ndomains == -1) {
- int entries = 0;
- while ((entries < MAXDNSRCH) && res.dnsrch[entries])
- entries++;
- if(entries) {
- channel->domains = ares_malloc(entries * sizeof(char *));
- if (!channel->domains) {
- status = ARES_ENOMEM;
- } else {
- int i;
- channel->ndomains = entries;
- for (i = 0; i < channel->ndomains; ++i) {
- channel->domains[i] = ares_strdup(res.dnsrch[i]);
- if (!channel->domains[i])
- status = ARES_ENOMEM;
- }
- }
- }
- }
- if (channel->ndots == -1)
- channel->ndots = res.ndots;
- if (channel->tries == -1)
- channel->tries = res.retry;
- if (channel->rotate == -1)
- channel->rotate = res.options & RES_ROTATE;
- if (channel->timeout == -1) {
- channel->timeout = res.retrans * 1000;
-#ifdef __APPLE__
- channel->timeout /= (res.retry + 1) * (res.nscount > 0 ? res.nscount : 1);
-#endif
- }
- res_ndestroy(&res);
+ if (channel->timeout == 0) {
+ channel->timeout = DEFAULT_TIMEOUT;
}
-#else
- {
- char *p;
- FILE *fp;
- size_t linesize;
- int error;
- int update_domains;
- const char *resolvconf_path;
-
- /* Don't read resolv.conf and friends if we don't have to */
- if (ARES_CONFIG_CHECK(channel))
- return ARES_SUCCESS;
-
- /* Only update search domains if they're not already specified */
- update_domains = (channel->ndomains == -1);
-
- /* Support path for resolvconf filename set by ares_init_options */
- if(channel->resolvconf_path) {
- resolvconf_path = channel->resolvconf_path;
- } else {
- resolvconf_path = PATH_RESOLV_CONF;
- }
-
- fp = fopen(resolvconf_path, "r");
- if (fp) {
- while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS)
- {
- if ((p = try_config(line, "domain", ';')) && update_domains)
- status = config_domain(channel, p);
- else if ((p = try_config(line, "lookup", ';')) && !channel->lookups)
- status = config_lookup(channel, p, "bind", NULL, "file");
- else if ((p = try_config(line, "search", ';')) && update_domains)
- status = set_search(channel, p);
- else if ((p = try_config(line, "nameserver", ';')) &&
- channel->nservers == -1)
- status = config_nameserver(&servers, &nservers, p);
- else if ((p = try_config(line, "sortlist", ';')) &&
- channel->nsort == -1)
- status = config_sortlist(&sortlist, &nsort, p);
- else if ((p = try_config(line, "options", ';')))
- status = set_options(channel, p);
- else
- status = ARES_SUCCESS;
- if (status != ARES_SUCCESS)
- break;
- }
- fclose(fp);
- }
- else {
- error = ERRNO;
- switch(error) {
- case ENOENT:
- case ESRCH:
- status = ARES_EOF;
- break;
- default:
- DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n",
- error, strerror(error)));
- DEBUGF(fprintf(stderr, "Error opening file: %s\n", PATH_RESOLV_CONF));
- status = ARES_EFILE;
- }
- }
- if ((status == ARES_EOF) && (!channel->lookups)) {
- /* Many systems (Solaris, Linux, BSD's) use nsswitch.conf */
- fp = fopen("/etc/nsswitch.conf", "r");
- if (fp) {
- while ((status = ares__read_line(fp, &line, &linesize)) ==
- ARES_SUCCESS)
- {
- if ((p = try_config(line, "hosts:", '\0')) && !channel->lookups)
- (void)config_lookup(channel, p, "dns", "resolve", "files");
- }
- fclose(fp);
- }
- else {
- error = ERRNO;
- switch(error) {
- case ENOENT:
- case ESRCH:
- break;
- default:
- DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n",
- error, strerror(error)));
- DEBUGF(fprintf(stderr, "Error opening file: %s\n",
- "/etc/nsswitch.conf"));
- }
-
- /* ignore error, maybe we will get luck in next if clause */
- status = ARES_EOF;
- }
- }
-
- if ((status == ARES_EOF) && (!channel->lookups)) {
- /* Linux / GNU libc 2.x and possibly others have host.conf */
- fp = fopen("/etc/host.conf", "r");
- if (fp) {
- while ((status = ares__read_line(fp, &line, &linesize)) ==
- ARES_SUCCESS)
- {
- if ((p = try_config(line, "order", '\0')) && !channel->lookups)
- /* ignore errors */
- (void)config_lookup(channel, p, "bind", NULL, "hosts");
- }
- fclose(fp);
- }
- else {
- error = ERRNO;
- switch(error) {
- case ENOENT:
- case ESRCH:
- break;
- default:
- DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n",
- error, strerror(error)));
- DEBUGF(fprintf(stderr, "Error opening file: %s\n",
- "/etc/host.conf"));
- }
-
- /* ignore error, maybe we will get luck in next if clause */
- status = ARES_EOF;
- }
- }
-
- if ((status == ARES_EOF) && (!channel->lookups)) {
- /* Tru64 uses /etc/svc.conf */
- fp = fopen("/etc/svc.conf", "r");
- if (fp) {
- while ((status = ares__read_line(fp, &line, &linesize)) ==
- ARES_SUCCESS)
- {
- if ((p = try_config(line, "hosts=", '\0')) && !channel->lookups)
- /* ignore errors */
- (void)config_lookup(channel, p, "bind", NULL, "local");
- }
- fclose(fp);
- }
- else {
- error = ERRNO;
- switch(error) {
- case ENOENT:
- case ESRCH:
- break;
- default:
- DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n",
- error, strerror(error)));
- DEBUGF(fprintf(stderr, "Error opening file: %s\n", "/etc/svc.conf"));
- }
-
- /* ignore error, default value will be chosen for `channel->lookups` */
- status = ARES_EOF;
- }
- }
-
- if(line)
- ares_free(line);
+ if (channel->tries == 0) {
+ channel->tries = DEFAULT_TRIES;
}
-#endif
-
- /* Handle errors. */
- if (status != ARES_EOF)
- {
- if (servers != NULL)
- ares_free(servers);
- if (sortlist != NULL)
- ares_free(sortlist);
- return status;
+ if (ares__slist_len(channel->servers) == 0) {
+ /* Add a default local named server to the channel unless configured not
+ * to (in which case return an error).
+ */
+ if (channel->flags & ARES_FLAG_NO_DFLT_SVR) {
+ rc = ARES_ENOSERVER;
+ goto error;
}
- /* If we got any name server entries, fill them in. */
- if (servers)
- {
- channel->servers = servers;
- channel->nservers = nservers;
- }
+ addr.family = AF_INET;
+ addr.addr.addr4.s_addr = htonl(INADDR_LOOPBACK);
- /* If we got any sortlist entries, fill them in. */
- if (sortlist)
- {
- channel->sortlist = sortlist;
- channel->nsort = nsort;
+ rc = ares__sconfig_append(&sconfig, &addr, 0, 0, NULL);
+ if (rc != ARES_SUCCESS) {
+ goto error;
}
- return ARES_SUCCESS;
-}
-
-static int init_by_defaults(ares_channel channel)
-{
- char *hostname = NULL;
- int rc = ARES_SUCCESS;
-#ifdef HAVE_GETHOSTNAME
- char *dot;
-#endif
-
- if (channel->flags == -1)
- channel->flags = 0;
- if (channel->timeout == -1)
- channel->timeout = DEFAULT_TIMEOUT;
- if (channel->tries == -1)
- channel->tries = DEFAULT_TRIES;
- if (channel->ndots == -1)
- channel->ndots = 1;
- if (channel->rotate == -1)
- channel->rotate = 0;
- if (channel->udp_port == -1)
- channel->udp_port = htons(NAMESERVER_PORT);
- if (channel->tcp_port == -1)
- channel->tcp_port = htons(NAMESERVER_PORT);
-
- if (channel->ednspsz == -1)
- channel->ednspsz = EDNSPACKETSZ;
+ rc = ares__servers_update(channel, sconfig, ARES_FALSE);
+ ares__llist_destroy(sconfig);
- if (channel->nservers == -1) {
- /* If nobody specified servers, try a local named. */
- channel->servers = ares_malloc(sizeof(*channel->servers));
- if (!channel->servers) {
- rc = ARES_ENOMEM;
+ if (rc != ARES_SUCCESS) {
goto error;
}
- memset(channel->servers, 0, sizeof(*channel->servers));
- channel->servers[0].addr.family = AF_INET;
- channel->servers[0].addr.addrV4.s_addr = htonl(INADDR_LOOPBACK);
- channel->servers[0].addr.udp_port = 0;
- channel->servers[0].addr.tcp_port = 0;
- channel->nservers = 1;
}
#if defined(USE_WINSOCK)
-#define toolong(x) (x == -1) && (SOCKERRNO == WSAEFAULT)
+# define toolong(x) (x == -1) && (SOCKERRNO == WSAEFAULT)
#elif defined(ENAMETOOLONG)
-#define toolong(x) (x == -1) && ((SOCKERRNO == ENAMETOOLONG) || \
- (SOCKERRNO == EINVAL))
+# define toolong(x) \
+ (x == -1) && ((SOCKERRNO == ENAMETOOLONG) || (SOCKERRNO == EINVAL))
#else
-#define toolong(x) (x == -1) && (SOCKERRNO == EINVAL)
+# define toolong(x) (x == -1) && (SOCKERRNO == EINVAL)
#endif
- if (channel->ndomains == -1) {
+ if (channel->ndomains == 0) {
/* Derive a default domain search list from the kernel hostname,
* or set it to empty if the hostname isn't helpful.
*/
@@ -1675,12 +194,12 @@ static int init_by_defaults(ares_channel channel)
channel->ndomains = 0; /* default to none */
#else
GETHOSTNAME_TYPE_ARG2 lenv = 64;
- size_t len = 64;
- int res;
+ size_t len = 64;
+ int res;
channel->ndomains = 0; /* default to none */
hostname = ares_malloc(len);
- if(!hostname) {
+ if (!hostname) {
rc = ARES_ENOMEM;
goto error;
}
@@ -1688,19 +207,18 @@ static int init_by_defaults(ares_channel channel)
do {
res = gethostname(hostname, lenv);
- if(toolong(res)) {
+ if (toolong(res)) {
char *p;
- len *= 2;
+ len *= 2;
lenv *= 2;
- p = ares_realloc(hostname, len);
- if(!p) {
+ p = ares_realloc(hostname, len);
+ if (!p) {
rc = ARES_ENOMEM;
goto error;
}
hostname = p;
continue;
- }
- else if(res) {
+ } else if (res) {
/* Lets not treat a gethostname failure as critical, since we
* are ok if gethostname doesn't even exist */
*hostname = '\0';
@@ -1727,728 +245,321 @@ static int init_by_defaults(ares_channel channel)
#endif
}
- if (channel->nsort == -1) {
+ if (channel->nsort == 0) {
channel->sortlist = NULL;
- channel->nsort = 0;
}
if (!channel->lookups) {
channel->lookups = ares_strdup("fb");
- if (!channel->lookups)
+ if (!channel->lookups) {
rc = ARES_ENOMEM;
- }
-
- error:
- if(rc) {
- if(channel->servers) {
- ares_free(channel->servers);
- channel->servers = NULL;
- }
- channel->nservers = 0;
-
- if(channel->domains && channel->domains[0])
- ares_free(channel->domains[0]);
- if(channel->domains) {
- ares_free(channel->domains);
- channel->domains = NULL;
- }
-
- if(channel->lookups) {
- ares_free(channel->lookups);
- channel->lookups = NULL;
- }
-
- if(channel->resolvconf_path) {
- ares_free(channel->resolvconf_path);
- channel->resolvconf_path = NULL;
}
+ }
- if(channel->hosts_path) {
- ares_free(channel->hosts_path);
- channel->hosts_path = NULL;
- }
+ /* Set default fields for server failover behavior */
+ if (!(channel->optmask & ARES_OPT_SERVER_FAILOVER)) {
+ channel->server_retry_chance = DEFAULT_SERVER_RETRY_CHANCE;
+ channel->server_retry_delay = DEFAULT_SERVER_RETRY_DELAY;
}
- if(hostname)
+error:
+ if (hostname) {
ares_free(hostname);
+ }
return rc;
}
-#if !defined(WIN32) && !defined(WATT32) && \
- !defined(ANDROID) && !defined(__ANDROID__) && !defined(CARES_USE_LIBRESOLV)
-static int config_domain(ares_channel channel, char *str)
-{
- char *q;
-
- /* Set a single search domain. */
- q = str;
- while (*q && !ISSPACE(*q))
- q++;
- *q = '\0';
- return set_search(channel, str);
-}
-
-#if defined(__INTEL_COMPILER) && (__INTEL_COMPILER == 910) && \
- defined(__OPTIMIZE__) && defined(__unix__) && defined(__i386__)
- /* workaround icc 9.1 optimizer issue */
-# define vqualifier volatile
-#else
-# define vqualifier
-#endif
-
-static int config_lookup(ares_channel channel, const char *str,
- const char *bindch, const char *altbindch,
- const char *filech)
+int ares_init_options(ares_channel_t **channelptr,
+ const struct ares_options *options, int optmask)
{
- char lookups[3], *l;
- const char *vqualifier p;
- int found;
+ ares_channel_t *channel;
+ ares_status_t status = ARES_SUCCESS;
- if (altbindch == NULL)
- altbindch = bindch;
-
- /* Set the lookup order. Only the first letter of each work
- * is relevant, and it has to be "b" for DNS or "f" for the
- * host file. Ignore everything else.
- */
- l = lookups;
- p = str;
- found = 0;
- while (*p)
- {
- if ((*p == *bindch || *p == *altbindch || *p == *filech) && l < lookups + 2) {
- if (*p == *bindch || *p == *altbindch) *l++ = 'b';
- else *l++ = 'f';
- found = 1;
- }
- while (*p && !ISSPACE(*p) && (*p != ','))
- p++;
- while (*p && (ISSPACE(*p) || (*p == ',')))
- p++;
- }
- if (!found)
- return ARES_ENOTINITIALIZED;
- *l = '\0';
- channel->lookups = ares_strdup(lookups);
- return (channel->lookups) ? ARES_SUCCESS : ARES_ENOMEM;
-}
-#endif /* !WIN32 & !WATT32 & !ANDROID & !__ANDROID__ & !CARES_USE_LIBRESOLV */
+ if (ares_library_initialized() != ARES_SUCCESS) {
+ return ARES_ENOTINITIALIZED; /* LCOV_EXCL_LINE: n/a on non-WinSock */
+ }
-#ifndef WATT32
-/* Validate that the ip address matches the subnet (network base and network
- * mask) specified. Addresses are specified in standard Network Byte Order as
- * 16 bytes, and the netmask is 0 to 128 (bits).
- */
-static int ares_ipv6_subnet_matches(const unsigned char netbase[16],
- unsigned char netmask,
- const unsigned char ipaddr[16])
-{
- unsigned char mask[16] = { 0 };
- unsigned char i;
+ channel = ares_malloc_zero(sizeof(*channel));
+ if (!channel) {
+ *channelptr = NULL;
+ return ARES_ENOMEM;
+ }
- /* Misuse */
- if (netmask > 128)
- return 0;
+ /* One option where zero is valid, so set default value here */
+ channel->ndots = 1;
- /* Quickly set whole bytes */
- memset(mask, 0xFF, netmask / 8);
+ status = ares__channel_threading_init(channel);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
- /* Set remaining bits */
- if(netmask % 8) {
- mask[netmask / 8] = (unsigned char)(0xff << (8 - (netmask % 8)));
+ /* Generate random key */
+ channel->rand_state = ares__init_rand_state();
+ if (channel->rand_state == NULL) {
+ status = ARES_ENOMEM;
+ DEBUGF(fprintf(stderr, "Error: init_id_key failed: %s\n",
+ ares_strerror(status)));
+ goto done;
}
- for (i=0; i<16; i++) {
- if ((netbase[i] & mask[i]) != (ipaddr[i] & mask[i]))
- return 0;
+ /* Initialize Server List */
+ channel->servers =
+ ares__slist_create(channel->rand_state, server_sort_cb, server_destroy_cb);
+ if (channel->servers == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
}
- return 1;
-}
+ /* Initialize our lists of queries */
+ channel->all_queries = ares__llist_create(NULL);
+ if (channel->all_queries == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
-/* Return true iff the IPv6 ipaddr is blacklisted. */
-static int ares_ipv6_server_blacklisted(const unsigned char ipaddr[16])
-{
- /* A list of blacklisted IPv6 subnets. */
- const struct {
- const unsigned char netbase[16];
- unsigned char netmask;
- } blacklist[] = {
- /* fec0::/10 was deprecated by [RFC3879] in September 2004. Formerly a
- * Site-Local scoped address prefix. These are never valid DNS servers,
- * but are known to be returned at least sometimes on Windows and Android.
- */
- {
- {
- 0xfe, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
- },
- 10
- }
- };
- size_t i;
-
- /* See if ipaddr matches any of the entries in the blacklist. */
- for (i = 0; i < sizeof(blacklist) / sizeof(blacklist[0]); ++i) {
- if (ares_ipv6_subnet_matches(
- blacklist[i].netbase, blacklist[i].netmask, ipaddr))
- return 1;
+ channel->queries_by_qid = ares__htable_szvp_create(NULL);
+ if (channel->queries_by_qid == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
}
- return 0;
-}
-/* Parse address and port in these formats, either ipv4 or ipv6 addresses
- * are allowed:
- * ipaddr
- * [ipaddr]
- * [ipaddr]:port
- *
- * If a port is not specified, will set port to 0.
- *
- * Will fail if an IPv6 nameserver as detected by
- * ares_ipv6_server_blacklisted()
- *
- * Returns an error code on failure, else ARES_SUCCESS
- */
-static int parse_dnsaddrport(const char *str, size_t len,
- struct ares_addr *host, unsigned short *port)
-{
- char ipaddr[INET6_ADDRSTRLEN] = "";
- char ipport[6] = "";
- size_t mylen;
- const char *addr_start = NULL;
- const char *addr_end = NULL;
- const char *port_start = NULL;
- const char *port_end = NULL;
-
- /* Must start with [, hex digit or : */
- if (len == 0 || (*str != '[' && !isxdigit(*str) && *str != ':')) {
- return ARES_EBADSTR;
+ channel->queries_by_timeout =
+ ares__slist_create(channel->rand_state, ares_query_timeout_cmp_cb, NULL);
+ if (channel->queries_by_timeout == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
}
- /* If it starts with a bracket, must end with a bracket */
- if (*str == '[') {
- const char *ptr;
- addr_start = str+1;
- ptr = memchr(addr_start, ']', len-1);
- if (ptr == NULL) {
- return ARES_EBADSTR;
- }
- addr_end = ptr-1;
+ channel->connnode_by_socket = ares__htable_asvp_create(NULL);
+ if (channel->connnode_by_socket == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
- /* Try to pull off port */
- if ((size_t)(ptr - str) < len) {
- ptr++;
- if (*ptr != ':') {
- return ARES_EBADSTR;
- }
+ /* Initialize configuration by each of the four sources, from highest
+ * precedence to lowest.
+ */
- /* Missing port number */
- if ((size_t)(ptr - str) == len) {
- return ARES_EBADSTR;
- }
+ status = ares__init_by_options(channel, options, optmask);
+ if (status != ARES_SUCCESS) {
+ DEBUGF(fprintf(stderr, "Error: init_by_options failed: %s\n",
+ ares_strerror(status)));
+ /* If we fail to apply user-specified options, fail the whole init process
+ */
+ goto done;
+ }
- port_start = ptr+1;
- port_end = str+(len-1);
+ if (channel->qcache_max_ttl > 0) {
+ status = ares__qcache_create(channel->rand_state, channel->qcache_max_ttl,
+ &channel->qcache);
+ if (status != ARES_SUCCESS) {
+ goto done;
}
- } else {
- addr_start = str;
- addr_end = str+(len-1);
}
- mylen = (addr_end-addr_start)+1;
- /* Larger than buffer with null term */
- if (mylen+1 > sizeof(ipaddr)) {
- return ARES_EBADSTR;
+ if (status == ARES_SUCCESS) {
+ status = ares__init_by_sysconfig(channel);
+ if (status != ARES_SUCCESS) {
+ DEBUGF(fprintf(stderr, "Error: init_by_sysconfig failed: %s\n",
+ ares_strerror(status)));
+ }
}
- memset(ipaddr, 0, sizeof(ipaddr));
- memcpy(ipaddr, addr_start, mylen);
+ /*
+ * No matter what failed or succeeded, seed defaults to provide
+ * useful behavior for things that we missed.
+ */
+ status = init_by_defaults(channel);
+ if (status != ARES_SUCCESS) {
+ DEBUGF(fprintf(stderr, "Error: init_by_defaults failed: %s\n",
+ ares_strerror(status)));
+ goto done;
+ }
- if (port_start) {
- mylen = (port_end-port_start)+1;
- /* Larger than buffer with null term */
- if (mylen+1 > sizeof(ipport)) {
- return ARES_EBADSTR;
+ /* Initialize the event thread */
+ if (channel->optmask & ARES_OPT_EVENT_THREAD) {
+ status = ares_event_thread_init(channel);
+ if (status != ARES_SUCCESS) {
+ goto done;
}
- memset(ipport, 0, sizeof(ipport));
- memcpy(ipport, port_start, mylen);
- } else {
- snprintf(ipport, sizeof(ipport), "0");
}
- /* Convert textual address to binary format. */
- if (ares_inet_pton(AF_INET, ipaddr, &host->addrV4) == 1) {
- host->family = AF_INET;
- } else if (ares_inet_pton(AF_INET6, ipaddr, &host->addrV6) == 1
- /* Silently skip blacklisted IPv6 servers. */
- && !ares_ipv6_server_blacklisted(
- (const unsigned char *)&host->addrV6)) {
- host->family = AF_INET6;
- } else {
- return ARES_EBADSTR;
+done:
+ if (status != ARES_SUCCESS) {
+ ares_destroy(channel);
+ return (int)status;
}
- *port = (unsigned short)atoi(ipport);
+ *channelptr = channel;
return ARES_SUCCESS;
}
-/* Add the IPv4 or IPv6 nameservers in str (separated by commas or spaces) to
- * the servers list, updating servers and nservers as required.
- *
- * If a nameserver is encapsulated in [ ] it may optionally include a port
- * suffix, e.g.:
- * [127.0.0.1]:59591
- *
- * The extended format is required to support OpenBSD's resolv.conf format:
- * https://man.openbsd.org/OpenBSD-5.1/resolv.conf.5
- * As well as MacOS libresolv that may include a non-default port number.
- *
- * This will silently ignore blacklisted IPv6 nameservers as detected by
- * ares_ipv6_server_blacklisted().
- *
- * Returns an error code on failure, else ARES_SUCCESS.
- */
-static int config_nameserver(struct server_state **servers, int *nservers,
- const char *str)
+ares_status_t ares_reinit(ares_channel_t *channel)
{
- struct ares_addr host;
- struct server_state *newserv;
- const char *p, *txtaddr;
- /* On Windows, there may be more than one nameserver specified in the same
- * registry key, so we parse input as a space or comma seperated list.
- */
- for (p = str; p;)
- {
- unsigned short port;
-
- /* Skip whitespace and commas. */
- while (*p && (ISSPACE(*p) || (*p == ',')))
- p++;
- if (!*p)
- /* No more input, done. */
- break;
+ ares_status_t status;
- /* Pointer to start of IPv4 or IPv6 address part. */
- txtaddr = p;
+ if (channel == NULL) {
+ return ARES_EFORMERR;
+ }
- /* Advance past this address. */
- while (*p && !ISSPACE(*p) && (*p != ','))
- p++;
+ ares__channel_lock(channel);
- if (parse_dnsaddrport(txtaddr, p-txtaddr, &host, &port) !=
- ARES_SUCCESS) {
- continue;
- }
-
- /* Resize servers state array. */
- newserv = ares_realloc(*servers, (*nservers + 1) *
- sizeof(*newserv));
- if (!newserv)
- return ARES_ENOMEM;
-
- memset(((unsigned char *)newserv) + ((*nservers) * sizeof(*newserv)), 0, sizeof(*newserv));
-
- /* Store address data. */
- newserv[*nservers].addr.family = host.family;
- newserv[*nservers].addr.udp_port = htons(port);
- newserv[*nservers].addr.tcp_port = htons(port);
- if (host.family == AF_INET)
- memcpy(&newserv[*nservers].addr.addrV4, &host.addrV4,
- sizeof(host.addrV4));
- else
- memcpy(&newserv[*nservers].addr.addrV6, &host.addrV6,
- sizeof(host.addrV6));
-
- /* Update arguments. */
- *servers = newserv;
- *nservers += 1;
- }
+ status = ares__init_by_sysconfig(channel);
+ if (status != ARES_SUCCESS) {
+ DEBUGF(fprintf(stderr, "Error: init_by_sysconfig failed: %s\n",
+ ares_strerror(status)));
+ }
- return ARES_SUCCESS;
-}
-#endif /* !WATT32 */
+ /* Flush cached queries on reinit */
+ if (channel->qcache) {
+ ares__qcache_flush(channel->qcache);
+ }
-static int config_sortlist(struct apattern **sortlist, int *nsort,
- const char *str)
-{
- struct apattern pat;
- const char *q;
-
- /* Add sortlist entries. */
- while (*str && *str != ';')
- {
- int bits;
- char ipbuf[16], ipbufpfx[32];
- /* Find just the IP */
- q = str;
- while (*q && *q != '/' && *q != ';' && !ISSPACE(*q))
- q++;
- if (q-str >= 16)
- return ARES_EBADSTR;
- memcpy(ipbuf, str, q-str);
- ipbuf[q-str] = '\0';
- /* Find the prefix */
- if (*q == '/')
- {
- const char *str2 = q+1;
- while (*q && *q != ';' && !ISSPACE(*q))
- q++;
- if (q-str >= 32)
- return ARES_EBADSTR;
- memcpy(ipbufpfx, str, q-str);
- ipbufpfx[q-str] = '\0';
- str = str2;
- }
- else
- ipbufpfx[0] = '\0';
- /* Lets see if it is CIDR */
- /* First we'll try IPv6 */
- if ((bits = ares_inet_net_pton(AF_INET6, ipbufpfx[0] ? ipbufpfx : ipbuf,
- &pat.addrV6,
- sizeof(pat.addrV6))) > 0)
- {
- pat.type = PATTERN_CIDR;
- pat.mask.bits = (unsigned short)bits;
- pat.family = AF_INET6;
- if (!sortlist_alloc(sortlist, nsort, &pat)) {
- ares_free(*sortlist);
- *sortlist = NULL;
- return ARES_ENOMEM;
- }
- }
- else if (ipbufpfx[0] &&
- (bits = ares_inet_net_pton(AF_INET, ipbufpfx, &pat.addrV4,
- sizeof(pat.addrV4))) > 0)
- {
- pat.type = PATTERN_CIDR;
- pat.mask.bits = (unsigned short)bits;
- pat.family = AF_INET;
- if (!sortlist_alloc(sortlist, nsort, &pat)) {
- ares_free(*sortlist);
- *sortlist = NULL;
- return ARES_ENOMEM;
- }
- }
- /* See if it is just a regular IP */
- else if (ip_addr(ipbuf, q-str, &pat.addrV4) == 0)
- {
- if (ipbufpfx[0])
- {
- memcpy(ipbuf, str, q-str);
- ipbuf[q-str] = '\0';
- if (ip_addr(ipbuf, q-str, &pat.mask.addr4) != 0)
- natural_mask(&pat);
- }
- else
- natural_mask(&pat);
- pat.family = AF_INET;
- pat.type = PATTERN_MASK;
- if (!sortlist_alloc(sortlist, nsort, &pat)) {
- ares_free(*sortlist);
- *sortlist = NULL;
- return ARES_ENOMEM;
- }
- }
- else
- {
- while (*q && *q != ';' && !ISSPACE(*q))
- q++;
- }
- str = q;
- while (ISSPACE(*str))
- str++;
- }
+ ares__channel_unlock(channel);
- return ARES_SUCCESS;
+ return status;
}
-static int set_search(ares_channel channel, const char *str)
+/* ares_dup() duplicates a channel handle with all its options and returns a
+ new channel handle */
+int ares_dup(ares_channel_t **dest, ares_channel_t *src)
{
- size_t cnt;
-
- if(channel->ndomains != -1) {
- /* LCOV_EXCL_START: all callers check ndomains == -1 */
- /* if we already have some domains present, free them first */
- ares__strsplit_free(channel->domains, channel->ndomains);
- channel->domains = NULL;
- channel->ndomains = -1;
- } /* LCOV_EXCL_STOP */
-
- channel->domains = ares__strsplit(str, ", ", &cnt);
- channel->ndomains = (int)cnt;
- if (channel->domains == NULL || channel->ndomains == 0) {
- channel->domains = NULL;
- channel->ndomains = -1;
- }
-
- return ARES_SUCCESS;
-}
+ struct ares_options opts;
+ ares_status_t rc;
+ int optmask;
-static int set_options(ares_channel channel, const char *str)
-{
- const char *p, *q, *val;
-
- p = str;
- while (*p)
- {
- q = p;
- while (*q && !ISSPACE(*q))
- q++;
- val = try_option(p, q, "ndots:");
- if (val && channel->ndots == -1)
- channel->ndots = aresx_sltosi(strtol(val, NULL, 10));
- val = try_option(p, q, "retrans:");
- if (val && channel->timeout == -1)
- channel->timeout = aresx_sltosi(strtol(val, NULL, 10));
- val = try_option(p, q, "timeout:");
- if (val && channel->timeout == -1)
- channel->timeout = aresx_sltosi(strtol(val, NULL, 10)) * 1000;
- val = try_option(p, q, "maxtimeout:");
- if (val && channel->maxtimeout == -1)
- channel->maxtimeout = aresx_sltosi(strtol(val, NULL, 10)) * 1000;
- val = try_option(p, q, "retry:");
- if (val && channel->tries == -1)
- channel->tries = aresx_sltosi(strtol(val, NULL, 10));
- val = try_option(p, q, "attempts:");
- if (val && channel->tries == -1)
- channel->tries = aresx_sltosi(strtol(val, NULL, 10));
- val = try_option(p, q, "rotate");
- if (val && channel->rotate == -1)
- channel->rotate = 1;
- val = try_option(p, q, "jitter:");
- if (val && channel->jitter == -1)
- channel->jitter = aresx_sltosi(strtol(val, NULL, 10));
- p = q;
- while (ISSPACE(*p))
- p++;
- }
+ if (dest == NULL || src == NULL) {
+ return ARES_EFORMERR;
+ }
- return ARES_SUCCESS;
-}
+ *dest = NULL; /* in case of failure return NULL explicitly */
-static const char *try_option(const char *p, const char *q, const char *opt)
-{
- size_t len = strlen(opt);
- return ((size_t)(q - p) >= len && !strncmp(p, opt, len)) ? &p[len] : NULL;
-}
+ ares__channel_lock(src);
+ /* First get the options supported by the old ares_save_options() function,
+ which is most of them */
+ rc = (ares_status_t)ares_save_options(src, &opts, &optmask);
+ if (rc != ARES_SUCCESS) {
+ ares_destroy_options(&opts);
+ goto done;
+ }
-#if !defined(WIN32) && !defined(WATT32) && \
- !defined(ANDROID) && !defined(__ANDROID__) && !defined(CARES_USE_LIBRESOLV)
-static char *try_config(char *s, const char *opt, char scc)
-{
- size_t len;
- char *p;
- char *q;
-
- if (!s || !opt)
- /* no line or no option */
- return NULL; /* LCOV_EXCL_LINE */
-
- /* Hash '#' character is always used as primary comment char, additionally
- a not-NUL secondary comment char will be considered when specified. */
-
- /* trim line comment */
- p = s;
- if(scc)
- while (*p && (*p != '#') && (*p != scc))
- p++;
- else
- while (*p && (*p != '#'))
- p++;
- *p = '\0';
-
- /* trim trailing whitespace */
- q = p - 1;
- while ((q >= s) && ISSPACE(*q))
- q--;
- *++q = '\0';
-
- /* skip leading whitespace */
- p = s;
- while (*p && ISSPACE(*p))
- p++;
-
- if (!*p)
- /* empty line */
- return NULL;
-
- if ((len = strlen(opt)) == 0)
- /* empty option */
- return NULL; /* LCOV_EXCL_LINE */
-
- if (strncmp(p, opt, len) != 0)
- /* line and option do not match */
- return NULL;
-
- /* skip over given option name */
- p += len;
-
- if (!*p)
- /* no option value */
- return NULL; /* LCOV_EXCL_LINE */
-
- if ((opt[len-1] != ':') && (opt[len-1] != '=') && !ISSPACE(*p))
- /* whitespace between option name and value is mandatory
- for given option names which do not end with ':' or '=' */
- return NULL;
-
- /* skip over whitespace */
- while (*p && ISSPACE(*p))
- p++;
-
- if (!*p)
- /* no option value */
- return NULL;
-
- /* return pointer to option value */
- return p;
-}
-#endif /* !WIN32 & !WATT32 & !ANDROID & !__ANDROID__ */
+ /* Then create the new channel with those options */
+ rc = (ares_status_t)ares_init_options(dest, &opts, optmask);
-static int ip_addr(const char *ipbuf, ares_ssize_t len, struct in_addr *addr)
-{
+ /* destroy the options copy to not leak any memory */
+ ares_destroy_options(&opts);
- /* Four octets and three periods yields at most 15 characters. */
- if (len > 15)
- return -1;
+ if (rc != ARES_SUCCESS) {
+ goto done;
+ }
- if (ares_inet_pton(AF_INET, ipbuf, addr) < 1)
- return -1;
+ /* Now clone the options that ares_save_options() doesn't support, but are
+ * user-provided */
+ (*dest)->sock_create_cb = src->sock_create_cb;
+ (*dest)->sock_create_cb_data = src->sock_create_cb_data;
+ (*dest)->sock_config_cb = src->sock_config_cb;
+ (*dest)->sock_config_cb_data = src->sock_config_cb_data;
+ (*dest)->sock_funcs = src->sock_funcs;
+ (*dest)->sock_func_cb_data = src->sock_func_cb_data;
- return 0;
-}
+ ares_strcpy((*dest)->local_dev_name, src->local_dev_name,
+ sizeof((*dest)->local_dev_name));
+ (*dest)->local_ip4 = src->local_ip4;
+ memcpy((*dest)->local_ip6, src->local_ip6, sizeof(src->local_ip6));
-static void natural_mask(struct apattern *pat)
-{
- struct in_addr addr;
- /* Store a host-byte-order copy of pat in a struct in_addr. Icky,
- * but portable.
+ /* Servers are a bit unique as ares_init_options() only allows ipv4 servers
+ * and not a port per server, but there are other user specified ways, that
+ * too will toggle the optmask ARES_OPT_SERVERS to let us know. If that's
+ * the case, pull them in.
+ *
+ * We don't want to clone system-configuration servers though.
+ *
+ * We must use the "csv" format to get things like link-local address support
*/
- addr.s_addr = ntohl(pat->addrV4.s_addr);
- /* This is out of date in the CIDR world, but some people might
- * still rely on it.
- */
- if (IN_CLASSA(addr.s_addr))
- pat->mask.addr4.s_addr = htonl(IN_CLASSA_NET);
- else if (IN_CLASSB(addr.s_addr))
- pat->mask.addr4.s_addr = htonl(IN_CLASSB_NET);
- else
- pat->mask.addr4.s_addr = htonl(IN_CLASSC_NET);
-}
+ if (optmask & ARES_OPT_SERVERS) {
+ char *csv = ares_get_servers_csv(src);
+ if (csv == NULL) {
+ ares_destroy(*dest);
+ *dest = NULL;
+ rc = ARES_ENOMEM;
+ goto done;
+ }
-static int sortlist_alloc(struct apattern **sortlist, int *nsort,
- struct apattern *pat)
-{
- struct apattern *newsort;
- newsort = ares_realloc(*sortlist, (*nsort + 1) * sizeof(struct apattern));
- if (!newsort)
- return 0;
- newsort[*nsort] = *pat;
- *sortlist = newsort;
- (*nsort)++;
- return 1;
-}
+ rc = (ares_status_t)ares_set_servers_ports_csv(*dest, csv);
+ ares_free_string(csv);
+ if (rc != ARES_SUCCESS) {
+ ares_destroy(*dest);
+ *dest = NULL;
+ goto done;
+ }
+ }
+ rc = ARES_SUCCESS;
+done:
+ ares__channel_unlock(src);
+ return (int)rc; /* everything went fine */
+}
-void ares_set_local_ip4(ares_channel channel, unsigned int local_ip)
+void ares_set_local_ip4(ares_channel_t *channel, unsigned int local_ip)
{
+ if (channel == NULL) {
+ return;
+ }
+ ares__channel_lock(channel);
channel->local_ip4 = local_ip;
+ ares__channel_unlock(channel);
}
/* local_ip6 should be 16 bytes in length */
-void ares_set_local_ip6(ares_channel channel,
- const unsigned char* local_ip6)
+void ares_set_local_ip6(ares_channel_t *channel, const unsigned char *local_ip6)
{
+ if (channel == NULL) {
+ return;
+ }
+ ares__channel_lock(channel);
memcpy(&channel->local_ip6, local_ip6, sizeof(channel->local_ip6));
+ ares__channel_unlock(channel);
}
/* local_dev_name should be null terminated. */
-void ares_set_local_dev(ares_channel channel,
- const char* local_dev_name)
-{
- strncpy(channel->local_dev_name, local_dev_name,
- sizeof(channel->local_dev_name));
- channel->local_dev_name[sizeof(channel->local_dev_name) - 1] = 0;
-}
-
-
-void ares_set_socket_callback(ares_channel channel,
- ares_sock_create_callback cb,
- void *data)
-{
- channel->sock_create_cb = cb;
- channel->sock_create_cb_data = data;
-}
-
-void ares_set_socket_configure_callback(ares_channel channel,
- ares_sock_config_callback cb,
- void *data)
+void ares_set_local_dev(ares_channel_t *channel, const char *local_dev_name)
{
- channel->sock_config_cb = cb;
- channel->sock_config_cb_data = data;
-}
+ if (channel == NULL) {
+ return;
+ }
-void ares_set_socket_functions(ares_channel channel,
- const struct ares_socket_functions * funcs,
- void *data)
-{
- channel->sock_funcs = funcs;
- channel->sock_func_cb_data = data;
+ ares__channel_lock(channel);
+ ares_strcpy(channel->local_dev_name, local_dev_name,
+ sizeof(channel->local_dev_name));
+ channel->local_dev_name[sizeof(channel->local_dev_name) - 1] = 0;
+ ares__channel_unlock(channel);
}
-int ares_set_sortlist(ares_channel channel, const char *sortstr)
+int ares_set_sortlist(ares_channel_t *channel, const char *sortstr)
{
- int nsort = 0;
+ size_t nsort = 0;
struct apattern *sortlist = NULL;
- int status;
+ ares_status_t status;
- if (!channel)
+ if (!channel) {
return ARES_ENODATA;
+ }
+ ares__channel_lock(channel);
- status = config_sortlist(&sortlist, &nsort, sortstr);
+ status = ares__parse_sortlist(&sortlist, &nsort, sortstr);
if (status == ARES_SUCCESS && sortlist) {
- if (channel->sortlist)
+ if (channel->sortlist) {
ares_free(channel->sortlist);
- channel->sortlist = sortlist;
- channel->nsort = nsort;
- }
- return status;
-}
-
-int ares__init_servers_state(ares_channel channel)
-{
- struct server_state *server;
- int i;
-
- for (i = 0; i < channel->nservers; i++) {
- server = &channel->servers[i];
-
- /* NOTE: Can't use memset() here because the server addresses have been
- * filled in already */
- server->tcp_parser = ares__buf_create();
- if (server->tcp_parser == NULL)
- return ARES_ENOMEM;
-
- server->tcp_send = ares__buf_create();
- if (server->tcp_send == NULL) {
- ares__buf_destroy(server->tcp_parser);
- return ARES_ENOMEM;
- }
-
- server->idx = i;
- server->connections = ares__llist_create(NULL);
- if (server->connections == NULL) {
- ares__buf_destroy(server->tcp_parser);
- ares__buf_destroy(server->tcp_send);
- return ARES_ENOMEM;
}
+ channel->sortlist = sortlist;
+ channel->nsort = nsort;
- server->tcp_connection_generation = ++channel->tcp_connection_generation;
- server->channel = channel;
+ /* Save sortlist as if it was passed in as an option */
+ channel->optmask |= ARES_OPT_SORTLIST;
}
- return ARES_SUCCESS;
+ ares__channel_unlock(channel);
+ return (int)status;
}
diff --git a/contrib/libs/c-ares/src/lib/ares_ipv6.h b/contrib/libs/c-ares/src/lib/ares_ipv6.h
index edb305324b..28d7851ff3 100644
--- a/contrib/libs/c-ares/src/lib/ares_ipv6.h
+++ b/contrib/libs/c-ares/src/lib/ares_ipv6.h
@@ -27,13 +27,16 @@
#ifndef ARES_IPV6_H
#define ARES_IPV6_H
+#ifdef HAVE_NETINET6_IN6_H
+# include <netinet6/in6.h>
+#endif
+
#ifndef HAVE_PF_INET6
-#define PF_INET6 AF_INET6
+# define PF_INET6 AF_INET6
#endif
#ifndef HAVE_STRUCT_SOCKADDR_IN6
-struct sockaddr_in6
-{
+struct sockaddr_in6 {
unsigned short sin6_family;
unsigned short sin6_port;
unsigned long sin6_flowinfo;
@@ -42,21 +45,19 @@ struct sockaddr_in6
};
#endif
-typedef union
-{
+typedef union {
struct sockaddr sa;
struct sockaddr_in sa4;
struct sockaddr_in6 sa6;
} ares_sockaddr;
#ifndef HAVE_STRUCT_ADDRINFO
-struct addrinfo
-{
+struct addrinfo {
int ai_flags;
int ai_family;
int ai_socktype;
int ai_protocol;
- ares_socklen_t ai_addrlen; /* Follow rfc3493 struct addrinfo */
+ ares_socklen_t ai_addrlen; /* Follow rfc3493 struct addrinfo */
char *ai_canonname;
struct sockaddr *ai_addr;
struct addrinfo *ai_next;
@@ -64,28 +65,28 @@ struct addrinfo
#endif
#ifndef NS_IN6ADDRSZ
-#ifndef HAVE_STRUCT_IN6_ADDR
+# ifndef HAVE_STRUCT_IN6_ADDR
/* We cannot have it set to zero, so we pick a fixed value here */
-#define NS_IN6ADDRSZ 16
-#else
-#define NS_IN6ADDRSZ sizeof(struct in6_addr)
-#endif
+# define NS_IN6ADDRSZ 16
+# else
+# define NS_IN6ADDRSZ sizeof(struct in6_addr)
+# endif
#endif
#ifndef NS_INADDRSZ
-#define NS_INADDRSZ sizeof(struct in_addr)
+# define NS_INADDRSZ sizeof(struct in_addr)
#endif
#ifndef NS_INT16SZ
-#define NS_INT16SZ 2
+# define NS_INT16SZ 2
#endif
#ifndef IF_NAMESIZE
-#ifdef IFNAMSIZ
-#define IF_NAMESIZE IFNAMSIZ
-#else
-#define IF_NAMESIZE 256
-#endif
+# ifdef IFNAMSIZ
+# define IF_NAMESIZE IFNAMSIZ
+# else
+# define IF_NAMESIZE 256
+# endif
#endif
/* Defined in inet_net_pton.c for no particular reason. */
diff --git a/contrib/libs/c-ares/src/lib/ares_library_init.c b/contrib/libs/c-ares/src/lib/ares_library_init.c
index 79f73b22d4..5d8abf10a0 100644
--- a/contrib/libs/c-ares/src/lib/ares_library_init.c
+++ b/contrib/libs/c-ares/src/lib/ares_library_init.c
@@ -30,47 +30,80 @@
#include "ares.h"
#include "ares_private.h"
-#include "atomic.h"
-
/* library-private global and unique instance vars */
#if defined(ANDROID) || defined(__ANDROID__)
-#include "ares_android.h"
+# include "ares_android.h"
#endif
/* library-private global vars with source visibility restricted to this file */
-static atomic_t ares_init_lock;
static unsigned int ares_initialized;
static int ares_init_flags;
/* library-private global vars with visibility across the whole library */
-/* Some systems may return either NULL or a valid pointer on malloc(0). c-ares should
- * never call malloc(0) so lets return NULL so we're more likely to find an issue if it
- * were to occur. */
+/* Some systems may return either NULL or a valid pointer on malloc(0). c-ares
+ * should never call malloc(0) so lets return NULL so we're more likely to find
+ * an issue if it were to occur. */
-static void *default_malloc(size_t size) { if (size == 0) { return NULL; } return malloc(size); }
+static void *default_malloc(size_t size)
+{
+ if (size == 0) {
+ return NULL;
+ }
+ return malloc(size);
+}
#if defined(WIN32)
/* We need indirections to handle Windows DLL rules. */
-static void *default_realloc(void *p, size_t size) { return realloc(p, size); }
-static void default_free(void *p) { free(p); }
+static void *default_realloc(void *p, size_t size)
+{
+ return realloc(p, size);
+}
+
+static void default_free(void *p)
+{
+ free(p);
+}
#else
-# define default_realloc realloc
-# define default_free free
+# define default_realloc realloc
+# define default_free free
#endif
-void *(*ares_malloc)(size_t size) = default_malloc;
+void *(*ares_malloc)(size_t size) = default_malloc;
void *(*ares_realloc)(void *ptr, size_t size) = default_realloc;
-void (*ares_free)(void *ptr) = default_free;
+void (*ares_free)(void *ptr) = default_free;
+
+void *ares_malloc_zero(size_t size)
+{
+ void *ptr = ares_malloc(size);
+ if (ptr != NULL) {
+ memset(ptr, 0, size);
+ }
+
+ return ptr;
+}
+
+void *ares_realloc_zero(void *ptr, size_t orig_size, size_t new_size)
+{
+ void *p = ares_realloc(ptr, new_size);
+ if (p == NULL) {
+ return NULL;
+ }
+
+ if (new_size > orig_size) {
+ memset((unsigned char *)p + orig_size, 0, new_size - orig_size);
+ }
+
+ return p;
+}
int ares_library_init_unsafe(int flags)
{
- if (ares_initialized)
- {
- ares_initialized++;
- return ARES_SUCCESS;
- }
+ if (ares_initialized) {
+ ares_initialized++;
+ return ARES_SUCCESS;
+ }
ares_initialized++;
/* NOTE: ARES_LIB_INIT_WIN32 flag no longer used */
@@ -80,36 +113,31 @@ int ares_library_init_unsafe(int flags)
return ARES_SUCCESS;
}
-int ares_library_init(int flags)
-{
- acquire_lock(&ares_init_lock);
- int res = ares_library_init_unsafe(flags);
- release_lock(&ares_init_lock);
- return res;
-}
-
-int ares_library_init_mem(int flags,
- void *(*amalloc)(size_t size),
+int ares_library_init_mem(int flags, void *(*amalloc)(size_t size),
void (*afree)(void *ptr),
void *(*arealloc)(void *ptr, size_t size))
{
- if (amalloc)
+ if (amalloc) {
ares_malloc = amalloc;
- if (arealloc)
+ }
+ if (arealloc) {
ares_realloc = arealloc;
- if (afree)
+ }
+ if (afree) {
ares_free = afree;
+ }
return ares_library_init(flags);
}
-
void ares_library_cleanup_unsafe(void)
{
- if (!ares_initialized)
+ if (!ares_initialized) {
return;
+ }
ares_initialized--;
- if (ares_initialized)
+ if (ares_initialized) {
return;
+ }
/* NOTE: ARES_LIB_INIT_WIN32 flag no longer used */
@@ -118,27 +146,37 @@ void ares_library_cleanup_unsafe(void)
#endif
ares_init_flags = ARES_LIB_INIT_NONE;
- ares_malloc = malloc;
- ares_realloc = realloc;
- ares_free = free;
+ ares_malloc = malloc;
+ ares_realloc = realloc;
+ ares_free = free;
}
-void ares_library_cleanup(void)
-{
- acquire_lock(&ares_init_lock);
- ares_library_cleanup_unsafe();
- release_lock(&ares_init_lock);
-}
-
-
int ares_library_initialized_unsafe(void)
{
#ifdef USE_WINSOCK
- if (!ares_initialized)
+ if (!ares_initialized) {
return ARES_ENOTINITIALIZED;
+ }
#endif
return ARES_SUCCESS;
}
+#include "atomic.h"
+static atomic_t ares_init_lock;
+int ares_library_init(int flags)
+{
+ acquire_lock(&ares_init_lock);
+ int res = ares_library_init_unsafe(flags);
+ release_lock(&ares_init_lock);
+ return res;
+}
+
+void ares_library_cleanup(void)
+{
+ acquire_lock(&ares_init_lock);
+ ares_library_cleanup_unsafe();
+ release_lock(&ares_init_lock);
+}
+
int ares_library_initialized(void)
{
diff --git a/contrib/libs/c-ares/src/lib/ares_math.c b/contrib/libs/c-ares/src/lib/ares_math.c
new file mode 100644
index 0000000000..eaefd6c5de
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares_math.c
@@ -0,0 +1,145 @@
+/* MIT License
+ *
+ * Copyright (c) 2023 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#include "ares_setup.h"
+#include "ares.h"
+#include "ares_private.h"
+
+/* Uses public domain code snippets from
+ * http://graphics.stanford.edu/~seander/bithacks.html */
+
+static unsigned int ares__round_up_pow2_u32(unsigned int n)
+{
+ /* NOTE: if already a power of 2, will return itself, not the next */
+ n--;
+ n |= n >> 1;
+ n |= n >> 2;
+ n |= n >> 4;
+ n |= n >> 8;
+ n |= n >> 16;
+ n++;
+ return n;
+}
+
+static ares_int64_t ares__round_up_pow2_u64(ares_int64_t n)
+{
+ /* NOTE: if already a power of 2, will return itself, not the next */
+ n--;
+ n |= n >> 1;
+ n |= n >> 2;
+ n |= n >> 4;
+ n |= n >> 8;
+ n |= n >> 16;
+ n |= n >> 32;
+ n++;
+ return n;
+}
+
+size_t ares__round_up_pow2(size_t n)
+{
+ if (sizeof(size_t) > 4) {
+ return (size_t)ares__round_up_pow2_u64((ares_int64_t)n);
+ }
+
+ return (size_t)ares__round_up_pow2_u32((unsigned int)n);
+}
+
+size_t ares__log2(size_t n)
+{
+ static const unsigned char tab32[32] = { 0, 1, 28, 2, 29, 14, 24, 3,
+ 30, 22, 20, 15, 25, 17, 4, 8,
+ 31, 27, 13, 23, 21, 19, 16, 7,
+ 26, 12, 18, 6, 11, 5, 10, 9 };
+ static const unsigned char tab64[64] = {
+ 63, 0, 58, 1, 59, 47, 53, 2, 60, 39, 48, 27, 54, 33, 42, 3,
+ 61, 51, 37, 40, 49, 18, 28, 20, 55, 30, 34, 11, 43, 14, 22, 4,
+ 62, 57, 46, 52, 38, 26, 32, 41, 50, 36, 17, 19, 29, 10, 13, 21,
+ 56, 45, 25, 31, 35, 16, 9, 12, 44, 24, 15, 8, 23, 7, 6, 5
+ };
+
+ if (sizeof(size_t) == 4) {
+ return tab32[(n * 0x077CB531) >> 27];
+ }
+
+ return tab64[(n * 0x07EDD5E59A4E28C2) >> 58];
+}
+
+/* x^y */
+size_t ares__pow(size_t x, size_t y)
+{
+ size_t res = 1;
+
+ while (y > 0) {
+ /* If y is odd, multiply x with result */
+ if (y & 1) {
+ res = res * x;
+ }
+
+ /* y must be even now */
+ y = y >> 1; /* y /= 2; */
+ x = x * x; /* x^2 */
+ }
+
+ return res;
+}
+
+size_t ares__count_digits(size_t n)
+{
+ size_t digits;
+
+ for (digits = 0; n > 0; digits++) {
+ n /= 10;
+ }
+ if (digits == 0) {
+ digits = 1;
+ }
+
+ return digits;
+}
+
+size_t ares__count_hexdigits(size_t n)
+{
+ size_t digits;
+
+ for (digits = 0; n > 0; digits++) {
+ n /= 16;
+ }
+ if (digits == 0) {
+ digits = 1;
+ }
+
+ return digits;
+}
+
+unsigned char ares__count_bits_u8(unsigned char x)
+{
+ /* Implementation obtained from:
+ * http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetTable */
+#define B2(n) n, n + 1, n + 1, n + 2
+#define B4(n) B2(n), B2(n + 1), B2(n + 1), B2(n + 2)
+#define B6(n) B4(n), B4(n + 1), B4(n + 1), B4(n + 2)
+ static const unsigned char lookup[256] = { B6(0), B6(1), B6(1), B6(2) };
+ return lookup[x];
+}
diff --git a/contrib/libs/c-ares/src/lib/ares_mkquery.c b/contrib/libs/c-ares/src/lib/ares_mkquery.c
deleted file mode 100644
index da1898e74c..0000000000
--- a/contrib/libs/c-ares/src/lib/ares_mkquery.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/* MIT License
- *
- * Copyright (c) 1998 Massachusetts Institute of Technology
- * Copyright (c) The c-ares project and its contributors
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- * SPDX-License-Identifier: MIT
- */
-
-#include "ares_setup.h"
-#include "ares.h"
-
-int ares_mkquery(const char *name, int dnsclass, int type, unsigned short id,
- int rd, unsigned char **buf, int *buflen)
-{
- return ares_create_query(name, dnsclass, type, id, rd, buf, buflen, 0);
-}
diff --git a/contrib/libs/c-ares/src/lib/ares_nowarn.c b/contrib/libs/c-ares/src/lib/ares_nowarn.c
deleted file mode 100644
index 65cabb37b2..0000000000
--- a/contrib/libs/c-ares/src/lib/ares_nowarn.c
+++ /dev/null
@@ -1,269 +0,0 @@
-/* MIT License
- *
- * Copyright (c) 2010 Daniel Stenberg
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- * SPDX-License-Identifier: MIT
- */
-
-#include "ares_setup.h"
-
-#ifdef HAVE_ASSERT_H
-# include <assert.h>
-#endif
-
-#ifdef HAVE_LIMITS_H
-#include <limits.h>
-#endif
-
-#if defined(__INTEL_COMPILER) && defined(__unix__)
-
-#ifdef HAVE_NETINET_IN_H
-# include <netinet/in.h>
-#endif
-#ifdef HAVE_ARPA_INET_H
-# include <arpa/inet.h>
-#endif
-
-#endif /* __INTEL_COMPILER && __unix__ */
-
-#define BUILDING_ARES_NOWARN_C 1
-
-#include "ares_nowarn.h"
-
-#ifndef HAVE_LIMITS_H
-/* systems without <limits.h> we guess have 16 bit shorts, 32bit ints and
- 32bit longs */
-# define CARES_MASK_SSHORT 0x7FFF
-# define CARES_MASK_USHORT 0xFFFF
-# define CARES_MASK_SINT 0x7FFFFFFF
-# define CARES_MASK_UINT 0xFFFFFFFF
-# define CARES_MASK_SLONG 0x7FFFFFFFL
-# define CARES_MASK_ULONG 0xFFFFFFFFUL
-#else
-# define CARES_MASK_SSHORT SHRT_MAX
-# define CARES_MASK_USHORT USHRT_MAX
-# define CARES_MASK_SINT INT_MAX
-# define CARES_MASK_UINT UINT_MAX
-# define CARES_MASK_SLONG LONG_MAX
-# define CARES_MASK_ULONG ULONG_MAX
-#endif
-
-/*
-** unsigned size_t to signed long
-*/
-
-long aresx_uztosl(size_t uznum)
-{
-#ifdef __INTEL_COMPILER
-# pragma warning(push)
-# pragma warning(disable:810) /* conversion may lose significant bits */
-#endif
-
- return (long)(uznum & (size_t) CARES_MASK_SLONG);
-
-#ifdef __INTEL_COMPILER
-# pragma warning(pop)
-#endif
-}
-
-/*
-** unsigned size_t to signed int
-*/
-
-int aresx_uztosi(size_t uznum)
-{
-#ifdef __INTEL_COMPILER
-# pragma warning(push)
-# pragma warning(disable:810) /* conversion may lose significant bits */
-#endif
-
- return (int)(uznum & (size_t) CARES_MASK_SINT);
-
-#ifdef __INTEL_COMPILER
-# pragma warning(pop)
-#endif
-}
-
-/*
-** unsigned size_t to signed short
-*/
-
-short aresx_uztoss(size_t uznum)
-{
-#ifdef __INTEL_COMPILER
-# pragma warning(push)
-# pragma warning(disable:810) /* conversion may lose significant bits */
-#endif
-
- return (short)(uznum & (size_t) CARES_MASK_SSHORT);
-
-#ifdef __INTEL_COMPILER
-# pragma warning(pop)
-#endif
-}
-
-/*
-** signed int to signed short
-*/
-
-short aresx_sitoss(int sinum)
-{
-#ifdef __INTEL_COMPILER
-# pragma warning(push)
-# pragma warning(disable:810) /* conversion may lose significant bits */
-#endif
-
- DEBUGASSERT(sinum >= 0);
- return (short)(sinum & (int) CARES_MASK_SSHORT);
-
-#ifdef __INTEL_COMPILER
-# pragma warning(pop)
-#endif
-}
-
-/*
-** signed long to signed int
-*/
-
-int aresx_sltosi(long slnum)
-{
-#ifdef __INTEL_COMPILER
-# pragma warning(push)
-# pragma warning(disable:810) /* conversion may lose significant bits */
-#endif
-
- DEBUGASSERT(slnum >= 0);
- return (int)(slnum & (long) CARES_MASK_SINT);
-
-#ifdef __INTEL_COMPILER
-# pragma warning(pop)
-#endif
-}
-
-/*
-** signed ares_ssize_t to signed int
-*/
-
-int aresx_sztosi(ares_ssize_t sznum)
-{
-#ifdef __INTEL_COMPILER
-# pragma warning(push)
-# pragma warning(disable:810) /* conversion may lose significant bits */
-#endif
-
- DEBUGASSERT(sznum >= 0);
- return (int)(sznum & (ares_ssize_t) CARES_MASK_SINT);
-
-#ifdef __INTEL_COMPILER
-# pragma warning(pop)
-#endif
-}
-
-/*
-** signed ares_ssize_t to unsigned int
-*/
-
-unsigned int aresx_sztoui(ares_ssize_t sznum)
-{
-#ifdef __INTEL_COMPILER
-# pragma warning(push)
-# pragma warning(disable:810) /* conversion may lose significant bits */
-#endif
-
- DEBUGASSERT(sznum >= 0);
- return (unsigned int)(sznum & (ares_ssize_t) CARES_MASK_UINT);
-
-#ifdef __INTEL_COMPILER
-# pragma warning(pop)
-#endif
-}
-
-/*
-** signed int to unsigned short
-*/
-
-unsigned short aresx_sitous(int sinum)
-{
-#ifdef __INTEL_COMPILER
-# pragma warning(push)
-# pragma warning(disable:810) /* conversion may lose significant bits */
-#endif
-
- DEBUGASSERT(sinum >= 0);
- return (unsigned short)(sinum & (int) CARES_MASK_USHORT);
-
-#ifdef __INTEL_COMPILER
-# pragma warning(pop)
-#endif
-}
-
-#if defined(__INTEL_COMPILER) && defined(__unix__)
-
-int aresx_FD_ISSET(int fd, fd_set *fdset)
-{
- #pragma warning(push)
- #pragma warning(disable:1469) /* clobber ignored */
- return FD_ISSET(fd, fdset);
- #pragma warning(pop)
-}
-
-void aresx_FD_SET(int fd, fd_set *fdset)
-{
- #pragma warning(push)
- #pragma warning(disable:1469) /* clobber ignored */
- FD_SET(fd, fdset);
- #pragma warning(pop)
-}
-
-void aresx_FD_ZERO(fd_set *fdset)
-{
- #pragma warning(push)
- #pragma warning(disable:593) /* variable was set but never used */
- FD_ZERO(fdset);
- #pragma warning(pop)
-}
-
-unsigned short aresx_htons(unsigned short usnum)
-{
-#if (__INTEL_COMPILER == 910) && defined(__i386__)
- return (unsigned short)(((usnum << 8) & 0xFF00) | ((usnum >> 8) & 0x00FF));
-#else
- #pragma warning(push)
- #pragma warning(disable:810) /* conversion may lose significant bits */
- return htons(usnum);
- #pragma warning(pop)
-#endif
-}
-
-unsigned short aresx_ntohs(unsigned short usnum)
-{
-#if (__INTEL_COMPILER == 910) && defined(__i386__)
- return (unsigned short)(((usnum << 8) & 0xFF00) | ((usnum >> 8) & 0x00FF));
-#else
- #pragma warning(push)
- #pragma warning(disable:810) /* conversion may lose significant bits */
- return ntohs(usnum);
- #pragma warning(pop)
-#endif
-}
-
-#endif /* __INTEL_COMPILER && __unix__ */
diff --git a/contrib/libs/c-ares/src/lib/ares_nowarn.h b/contrib/libs/c-ares/src/lib/ares_nowarn.h
deleted file mode 100644
index 3f5612dbb9..0000000000
--- a/contrib/libs/c-ares/src/lib/ares_nowarn.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/* MIT License
- *
- * Copyright (c) 2010 Daniel Stenberg
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- * SPDX-License-Identifier: MIT
- */
-#ifndef HEADER_CARES_NOWARN_H
-#define HEADER_CARES_NOWARN_H
-
-long aresx_uztosl(size_t uznum);
-int aresx_uztosi(size_t uznum);
-short aresx_uztoss(size_t uznum);
-
-short aresx_sitoss(int sinum);
-
-int aresx_sltosi(long slnum);
-
-int aresx_sztosi(ares_ssize_t sznum);
-
-unsigned int aresx_sztoui(ares_ssize_t sznum);
-
-unsigned short aresx_sitous(int sinum);
-
-#if defined(__INTEL_COMPILER) && defined(__unix__)
-
-int aresx_FD_ISSET(int fd, fd_set *fdset);
-
-void aresx_FD_SET(int fd, fd_set *fdset);
-
-void aresx_FD_ZERO(fd_set *fdset);
-
-unsigned short aresx_htons(unsigned short usnum);
-
-unsigned short aresx_ntohs(unsigned short usnum);
-
-#ifndef BUILDING_ARES_NOWARN_C
-# undef FD_ISSET
-# define FD_ISSET(a,b) aresx_FD_ISSET((a),(b))
-# undef FD_SET
-# define FD_SET(a,b) aresx_FD_SET((a),(b))
-# undef FD_ZERO
-# define FD_ZERO(a) aresx_FD_ZERO((a))
-# undef htons
-# define htons(a) aresx_htons((a))
-# undef ntohs
-# define ntohs(a) aresx_ntohs((a))
-#endif
-
-#endif /* __INTEL_COMPILER && __unix__ */
-
-#endif /* HEADER_CARES_NOWARN_H */
diff --git a/contrib/libs/c-ares/src/lib/ares_options.c b/contrib/libs/c-ares/src/lib/ares_options.c
index 78e16bb5d2..4306242cb2 100644
--- a/contrib/libs/c-ares/src/lib/ares_options.c
+++ b/contrib/libs/c-ares/src/lib/ares_options.c
@@ -36,382 +36,461 @@
#include "ares_inet_net_pton.h"
#include "ares_private.h"
-
-int ares_get_servers(ares_channel channel,
- struct ares_addr_node **servers)
+void ares_destroy_options(struct ares_options *options)
{
- struct ares_addr_node *srvr_head = NULL;
- struct ares_addr_node *srvr_last = NULL;
- struct ares_addr_node *srvr_curr;
- int status = ARES_SUCCESS;
int i;
- if (!channel)
- return ARES_ENODATA;
-
- for (i = 0; i < channel->nservers; i++)
- {
- /* Allocate storage for this server node appending it to the list */
- srvr_curr = ares_malloc_data(ARES_DATATYPE_ADDR_NODE);
- if (!srvr_curr)
- {
- status = ARES_ENOMEM;
- break;
- }
- if (srvr_last)
- {
- srvr_last->next = srvr_curr;
- }
- else
- {
- srvr_head = srvr_curr;
- }
- srvr_last = srvr_curr;
-
- /* Fill this server node data */
- srvr_curr->family = channel->servers[i].addr.family;
- if (srvr_curr->family == AF_INET)
- memcpy(&srvr_curr->addrV4, &channel->servers[i].addr.addrV4,
- sizeof(srvr_curr->addrV4));
- else
- memcpy(&srvr_curr->addrV6, &channel->servers[i].addr.addrV6,
- sizeof(srvr_curr->addrV6));
- }
-
- if (status != ARES_SUCCESS)
- {
- if (srvr_head)
- {
- ares_free_data(srvr_head);
- srvr_head = NULL;
- }
- }
+ ares_free(options->servers);
- *servers = srvr_head;
+ for (i = 0; options->domains && i < options->ndomains; i++) {
+ ares_free(options->domains[i]);
+ }
- return status;
+ ares_free(options->domains);
+ ares_free(options->sortlist);
+ ares_free(options->lookups);
+ ares_free(options->resolvconf_path);
+ ares_free(options->hosts_path);
}
-int ares_get_servers_ports(ares_channel channel,
- struct ares_addr_port_node **servers)
+static struct in_addr *ares_save_opt_servers(ares_channel_t *channel,
+ int *nservers)
{
- struct ares_addr_port_node *srvr_head = NULL;
- struct ares_addr_port_node *srvr_last = NULL;
- struct ares_addr_port_node *srvr_curr;
- int status = ARES_SUCCESS;
- int i;
+ ares__slist_node_t *snode;
+ struct in_addr *out =
+ ares_malloc_zero(ares__slist_len(channel->servers) * sizeof(*out));
- if (!channel)
- return ARES_ENODATA;
+ *nservers = 0;
- for (i = 0; i < channel->nservers; i++)
- {
- /* Allocate storage for this server node appending it to the list */
- srvr_curr = ares_malloc_data(ARES_DATATYPE_ADDR_PORT_NODE);
- if (!srvr_curr)
- {
- status = ARES_ENOMEM;
- break;
- }
- if (srvr_last)
- {
- srvr_last->next = srvr_curr;
- }
- else
- {
- srvr_head = srvr_curr;
- }
- srvr_last = srvr_curr;
-
- /* Fill this server node data */
- srvr_curr->family = channel->servers[i].addr.family;
- srvr_curr->udp_port = ntohs((unsigned short)channel->servers[i].addr.udp_port);
- srvr_curr->tcp_port = ntohs((unsigned short)channel->servers[i].addr.tcp_port);
- if (srvr_curr->family == AF_INET)
- memcpy(&srvr_curr->addrV4, &channel->servers[i].addr.addrV4,
- sizeof(srvr_curr->addrV4));
- else
- memcpy(&srvr_curr->addrV6, &channel->servers[i].addr.addrV6,
- sizeof(srvr_curr->addrV6));
- }
+ if (out == NULL) {
+ return NULL;
+ }
- if (status != ARES_SUCCESS)
- {
- if (srvr_head)
- {
- ares_free_data(srvr_head);
- srvr_head = NULL;
- }
+ for (snode = ares__slist_node_first(channel->servers); snode != NULL;
+ snode = ares__slist_node_next(snode)) {
+ const struct server_state *server = ares__slist_node_val(snode);
+
+ if (server->addr.family != AF_INET) {
+ continue;
}
- *servers = srvr_head;
+ memcpy(&out[*nservers], &server->addr.addr.addr4, sizeof(*out));
+ (*nservers)++;
+ }
- return status;
+ return out;
}
-int ares_set_servers(ares_channel channel,
- struct ares_addr_node *servers)
+/* Save options from initialized channel */
+int ares_save_options(ares_channel_t *channel, struct ares_options *options,
+ int *optmask)
{
- struct ares_addr_node *srvr;
- int num_srvrs = 0;
- int i;
-
- if (ares_library_initialized() != ARES_SUCCESS)
- return ARES_ENOTINITIALIZED; /* LCOV_EXCL_LINE: n/a on non-WinSock */
+ size_t i;
- if (!channel)
+ /* NOTE: We can't zero the whole thing out, this is because the size of the
+ * struct ares_options changes over time, so if someone compiled
+ * with an older version, their struct size might be smaller and
+ * we might overwrite their memory! So using the optmask is critical
+ * here, as they could have only set options they knew about.
+ *
+ * Unfortunately ares_destroy_options() doesn't take an optmask, so
+ * there are a few pointers we *must* zero out otherwise we won't
+ * know if they were allocated or not
+ */
+ options->servers = NULL;
+ options->domains = NULL;
+ options->sortlist = NULL;
+ options->lookups = NULL;
+ options->resolvconf_path = NULL;
+ options->hosts_path = NULL;
+
+ if (!ARES_CONFIG_CHECK(channel)) {
return ARES_ENODATA;
+ }
- if (ares__llist_len(channel->all_queries) != 0)
- return ARES_ENOTIMP;
+ if (channel->optmask & ARES_OPT_FLAGS) {
+ options->flags = (int)channel->flags;
+ }
+
+ /* We convert ARES_OPT_TIMEOUT to ARES_OPT_TIMEOUTMS in
+ * ares__init_by_options() */
+ if (channel->optmask & ARES_OPT_TIMEOUTMS) {
+ options->timeout = (int)channel->timeout;
+ }
+
+ if (channel->optmask & ARES_OPT_TRIES) {
+ options->tries = (int)channel->tries;
+ }
+
+ if (channel->optmask & ARES_OPT_NDOTS) {
+ options->ndots = (int)channel->ndots;
+ }
+
+ if (channel->optmask & ARES_OPT_MAXTIMEOUTMS) {
+ options->maxtimeout = (int)channel->maxtimeout;
+ }
+
+ if (channel->optmask & ARES_OPT_UDP_PORT) {
+ options->udp_port = channel->udp_port;
+ }
+ if (channel->optmask & ARES_OPT_TCP_PORT) {
+ options->tcp_port = channel->tcp_port;
+ }
- ares__destroy_servers_state(channel);
+ if (channel->optmask & ARES_OPT_SOCK_STATE_CB) {
+ options->sock_state_cb = channel->sock_state_cb;
+ options->sock_state_cb_data = channel->sock_state_cb_data;
+ }
- for (srvr = servers; srvr; srvr = srvr->next)
- {
- num_srvrs++;
+ if (channel->optmask & ARES_OPT_SERVERS) {
+ options->servers = ares_save_opt_servers(channel, &options->nservers);
+ if (options->servers == NULL) {
+ return ARES_ENOMEM;
}
+ }
- if (num_srvrs > 0)
- {
- /* Allocate storage for servers state */
- channel->servers = ares_malloc(num_srvrs * sizeof(*channel->servers));
- if (!channel->servers)
- {
+ if (channel->optmask & ARES_OPT_DOMAINS) {
+ options->domains = NULL;
+ if (channel->ndomains) {
+ options->domains = ares_malloc(channel->ndomains * sizeof(char *));
+ if (!options->domains) {
+ return ARES_ENOMEM;
+ }
+
+ for (i = 0; i < channel->ndomains; i++) {
+ options->domains[i] = ares_strdup(channel->domains[i]);
+ if (!options->domains[i]) {
+ options->ndomains = (int)i;
return ARES_ENOMEM;
}
- memset(channel->servers, 0, num_srvrs * sizeof(*channel->servers));
- channel->nservers = num_srvrs;
- /* Fill servers state address data */
- for (i = 0, srvr = servers; srvr; i++, srvr = srvr->next)
- {
- channel->servers[i].addr.family = srvr->family;
- channel->servers[i].addr.udp_port = 0;
- channel->servers[i].addr.tcp_port = 0;
- if (srvr->family == AF_INET)
- memcpy(&channel->servers[i].addr.addrV4, &srvr->addrV4,
- sizeof(srvr->addrV4));
- else
- memcpy(&channel->servers[i].addr.addrV6, &srvr->addrV6,
- sizeof(srvr->addrV6));
- }
- /* Initialize servers state remaining data */
- ares__init_servers_state(channel);
+ }
+ }
+ options->ndomains = (int)channel->ndomains;
+ }
+
+ if (channel->optmask & ARES_OPT_LOOKUPS) {
+ options->lookups = ares_strdup(channel->lookups);
+ if (!options->lookups && channel->lookups) {
+ return ARES_ENOMEM;
+ }
+ }
+
+ if (channel->optmask & ARES_OPT_SORTLIST) {
+ options->sortlist = NULL;
+ if (channel->nsort) {
+ options->sortlist = ares_malloc(channel->nsort * sizeof(struct apattern));
+ if (!options->sortlist) {
+ return ARES_ENOMEM;
+ }
+ for (i = 0; i < channel->nsort; i++) {
+ options->sortlist[i] = channel->sortlist[i];
+ }
+ }
+ options->nsort = (int)channel->nsort;
+ }
+
+ if (channel->optmask & ARES_OPT_RESOLVCONF) {
+ options->resolvconf_path = ares_strdup(channel->resolvconf_path);
+ if (!options->resolvconf_path) {
+ return ARES_ENOMEM;
}
+ }
+
+ if (channel->optmask & ARES_OPT_HOSTS_FILE) {
+ options->hosts_path = ares_strdup(channel->hosts_path);
+ if (!options->hosts_path) {
+ return ARES_ENOMEM;
+ }
+ }
+
+ if (channel->optmask & ARES_OPT_SOCK_SNDBUF &&
+ channel->socket_send_buffer_size > 0) {
+ options->socket_send_buffer_size = channel->socket_send_buffer_size;
+ }
+
+ if (channel->optmask & ARES_OPT_SOCK_RCVBUF &&
+ channel->socket_receive_buffer_size > 0) {
+ options->socket_receive_buffer_size = channel->socket_receive_buffer_size;
+ }
+
+ if (channel->optmask & ARES_OPT_EDNSPSZ) {
+ options->ednspsz = (int)channel->ednspsz;
+ }
+
+ if (channel->optmask & ARES_OPT_UDP_MAX_QUERIES) {
+ options->udp_max_queries = (int)channel->udp_max_queries;
+ }
+
+ if (channel->optmask & ARES_OPT_QUERY_CACHE) {
+ options->qcache_max_ttl = channel->qcache_max_ttl;
+ }
+
+ if (channel->optmask & ARES_OPT_EVENT_THREAD) {
+ options->evsys = channel->evsys;
+ }
+
+ /* Set options for server failover behavior */
+ if (channel->optmask & ARES_OPT_SERVER_FAILOVER) {
+ options->server_failover_opts.retry_chance =
+ channel->server_retry_chance;
+ options->server_failover_opts.retry_delay =
+ channel->server_retry_delay;
+ }
+
+ *optmask = (int)channel->optmask;
return ARES_SUCCESS;
}
-int ares_set_servers_ports(ares_channel channel,
- struct ares_addr_port_node *servers)
+static ares_status_t ares__init_options_servers(ares_channel_t *channel,
+ const struct in_addr *servers,
+ size_t nservers)
{
- struct ares_addr_port_node *srvr;
- int num_srvrs = 0;
- int i;
+ ares__llist_t *slist = NULL;
+ ares_status_t status;
+
+ status = ares_in_addr_to_server_config_llist(servers, nservers, &slist);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
- if (ares_library_initialized() != ARES_SUCCESS)
- return ARES_ENOTINITIALIZED; /* LCOV_EXCL_LINE: n/a on non-WinSock */
+ status = ares__servers_update(channel, slist, ARES_TRUE);
- if (!channel)
+ ares__llist_destroy(slist);
+
+ return status;
+}
+
+ares_status_t ares__init_by_options(ares_channel_t *channel,
+ const struct ares_options *options,
+ int optmask)
+{
+ size_t i;
+
+ if (channel == NULL) {
return ARES_ENODATA;
+ }
- if (ares__llist_len(channel->all_queries) != 0)
- return ARES_ENOTIMP;
+ if (options == NULL) {
+ if (optmask != 0) {
+ return ARES_ENODATA;
+ }
+ return ARES_SUCCESS;
+ }
- ares__destroy_servers_state(channel);
+ /* Easy stuff. */
- for (srvr = servers; srvr; srvr = srvr->next)
- {
- num_srvrs++;
+ /* Event Thread requires threading support and is incompatible with socket
+ * state callbacks */
+ if (optmask & ARES_OPT_EVENT_THREAD) {
+ if (!ares_threadsafety()) {
+ return ARES_ENOTIMP;
}
+ if (optmask & ARES_OPT_SOCK_STATE_CB) {
+ return ARES_EFORMERR;
+ }
+ channel->evsys = options->evsys;
+ }
- if (num_srvrs > 0)
- {
- /* Allocate storage for servers state */
- channel->servers = ares_malloc(num_srvrs * sizeof(*channel->servers));
- if (!channel->servers)
- {
- return ARES_ENOMEM;
- }
- memset(channel->servers, 0, num_srvrs * sizeof(*channel->servers));
- channel->nservers = num_srvrs;
- /* Fill servers state address data */
- for (i = 0, srvr = servers; srvr; i++, srvr = srvr->next)
- {
- channel->servers[i].addr.family = srvr->family;
- channel->servers[i].addr.udp_port = htons((unsigned short)srvr->udp_port);
- channel->servers[i].addr.tcp_port = htons((unsigned short)srvr->tcp_port);
- if (srvr->family == AF_INET)
- memcpy(&channel->servers[i].addr.addrV4, &srvr->addrV4,
- sizeof(srvr->addrV4));
- else
- memcpy(&channel->servers[i].addr.addrV6, &srvr->addrV6,
- sizeof(srvr->addrV6));
- }
- /* Initialize servers state remaining data */
- ares__init_servers_state(channel);
+ if (optmask & ARES_OPT_FLAGS) {
+ channel->flags = (unsigned int)options->flags;
+ }
+
+ if (optmask & ARES_OPT_TIMEOUTMS) {
+ /* Apparently some integrations were passing -1 to tell c-ares to use
+ * the default instead of just omitting the optmask */
+ if (options->timeout <= 0) {
+ optmask &= ~(ARES_OPT_TIMEOUTMS);
+ } else {
+ channel->timeout = (unsigned int)options->timeout;
+ }
+ } else if (optmask & ARES_OPT_TIMEOUT) {
+ optmask &= ~(ARES_OPT_TIMEOUT);
+ /* Apparently some integrations were passing -1 to tell c-ares to use
+ * the default instead of just omitting the optmask */
+ if (options->timeout > 0) {
+ /* Convert to milliseconds */
+ optmask |= ARES_OPT_TIMEOUTMS;
+ channel->timeout = (unsigned int)options->timeout * 1000;
}
+ }
- return ARES_SUCCESS;
-}
+ if (optmask & ARES_OPT_TRIES) {
+ if (options->tries <= 0) {
+ optmask &= ~(ARES_OPT_TRIES);
+ } else {
+ channel->tries = (size_t)options->tries;
+ }
+ }
-/* Incomming string format: host[:port][,host[:port]]... */
-/* IPv6 addresses with ports require square brackets [fe80::1%lo0]:53 */
-static int set_servers_csv(ares_channel channel,
- const char* _csv, int use_port)
-{
- size_t i;
- char* csv = NULL;
- char* ptr;
- char* start_host;
- int cc = 0;
- int rv = ARES_SUCCESS;
- struct ares_addr_port_node *servers = NULL;
- struct ares_addr_port_node *last = NULL;
-
- if (ares_library_initialized() != ARES_SUCCESS)
- return ARES_ENOTINITIALIZED; /* LCOV_EXCL_LINE: n/a on non-WinSock */
-
- if (!channel)
- return ARES_ENODATA;
+ if (optmask & ARES_OPT_NDOTS) {
+ if (options->ndots < 0) {
+ optmask &= ~(ARES_OPT_NDOTS);
+ } else {
+ channel->ndots = (size_t)options->ndots;
+ }
+ }
+
+ if (optmask & ARES_OPT_MAXTIMEOUTMS) {
+ if (options->maxtimeout <= 0) {
+ optmask &= ~(ARES_OPT_MAXTIMEOUTMS);
+ } else {
+ channel->maxtimeout = (size_t)options->maxtimeout;
+ }
+ }
+
+ if (optmask & ARES_OPT_ROTATE) {
+ channel->rotate = ARES_TRUE;
+ }
+
+ if (optmask & ARES_OPT_NOROTATE) {
+ channel->rotate = ARES_FALSE;
+ }
+
+ if (optmask & ARES_OPT_UDP_PORT) {
+ channel->udp_port = options->udp_port;
+ }
+
+ if (optmask & ARES_OPT_TCP_PORT) {
+ channel->tcp_port = options->tcp_port;
+ }
- i = strlen(_csv);
- if (i == 0)
- return ARES_SUCCESS; /* blank all servers */
+ if (optmask & ARES_OPT_SOCK_STATE_CB) {
+ channel->sock_state_cb = options->sock_state_cb;
+ channel->sock_state_cb_data = options->sock_state_cb_data;
+ }
- csv = ares_malloc(i + 2);
- if (!csv)
- return ARES_ENOMEM;
+ if (optmask & ARES_OPT_SOCK_SNDBUF) {
+ if (options->socket_send_buffer_size <= 0) {
+ optmask &= ~(ARES_OPT_SOCK_SNDBUF);
+ } else {
+ channel->socket_send_buffer_size = options->socket_send_buffer_size;
+ }
+ }
- strcpy(csv, _csv);
- if (csv[i-1] != ',') { /* make parsing easier by ensuring ending ',' */
- csv[i] = ',';
- csv[i+1] = 0;
+ if (optmask & ARES_OPT_SOCK_RCVBUF) {
+ if (options->socket_receive_buffer_size <= 0) {
+ optmask &= ~(ARES_OPT_SOCK_RCVBUF);
+ } else {
+ channel->socket_receive_buffer_size = options->socket_receive_buffer_size;
+ }
}
- start_host = csv;
- for (ptr = csv; *ptr; ptr++) {
- if (*ptr == ':') {
- /* count colons to determine if we have an IPv6 number or IPv4 with
- port */
- cc++;
+ if (optmask & ARES_OPT_EDNSPSZ) {
+ if (options->ednspsz <= 0) {
+ optmask &= ~(ARES_OPT_EDNSPSZ);
+ } else {
+ channel->ednspsz = (size_t)options->ednspsz;
}
- else if (*ptr == '[') {
- /* move start_host if an open square bracket is found wrapping an IPv6
- address */
- start_host = ptr + 1;
+ }
+
+ /* Copy the domains, if given. Keep channel->ndomains consistent so
+ * we can clean up in case of error.
+ */
+ if (optmask & ARES_OPT_DOMAINS && options->ndomains > 0) {
+ channel->domains =
+ ares_malloc_zero((size_t)options->ndomains * sizeof(char *));
+ if (!channel->domains) {
+ return ARES_ENOMEM;
}
- else if (*ptr == ',') {
- char* pp = ptr - 1;
- char* p = ptr;
- int port = 0;
- struct in_addr in4;
- struct ares_in6_addr in6;
- struct ares_addr_port_node *s = NULL;
-
- *ptr = 0; /* null terminate host:port string */
- /* Got an entry..see if the port was specified. */
- if (cc > 0) {
- while (pp > start_host) {
- /* a single close square bracket followed by a colon, ']:' indicates
- an IPv6 address with port */
- if ((*pp == ']') && (*p == ':'))
- break; /* found port */
- /* a single colon, ':' indicates an IPv4 address with port */
- if ((*pp == ':') && (cc == 1))
- break; /* found port */
- if (!(ISDIGIT(*pp) || (*pp == ':'))) {
- /* Found end of digits before we found :, so wasn't a port */
- /* must allow ':' for IPv6 case of ']:' indicates we found a port */
- pp = p = ptr;
- break;
- }
- pp--;
- p--;
- }
- if ((pp != start_host) && ((pp + 1) < ptr)) {
- /* Found it. Parse over the port number */
- /* when an IPv6 address is wrapped with square brackets the port
- starts at pp + 2 */
- if (*pp == ']')
- p++; /* move p before ':' */
- /* p will point to the start of the port */
- port = (int)strtol(p, NULL, 10);
- *pp = 0; /* null terminate host */
- }
+ channel->ndomains = (size_t)options->ndomains;
+ for (i = 0; i < (size_t)options->ndomains; i++) {
+ channel->domains[i] = ares_strdup(options->domains[i]);
+ if (!channel->domains[i]) {
+ return ARES_ENOMEM;
}
- /* resolve host, try ipv4 first, rslt is in network byte order */
- rv = ares_inet_pton(AF_INET, start_host, &in4);
- if (!rv) {
- /* Ok, try IPv6 then */
- rv = ares_inet_pton(AF_INET6, start_host, &in6);
- if (!rv) {
- rv = ARES_EBADSTR;
- goto out;
- }
- /* was ipv6, add new server */
- s = ares_malloc(sizeof(*s));
- if (!s) {
- rv = ARES_ENOMEM;
- goto out;
- }
- s->family = AF_INET6;
- memcpy(&s->addr, &in6, sizeof(struct ares_in6_addr));
+ }
+ }
+
+ /* Set lookups, if given. */
+ if (optmask & ARES_OPT_LOOKUPS) {
+ if (options->lookups == NULL) {
+ optmask &= ~(ARES_OPT_LOOKUPS);
+ } else {
+ channel->lookups = ares_strdup(options->lookups);
+ if (!channel->lookups) {
+ return ARES_ENOMEM;
}
- else {
- /* was ipv4, add new server */
- s = ares_malloc(sizeof(*s));
- if (!s) {
- rv = ARES_ENOMEM;
- goto out;
- }
- s->family = AF_INET;
- memcpy(&s->addr, &in4, sizeof(struct in_addr));
+ }
+ }
+
+ /* copy sortlist */
+ if (optmask & ARES_OPT_SORTLIST && options->nsort > 0) {
+ channel->nsort = (size_t)options->nsort;
+ channel->sortlist =
+ ares_malloc((size_t)options->nsort * sizeof(struct apattern));
+ if (!channel->sortlist) {
+ return ARES_ENOMEM;
+ }
+ for (i = 0; i < (size_t)options->nsort; i++) {
+ channel->sortlist[i] = options->sortlist[i];
+ }
+ }
+
+ /* Set path for resolv.conf file, if given. */
+ if (optmask & ARES_OPT_RESOLVCONF) {
+ if (options->resolvconf_path == NULL) {
+ optmask &= ~(ARES_OPT_RESOLVCONF);
+ } else {
+ channel->resolvconf_path = ares_strdup(options->resolvconf_path);
+ if (channel->resolvconf_path == NULL) {
+ return ARES_ENOMEM;
}
- if (s) {
- s->udp_port = use_port ? port: 0;
- s->tcp_port = s->udp_port;
- s->next = NULL;
- if (last) {
- last->next = s;
- /* need to move last to maintain the linked list */
- last = last->next;
- }
- else {
- servers = s;
- last = s;
- }
+ }
+ }
+
+ /* Set path for hosts file, if given. */
+ if (optmask & ARES_OPT_HOSTS_FILE) {
+ if (options->hosts_path == NULL) {
+ optmask &= ~(ARES_OPT_HOSTS_FILE);
+ } else {
+ channel->hosts_path = ares_strdup(options->hosts_path);
+ if (channel->hosts_path == NULL) {
+ return ARES_ENOMEM;
}
+ }
+ }
- /* Set up for next one */
- start_host = ptr + 1;
- cc = 0;
+ if (optmask & ARES_OPT_UDP_MAX_QUERIES) {
+ if (options->udp_max_queries <= 0) {
+ optmask &= ~(ARES_OPT_UDP_MAX_QUERIES);
+ } else {
+ channel->udp_max_queries = (size_t)options->udp_max_queries;
}
}
- rv = ares_set_servers_ports(channel, servers);
+ if (optmask & ARES_OPT_QUERY_CACHE) {
+ /* qcache_max_ttl is unsigned unlike the others */
+ if (options->qcache_max_ttl == 0) {
+ optmask &= ~(ARES_OPT_QUERY_CACHE);
+ } else {
+ channel->qcache_max_ttl = options->qcache_max_ttl;
+ }
+ }
- out:
- if (csv)
- ares_free(csv);
- while (servers) {
- struct ares_addr_port_node *s = servers;
- servers = servers->next;
- ares_free(s);
+ /* Initialize the ipv4 servers if provided */
+ if (optmask & ARES_OPT_SERVERS) {
+ if (options->nservers <= 0) {
+ optmask &= ~(ARES_OPT_SERVERS);
+ } else {
+ ares_status_t status;
+ status = ares__init_options_servers(channel, options->servers,
+ (size_t)options->nservers);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
}
- return rv;
-}
+ /* Set fields for server failover behavior */
+ if (optmask & ARES_OPT_SERVER_FAILOVER) {
+ channel->server_retry_chance =
+ options->server_failover_opts.retry_chance;
+ channel->server_retry_delay =
+ options->server_failover_opts.retry_delay;
+ }
-int ares_set_servers_csv(ares_channel channel,
- const char* _csv)
-{
- return set_servers_csv(channel, _csv, FALSE);
-}
+ channel->optmask = (unsigned int)optmask;
-int ares_set_servers_ports_csv(ares_channel channel,
- const char* _csv)
-{
- return set_servers_csv(channel, _csv, TRUE);
+ return ARES_SUCCESS;
}
-
diff --git a/contrib/libs/c-ares/src/lib/ares_parse_a_reply.c b/contrib/libs/c-ares/src/lib/ares_parse_a_reply.c
index b50dea3884..da841f0da9 100644
--- a/contrib/libs/c-ares/src/lib/ares_parse_a_reply.c
+++ b/contrib/libs/c-ares/src/lib/ares_parse_a_reply.c
@@ -56,38 +56,45 @@ int ares_parse_a_reply(const unsigned char *abuf, int alen,
int *naddrttls)
{
struct ares_addrinfo ai;
- char *question_hostname = NULL;
- int status;
- int req_naddrttls = 0;
-
- if (naddrttls)
- {
- req_naddrttls = *naddrttls;
- *naddrttls = 0;
- }
+ char *question_hostname = NULL;
+ ares_status_t status;
+ size_t req_naddrttls = 0;
+ ares_dns_record_t *dnsrec = NULL;
+
+ if (alen < 0) {
+ return ARES_EBADRESP;
+ }
+
+ if (naddrttls) {
+ req_naddrttls = (size_t)*naddrttls;
+ *naddrttls = 0;
+ }
memset(&ai, 0, sizeof(ai));
- status = ares__parse_into_addrinfo(abuf, alen, 0, 0, &ai);
- if (status != ARES_SUCCESS && status != ARES_ENODATA)
- {
- goto fail;
- }
+ status = ares_dns_parse(abuf, (size_t)alen, 0, &dnsrec);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ status = ares__parse_into_addrinfo(dnsrec, 0, 0, &ai);
+ if (status != ARES_SUCCESS && status != ARES_ENODATA) {
+ goto fail;
+ }
- if (host != NULL)
- {
- status = ares__addrinfo2hostent(&ai, AF_INET, host);
- if (status != ARES_SUCCESS && status != ARES_ENODATA)
- {
- goto fail;
- }
+ if (host != NULL) {
+ status = ares__addrinfo2hostent(&ai, AF_INET, host);
+ if (status != ARES_SUCCESS && status != ARES_ENODATA) {
+ goto fail;
}
+ }
- if (addrttls != NULL && req_naddrttls)
- {
- ares__addrinfo2addrttl(&ai, AF_INET, req_naddrttls, addrttls,
- NULL, naddrttls);
- }
+ if (addrttls != NULL && req_naddrttls) {
+ size_t temp_naddrttls = 0;
+ ares__addrinfo2addrttl(&ai, AF_INET, req_naddrttls, addrttls, NULL,
+ &temp_naddrttls);
+ *naddrttls = (int)temp_naddrttls;
+ }
fail:
@@ -95,6 +102,11 @@ fail:
ares__freeaddrinfo_nodes(ai.nodes);
ares_free(ai.name);
ares_free(question_hostname);
+ ares_dns_record_destroy(dnsrec);
+
+ if (status == ARES_EBADNAME) {
+ status = ARES_EBADRESP;
+ }
- return status;
+ return (int)status;
}
diff --git a/contrib/libs/c-ares/src/lib/ares_parse_aaaa_reply.c b/contrib/libs/c-ares/src/lib/ares_parse_aaaa_reply.c
index 7a839829eb..b3eba166be 100644
--- a/contrib/libs/c-ares/src/lib/ares_parse_aaaa_reply.c
+++ b/contrib/libs/c-ares/src/lib/ares_parse_aaaa_reply.c
@@ -58,45 +58,56 @@ int ares_parse_aaaa_reply(const unsigned char *abuf, int alen,
int *naddrttls)
{
struct ares_addrinfo ai;
- char *question_hostname = NULL;
- int status;
- int req_naddrttls = 0;
-
- if (naddrttls)
- {
- req_naddrttls = *naddrttls;
- *naddrttls = 0;
- }
+ char *question_hostname = NULL;
+ ares_status_t status;
+ size_t req_naddrttls = 0;
+ ares_dns_record_t *dnsrec = NULL;
+
+ if (alen < 0) {
+ return ARES_EBADRESP;
+ }
+
+ if (naddrttls) {
+ req_naddrttls = (size_t)*naddrttls;
+ *naddrttls = 0;
+ }
memset(&ai, 0, sizeof(ai));
- status = ares__parse_into_addrinfo(abuf, alen, 0, 0, &ai);
- if (status != ARES_SUCCESS && status != ARES_ENODATA)
- {
- goto fail;
- }
+ status = ares_dns_parse(abuf, (size_t)alen, 0, &dnsrec);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
- if (host != NULL)
- {
- status = ares__addrinfo2hostent(&ai, AF_INET6, host);
- if (status != ARES_SUCCESS && status != ARES_ENODATA)
- {
- goto fail;
- }
+ status = ares__parse_into_addrinfo(dnsrec, 0, 0, &ai);
+ if (status != ARES_SUCCESS && status != ARES_ENODATA) {
+ goto fail;
+ }
+
+ if (host != NULL) {
+ status = ares__addrinfo2hostent(&ai, AF_INET6, host);
+ if (status != ARES_SUCCESS && status != ARES_ENODATA) {
+ goto fail;
}
+ }
- if (addrttls != NULL && req_naddrttls)
- {
- ares__addrinfo2addrttl(&ai, AF_INET6, req_naddrttls, NULL,
- addrttls, naddrttls);
- }
+ if (addrttls != NULL && req_naddrttls) {
+ size_t temp_naddrttls = 0;
+ ares__addrinfo2addrttl(&ai, AF_INET6, req_naddrttls, NULL, addrttls,
+ &temp_naddrttls);
+ *naddrttls = (int)temp_naddrttls;
+ }
fail:
ares__freeaddrinfo_cnames(ai.cnames);
ares__freeaddrinfo_nodes(ai.nodes);
ares_free(question_hostname);
ares_free(ai.name);
+ ares_dns_record_destroy(dnsrec);
- return status;
-}
+ if (status == ARES_EBADNAME) {
+ status = ARES_EBADRESP;
+ }
+ return (int)status;
+}
diff --git a/contrib/libs/c-ares/src/lib/ares_parse_caa_reply.c b/contrib/libs/c-ares/src/lib/ares_parse_caa_reply.c
index f4581c124a..6c30305ee1 100644
--- a/contrib/libs/c-ares/src/lib/ares_parse_caa_reply.c
+++ b/contrib/libs/c-ares/src/lib/ares_parse_caa_reply.c
@@ -1,6 +1,6 @@
/* MIT License
*
- * Copyright (c) The c-ares project and its contributors
+ * Copyright (c) 2023 Brad House
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -24,210 +24,116 @@
* SPDX-License-Identifier: MIT
*/
-/* =============================================================================
- * NOTE: The below copyright is preserved from the original author. In
- * October 2023, there were attempts made to contact the author in order
- * gain approval for relicensing to the modern MIT license from the
- * below 1989 variant, but all contact information for the author is
- * no longer valid.
- *
- * Copyright (c) 2020 <danny.sonnenschein@platynum.ch>
- *
- * Permission to use, copy, modify, and distribute this
- * software and its documentation for any purpose and without
- * fee is hereby granted, provided that the above copyright
- * notice appear in all copies and that both that copyright
- * notice and this permission notice appear in supporting
- * documentation, and that the name of M.I.T. not be used in
- * advertising or publicity pertaining to distribution of the
- * software without specific, written prior permission.
- * M.I.T. makes no representations about the suitability of
- * this software for any purpose. It is provided "as is"
- * without express or implied warranty.
- *
- * =============================================================================
- */
-
#include "ares_setup.h"
-
-#ifdef HAVE_NETINET_IN_H
-# include <netinet/in.h>
-#endif
-#ifdef HAVE_NETDB_H
-# include <netdb.h>
-#endif
-#ifdef HAVE_ARPA_INET_H
-# include <arpa/inet.h>
-#endif
-
-#include "ares_nameser.h"
-
-#ifdef HAVE_STRINGS_H
-# include <strings.h>
-#endif
-
#include "ares.h"
-#include "ares_dns.h"
#include "ares_data.h"
#include "ares_private.h"
-int
-ares_parse_caa_reply (const unsigned char *abuf, int alen,
- struct ares_caa_reply **caa_out)
+int ares_parse_caa_reply(const unsigned char *abuf, int alen_int,
+ struct ares_caa_reply **caa_out)
{
- unsigned int qdcount, ancount, i;
- const unsigned char *aptr;
- const unsigned char *strptr;
- int status, rr_type, rr_class, rr_len;
- long len;
- char *hostname = NULL, *rr_name = NULL;
+ ares_status_t status;
+ size_t alen;
struct ares_caa_reply *caa_head = NULL;
struct ares_caa_reply *caa_last = NULL;
struct ares_caa_reply *caa_curr;
+ ares_dns_record_t *dnsrec = NULL;
+ size_t i;
- /* Set *caa_out to NULL for all failure cases. */
*caa_out = NULL;
- /* Give up if abuf doesn't have room for a header. */
- if (alen < HFIXEDSZ)
+ if (alen_int < 0) {
return ARES_EBADRESP;
+ }
+
+ alen = (size_t)alen_int;
+
+ status = ares_dns_parse(abuf, alen, 0, &dnsrec);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ if (ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER) == 0) {
+ status = ARES_ENODATA;
+ goto done;
+ }
+
+ for (i = 0; i < ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER); i++) {
+ const unsigned char *ptr;
+ size_t ptr_len;
+ const ares_dns_rr_t *rr =
+ ares_dns_record_rr_get(dnsrec, ARES_SECTION_ANSWER, i);
+
+ if (rr == NULL) {
+ /* Shouldn't be possible */
+ status = ARES_EBADRESP;
+ goto done;
+ }
- /* Fetch the question and answer count from the header. */
- qdcount = DNS_HEADER_QDCOUNT (abuf);
- ancount = DNS_HEADER_ANCOUNT (abuf);
- if (qdcount != 1)
- return ARES_EBADRESP;
- if (ancount == 0)
- return ARES_ENODATA;
-
- /* Expand the name from the question, and skip past the question. */
- aptr = abuf + HFIXEDSZ;
- status = ares_expand_name (aptr, abuf, alen, &hostname, &len);
- if (status != ARES_SUCCESS)
- return status;
-
- if (aptr + len + QFIXEDSZ > abuf + alen)
- {
- ares_free (hostname);
- return ARES_EBADRESP;
+ /* XXX: Why do we allow Chaos class? */
+ if (ares_dns_rr_get_class(rr) != ARES_CLASS_IN &&
+ ares_dns_rr_get_class(rr) != ARES_CLASS_CHAOS) {
+ continue;
}
- aptr += len + QFIXEDSZ;
-
- /* Examine each answer resource record (RR) in turn. */
- for (i = 0; i < ancount; i++)
- {
- /* Decode the RR up to the data field. */
- status = ares_expand_name (aptr, abuf, alen, &rr_name, &len);
- if (status != ARES_SUCCESS)
- {
- break;
- }
- aptr += len;
- if (aptr + RRFIXEDSZ > abuf + alen)
- {
- status = ARES_EBADRESP;
- break;
- }
- rr_type = DNS_RR_TYPE (aptr);
- rr_class = DNS_RR_CLASS (aptr);
- rr_len = DNS_RR_LEN (aptr);
- aptr += RRFIXEDSZ;
- if (aptr + rr_len > abuf + alen)
- {
- status = ARES_EBADRESP;
- break;
- }
-
- /* Check if we are really looking at a CAA record */
- if ((rr_class == C_IN || rr_class == C_CHAOS) && rr_type == T_CAA)
- {
- strptr = aptr;
-
- /* Allocate storage for this CAA answer appending it to the list */
- caa_curr = ares_malloc_data(ARES_DATATYPE_CAA_REPLY);
- if (!caa_curr)
- {
- status = ARES_ENOMEM;
- break;
- }
- if (caa_last)
- {
- caa_last->next = caa_curr;
- }
- else
- {
- caa_head = caa_curr;
- }
- caa_last = caa_curr;
- if (rr_len < 2)
- {
- status = ARES_EBADRESP;
- break;
- }
- caa_curr->critical = (int)*strptr++;
- caa_curr->plength = (int)*strptr++;
- if (caa_curr->plength <= 0 || (int)caa_curr->plength >= rr_len - 2)
- {
- status = ARES_EBADRESP;
- break;
- }
- caa_curr->property = ares_malloc (caa_curr->plength + 1/* Including null byte */);
- if (caa_curr->property == NULL)
- {
- status = ARES_ENOMEM;
- break;
- }
- memcpy ((char *) caa_curr->property, strptr, caa_curr->plength);
- /* Make sure we NULL-terminate */
- caa_curr->property[caa_curr->plength] = 0;
- strptr += caa_curr->plength;
-
- caa_curr->length = rr_len - caa_curr->plength - 2;
- if (caa_curr->length <= 0)
- {
- status = ARES_EBADRESP;
- break;
- }
- caa_curr->value = ares_malloc (caa_curr->length + 1/* Including null byte */);
- if (caa_curr->value == NULL)
- {
- status = ARES_ENOMEM;
- break;
- }
- memcpy ((char *) caa_curr->value, strptr, caa_curr->length);
- /* Make sure we NULL-terminate */
- caa_curr->value[caa_curr->length] = 0;
- }
-
- /* Propagate any failures */
- if (status != ARES_SUCCESS)
- {
- break;
- }
-
- /* Don't lose memory in the next iteration */
- ares_free (rr_name);
- rr_name = NULL;
-
- /* Move on to the next record */
- aptr += rr_len;
+
+ /* Only looking for CAA records */
+ if (ares_dns_rr_get_type(rr) != ARES_REC_TYPE_CAA) {
+ continue;
}
- if (hostname)
- ares_free (hostname);
- if (rr_name)
- ares_free (rr_name);
+ /* Allocate storage for this CAA answer appending it to the list */
+ caa_curr = ares_malloc_data(ARES_DATATYPE_CAA_REPLY);
+ if (caa_curr == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
- /* clean up on error */
- if (status != ARES_SUCCESS)
- {
- if (caa_head)
- ares_free_data (caa_head);
- return status;
+ /* Link in the record */
+ if (caa_last) {
+ caa_last->next = caa_curr;
+ } else {
+ caa_head = caa_curr;
+ }
+ caa_last = caa_curr;
+
+ caa_curr->critical = ares_dns_rr_get_u8(rr, ARES_RR_CAA_CRITICAL);
+ caa_curr->property =
+ (unsigned char *)ares_strdup(ares_dns_rr_get_str(rr, ARES_RR_CAA_TAG));
+ if (caa_curr->property == NULL) {
+ status = ARES_ENOMEM;
+ break;
+ }
+ /* RFC6844 says this can only be ascii, so not sure why we're recording a
+ * length */
+ caa_curr->plength = ares_strlen((const char *)caa_curr->property);
+
+ ptr = ares_dns_rr_get_bin(rr, ARES_RR_CAA_VALUE, &ptr_len);
+ if (ptr == NULL) {
+ status = ARES_EBADRESP;
+ goto done;
}
- /* everything looks fine, return the data */
- *caa_out = caa_head;
+ /* Wants NULL termination for some reason */
+ caa_curr->value = ares_malloc(ptr_len + 1);
+ if (caa_curr->value == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ memcpy(caa_curr->value, ptr, ptr_len);
+ caa_curr->value[ptr_len] = 0;
+ caa_curr->length = ptr_len;
+ }
- return ARES_SUCCESS;
+done:
+ /* clean up on error */
+ if (status != ARES_SUCCESS) {
+ if (caa_head) {
+ ares_free_data(caa_head);
+ }
+ } else {
+ /* everything looks fine, return the data */
+ *caa_out = caa_head;
+ }
+ ares_dns_record_destroy(dnsrec);
+ return (int)status;
}
diff --git a/contrib/libs/c-ares/src/lib/ares_parse_mx_reply.c b/contrib/libs/c-ares/src/lib/ares_parse_mx_reply.c
index 36dfe3d933..db7155d2e8 100644
--- a/contrib/libs/c-ares/src/lib/ares_parse_mx_reply.c
+++ b/contrib/libs/c-ares/src/lib/ares_parse_mx_reply.c
@@ -1,7 +1,6 @@
/* MIT License
*
- * Copyright (c) 1998 Massachusetts Institute of Technology
- * Copyright (c) 2010 Jeremy Lal
+ * Copyright (c) 2023 Brad House
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -26,149 +25,88 @@
*/
#include "ares_setup.h"
-
-#ifdef HAVE_NETINET_IN_H
-# include <netinet/in.h>
-#endif
-#ifdef HAVE_NETDB_H
-# include <netdb.h>
-#endif
-#ifdef HAVE_ARPA_INET_H
-# include <arpa/inet.h>
-#endif
-
-#include "ares_nameser.h"
-
#include "ares.h"
-#include "ares_dns.h"
#include "ares_data.h"
#include "ares_private.h"
-int
-ares_parse_mx_reply (const unsigned char *abuf, int alen,
- struct ares_mx_reply **mx_out)
+int ares_parse_mx_reply(const unsigned char *abuf, int alen_int,
+ struct ares_mx_reply **mx_out)
{
- unsigned int qdcount, ancount, i;
- const unsigned char *aptr, *vptr;
- int status, rr_type, rr_class, rr_len;
- long len;
- char *hostname = NULL, *rr_name = NULL;
+ ares_status_t status;
+ size_t alen;
struct ares_mx_reply *mx_head = NULL;
struct ares_mx_reply *mx_last = NULL;
struct ares_mx_reply *mx_curr;
+ ares_dns_record_t *dnsrec = NULL;
+ size_t i;
- /* Set *mx_out to NULL for all failure cases. */
*mx_out = NULL;
- /* Give up if abuf doesn't have room for a header. */
- if (alen < HFIXEDSZ)
+ if (alen_int < 0) {
return ARES_EBADRESP;
+ }
- /* Fetch the question and answer count from the header. */
- qdcount = DNS_HEADER_QDCOUNT (abuf);
- ancount = DNS_HEADER_ANCOUNT (abuf);
- if (qdcount != 1)
- return ARES_EBADRESP;
- if (ancount == 0)
- return ARES_ENODATA;
+ alen = (size_t)alen_int;
- /* Expand the name from the question, and skip past the question. */
- aptr = abuf + HFIXEDSZ;
- status = ares_expand_name (aptr, abuf, alen, &hostname, &len);
- if (status != ARES_SUCCESS)
- return status;
+ status = ares_dns_parse(abuf, alen, 0, &dnsrec);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
- if (aptr + len + QFIXEDSZ > abuf + alen)
- {
- ares_free (hostname);
- return ARES_EBADRESP;
- }
- aptr += len + QFIXEDSZ;
+ if (ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER) == 0) {
+ status = ARES_ENODATA;
+ goto done;
+ }
- /* Examine each answer resource record (RR) in turn. */
- for (i = 0; i < ancount; i++)
- {
- /* Decode the RR up to the data field. */
- status = ares_expand_name (aptr, abuf, alen, &rr_name, &len);
- if (status != ARES_SUCCESS)
- {
- break;
- }
- aptr += len;
- if (aptr + RRFIXEDSZ > abuf + alen)
- {
- status = ARES_EBADRESP;
- break;
- }
- rr_type = DNS_RR_TYPE (aptr);
- rr_class = DNS_RR_CLASS (aptr);
- rr_len = DNS_RR_LEN (aptr);
- aptr += RRFIXEDSZ;
- if (aptr + rr_len > abuf + alen)
- {
- status = ARES_EBADRESP;
- break;
- }
+ for (i = 0; i < ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER); i++) {
+ const ares_dns_rr_t *rr =
+ ares_dns_record_rr_get(dnsrec, ARES_SECTION_ANSWER, i);
- /* Check if we are really looking at a MX record */
- if (rr_class == C_IN && rr_type == T_MX)
- {
- /* parse the MX record itself */
- if (rr_len < 2)
- {
- status = ARES_EBADRESP;
- break;
- }
+ if (rr == NULL) {
+ /* Shouldn't be possible */
+ status = ARES_EBADRESP;
+ goto done;
+ }
- /* Allocate storage for this MX answer appending it to the list */
- mx_curr = ares_malloc_data(ARES_DATATYPE_MX_REPLY);
- if (!mx_curr)
- {
- status = ARES_ENOMEM;
- break;
- }
- if (mx_last)
- {
- mx_last->next = mx_curr;
- }
- else
- {
- mx_head = mx_curr;
- }
- mx_last = mx_curr;
+ if (ares_dns_rr_get_class(rr) != ARES_CLASS_IN ||
+ ares_dns_rr_get_type(rr) != ARES_REC_TYPE_MX) {
+ continue;
+ }
- vptr = aptr;
- mx_curr->priority = DNS__16BIT(vptr);
- vptr += sizeof(unsigned short);
+ /* Allocate storage for this MX answer appending it to the list */
+ mx_curr = ares_malloc_data(ARES_DATATYPE_MX_REPLY);
+ if (mx_curr == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
- status = ares_expand_name (vptr, abuf, alen, &mx_curr->host, &len);
- if (status != ARES_SUCCESS)
- break;
- }
+ /* Link in the record */
+ if (mx_last) {
+ mx_last->next = mx_curr;
+ } else {
+ mx_head = mx_curr;
+ }
+ mx_last = mx_curr;
- /* Don't lose memory in the next iteration */
- ares_free (rr_name);
- rr_name = NULL;
+ mx_curr->priority = ares_dns_rr_get_u16(rr, ARES_RR_MX_PREFERENCE);
+ mx_curr->host = ares_strdup(ares_dns_rr_get_str(rr, ARES_RR_MX_EXCHANGE));
- /* Move on to the next record */
- aptr += rr_len;
+ if (mx_curr->host == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
}
+ }
- if (hostname)
- ares_free (hostname);
- if (rr_name)
- ares_free (rr_name);
-
+done:
/* clean up on error */
- if (status != ARES_SUCCESS)
- {
- if (mx_head)
- ares_free_data (mx_head);
- return status;
+ if (status != ARES_SUCCESS) {
+ if (mx_head) {
+ ares_free_data(mx_head);
}
-
- /* everything looks fine, return the data */
- *mx_out = mx_head;
-
- return ARES_SUCCESS;
+ } else {
+ /* everything looks fine, return the data */
+ *mx_out = mx_head;
+ }
+ ares_dns_record_destroy(dnsrec);
+ return (int)status;
}
diff --git a/contrib/libs/c-ares/src/lib/ares_parse_naptr_reply.c b/contrib/libs/c-ares/src/lib/ares_parse_naptr_reply.c
index 81dfb02a2a..1a304ccdd3 100644
--- a/contrib/libs/c-ares/src/lib/ares_parse_naptr_reply.c
+++ b/contrib/libs/c-ares/src/lib/ares_parse_naptr_reply.c
@@ -1,7 +1,6 @@
/* MIT License
*
- * Copyright (c) 1998 Massachusetts Institute of Technology
- * Copyright (c) 2009 Jakub Hrozek
+ * Copyright (c) 2023 Brad House
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -25,168 +24,111 @@
* SPDX-License-Identifier: MIT
*/
#include "ares_setup.h"
-
-#ifdef HAVE_NETINET_IN_H
-# include <netinet/in.h>
-#endif
-#ifdef HAVE_NETDB_H
-# include <netdb.h>
-#endif
-#ifdef HAVE_ARPA_INET_H
-# include <arpa/inet.h>
-#endif
-
-#include "ares_nameser.h"
-
#include "ares.h"
-#include "ares_dns.h"
#include "ares_data.h"
#include "ares_private.h"
-int
-ares_parse_naptr_reply (const unsigned char *abuf, int alen,
- struct ares_naptr_reply **naptr_out)
+int ares_parse_naptr_reply(const unsigned char *abuf, int alen_int,
+ struct ares_naptr_reply **naptr_out)
{
- unsigned int qdcount, ancount, i;
- const unsigned char *aptr, *vptr;
- int status, rr_type, rr_class, rr_len;
- long len;
- char *hostname = NULL, *rr_name = NULL;
+ ares_status_t status;
+ size_t alen;
struct ares_naptr_reply *naptr_head = NULL;
struct ares_naptr_reply *naptr_last = NULL;
struct ares_naptr_reply *naptr_curr;
+ ares_dns_record_t *dnsrec = NULL;
+ size_t i;
- /* Set *naptr_out to NULL for all failure cases. */
*naptr_out = NULL;
- /* Give up if abuf doesn't have room for a header. */
- if (alen < HFIXEDSZ)
- return ARES_EBADRESP;
-
- /* Fetch the question and answer count from the header. */
- qdcount = DNS_HEADER_QDCOUNT (abuf);
- ancount = DNS_HEADER_ANCOUNT (abuf);
- if (qdcount != 1)
+ if (alen_int < 0) {
return ARES_EBADRESP;
- if (ancount == 0)
- return ARES_ENODATA;
+ }
- /* Expand the name from the question, and skip past the question. */
- aptr = abuf + HFIXEDSZ;
- status = ares_expand_name (aptr, abuf, alen, &hostname, &len);
- if (status != ARES_SUCCESS)
- return status;
+ alen = (size_t)alen_int;
- if (aptr + len + QFIXEDSZ > abuf + alen)
- {
- ares_free (hostname);
- return ARES_EBADRESP;
- }
- aptr += len + QFIXEDSZ;
-
- /* Examine each answer resource record (RR) in turn. */
- for (i = 0; i < ancount; i++)
- {
- /* Decode the RR up to the data field. */
- status = ares_expand_name (aptr, abuf, alen, &rr_name, &len);
- if (status != ARES_SUCCESS)
- {
- break;
- }
- aptr += len;
- if (aptr + RRFIXEDSZ > abuf + alen)
- {
- status = ARES_EBADRESP;
- break;
- }
- rr_type = DNS_RR_TYPE (aptr);
- rr_class = DNS_RR_CLASS (aptr);
- rr_len = DNS_RR_LEN (aptr);
- aptr += RRFIXEDSZ;
- if (aptr + rr_len > abuf + alen)
- {
- status = ARES_EBADRESP;
- break;
- }
-
- /* Check if we are really looking at a NAPTR record */
- if (rr_class == C_IN && rr_type == T_NAPTR)
- {
- /* parse the NAPTR record itself */
+ status = ares_dns_parse(abuf, alen, 0, &dnsrec);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
- /* RR must contain at least 7 bytes = 2 x int16 + 3 x name */
- if (rr_len < 7)
- {
- status = ARES_EBADRESP;
- break;
- }
+ if (ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER) == 0) {
+ status = ARES_ENODATA;
+ goto done;
+ }
- /* Allocate storage for this NAPTR answer appending it to the list */
- naptr_curr = ares_malloc_data(ARES_DATATYPE_NAPTR_REPLY);
- if (!naptr_curr)
- {
- status = ARES_ENOMEM;
- break;
- }
- if (naptr_last)
- {
- naptr_last->next = naptr_curr;
- }
- else
- {
- naptr_head = naptr_curr;
- }
- naptr_last = naptr_curr;
+ for (i = 0; i < ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER); i++) {
+ const ares_dns_rr_t *rr =
+ ares_dns_record_rr_get(dnsrec, ARES_SECTION_ANSWER, i);
- vptr = aptr;
- naptr_curr->order = DNS__16BIT(vptr);
- vptr += sizeof(unsigned short);
- naptr_curr->preference = DNS__16BIT(vptr);
- vptr += sizeof(unsigned short);
-
- status = ares_expand_string(vptr, abuf, alen, &naptr_curr->flags, &len);
- if (status != ARES_SUCCESS)
- break;
- vptr += len;
+ if (rr == NULL) {
+ /* Shouldn't be possible */
+ status = ARES_EBADRESP;
+ goto done;
+ }
- status = ares_expand_string(vptr, abuf, alen, &naptr_curr->service, &len);
- if (status != ARES_SUCCESS)
- break;
- vptr += len;
+ if (ares_dns_rr_get_class(rr) != ARES_CLASS_IN ||
+ ares_dns_rr_get_type(rr) != ARES_REC_TYPE_NAPTR) {
+ continue;
+ }
- status = ares_expand_string(vptr, abuf, alen, &naptr_curr->regexp, &len);
- if (status != ARES_SUCCESS)
- break;
- vptr += len;
+ /* Allocate storage for this NAPTR answer appending it to the list */
+ naptr_curr = ares_malloc_data(ARES_DATATYPE_NAPTR_REPLY);
+ if (naptr_curr == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
- status = ares_expand_name(vptr, abuf, alen, &naptr_curr->replacement, &len);
- if (status != ARES_SUCCESS)
- break;
- }
+ /* Link in the record */
+ if (naptr_last) {
+ naptr_last->next = naptr_curr;
+ } else {
+ naptr_head = naptr_curr;
+ }
+ naptr_last = naptr_curr;
- /* Don't lose memory in the next iteration */
- ares_free (rr_name);
- rr_name = NULL;
+ naptr_curr->order = ares_dns_rr_get_u16(rr, ARES_RR_NAPTR_ORDER);
+ naptr_curr->preference = ares_dns_rr_get_u16(rr, ARES_RR_NAPTR_PREFERENCE);
- /* Move on to the next record */
- aptr += rr_len;
+ /* XXX: Why is this unsigned char * ? */
+ naptr_curr->flags = (unsigned char *)ares_strdup(
+ ares_dns_rr_get_str(rr, ARES_RR_NAPTR_FLAGS));
+ if (naptr_curr->flags == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
}
+ /* XXX: Why is this unsigned char * ? */
+ naptr_curr->service = (unsigned char *)ares_strdup(
+ ares_dns_rr_get_str(rr, ARES_RR_NAPTR_SERVICES));
+ if (naptr_curr->service == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ /* XXX: Why is this unsigned char * ? */
+ naptr_curr->regexp = (unsigned char *)ares_strdup(
+ ares_dns_rr_get_str(rr, ARES_RR_NAPTR_REGEXP));
+ if (naptr_curr->regexp == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ naptr_curr->replacement =
+ ares_strdup(ares_dns_rr_get_str(rr, ARES_RR_NAPTR_REPLACEMENT));
+ if (naptr_curr->replacement == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ }
- if (hostname)
- ares_free (hostname);
- if (rr_name)
- ares_free (rr_name);
-
+done:
/* clean up on error */
- if (status != ARES_SUCCESS)
- {
- if (naptr_head)
- ares_free_data (naptr_head);
- return status;
+ if (status != ARES_SUCCESS) {
+ if (naptr_head) {
+ ares_free_data(naptr_head);
}
-
- /* everything looks fine, return the data */
- *naptr_out = naptr_head;
-
- return ARES_SUCCESS;
+ } else {
+ /* everything looks fine, return the data */
+ *naptr_out = naptr_head;
+ }
+ ares_dns_record_destroy(dnsrec);
+ return (int)status;
}
diff --git a/contrib/libs/c-ares/src/lib/ares_parse_ns_reply.c b/contrib/libs/c-ares/src/lib/ares_parse_ns_reply.c
index 28083d44c1..18fda82f41 100644
--- a/contrib/libs/c-ares/src/lib/ares_parse_ns_reply.c
+++ b/contrib/libs/c-ares/src/lib/ares_parse_ns_reply.c
@@ -1,7 +1,6 @@
/* MIT License
*
- * Copyright (c) 1998 Massachusetts Institute of Technology
- * Copyright (c) The c-ares project and its contributors
+ * Copyright (c) 2023 Brad House
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -25,11 +24,6 @@
* SPDX-License-Identifier: MIT
*/
-/*
- * ares_parse_ns_reply created by Vlad Dinulescu <vlad.dinulescu@avira.com>
- * on behalf of AVIRA Gmbh - http://www.avira.com
- */
-
#include "ares_setup.h"
#ifdef HAVE_NETINET_IN_H
@@ -42,148 +36,122 @@
# include <arpa/inet.h>
#endif
-#include "ares_nameser.h"
-
#include "ares.h"
-#include "ares_dns.h"
#include "ares_private.h"
-int ares_parse_ns_reply( const unsigned char* abuf, int alen,
- struct hostent** host )
+int ares_parse_ns_reply(const unsigned char *abuf, int alen_int,
+ struct hostent **host)
{
- unsigned int qdcount, ancount;
- int status, i, rr_type, rr_class, rr_len;
- int nameservers_num;
- long len;
- const unsigned char *aptr;
- char* hostname, *rr_name, *rr_data, **nameservers;
- struct hostent *hostent;
-
- /* Set *host to NULL for all failure cases. */
+ ares_status_t status;
+ size_t alen;
+ size_t nscount = 0;
+ struct hostent *hostent = NULL;
+ const char *hostname = NULL;
+ ares_dns_record_t *dnsrec = NULL;
+ size_t i;
+ size_t ancount;
+
*host = NULL;
- /* Give up if abuf doesn't have room for a header. */
- if ( alen < HFIXEDSZ )
+ if (alen_int < 0) {
return ARES_EBADRESP;
+ }
- /* Fetch the question and answer count from the header. */
- qdcount = DNS_HEADER_QDCOUNT( abuf );
- ancount = DNS_HEADER_ANCOUNT( abuf );
- if ( qdcount != 1 )
- return ARES_EBADRESP;
+ alen = (size_t)alen_int;
- /* Expand the name from the question, and skip past the question. */
- aptr = abuf + HFIXEDSZ;
- status = ares__expand_name_for_response( aptr, abuf, alen, &hostname, &len, 0);
- if ( status != ARES_SUCCESS )
- return status;
- if ( aptr + len + QFIXEDSZ > abuf + alen )
- {
- ares_free( hostname );
- return ARES_EBADRESP;
+ status = ares_dns_parse(abuf, alen, 0, &dnsrec);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ ancount = ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER);
+ if (ancount == 0) {
+ status = ARES_ENODATA;
+ goto done;
+ }
+
+ /* Response structure */
+ hostent = ares_malloc(sizeof(*hostent));
+ if (hostent == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ memset(hostent, 0, sizeof(*hostent));
+
+ hostent->h_addr_list = ares_malloc(sizeof(*hostent->h_addr_list));
+ if (hostent->h_addr_list == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ hostent->h_addr_list[0] = NULL;
+ hostent->h_addrtype = AF_INET;
+ hostent->h_length = sizeof(struct in_addr);
+
+ /* Fill in hostname */
+ status = ares_dns_record_query_get(dnsrec, 0, &hostname, NULL, NULL);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ hostent->h_name = ares_strdup(hostname);
+ if (hostent->h_name == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
}
- aptr += len + QFIXEDSZ;
-
- /* Allocate nameservers array; ancount gives an upper bound */
- nameservers = ares_malloc( ( ancount + 1 ) * sizeof( char * ) );
- if ( !nameservers )
- {
- ares_free( hostname );
- return ARES_ENOMEM;
+
+ /* Preallocate the maximum number + 1 */
+ hostent->h_aliases = ares_malloc((ancount + 1) * sizeof(*hostent->h_aliases));
+ if (hostent->h_aliases == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
}
- nameservers_num = 0;
-
- /* Examine each answer resource record (RR) in turn. */
- for ( i = 0; i < ( int ) ancount; i++ )
- {
- /* Decode the RR up to the data field. */
- status = ares__expand_name_for_response( aptr, abuf, alen, &rr_name, &len, 0);
- if ( status != ARES_SUCCESS )
- break;
- aptr += len;
- if ( aptr + RRFIXEDSZ > abuf + alen )
- {
+ memset(hostent->h_aliases, 0, (ancount + 1) * sizeof(*hostent->h_aliases));
+
+ for (i = 0; i < ancount; i++) {
+ const ares_dns_rr_t *rr =
+ ares_dns_record_rr_get(dnsrec, ARES_SECTION_ANSWER, i);
+
+ if (rr == NULL) {
+ /* Shouldn't be possible */
status = ARES_EBADRESP;
- ares_free(rr_name);
- break;
- }
- rr_type = DNS_RR_TYPE( aptr );
- rr_class = DNS_RR_CLASS( aptr );
- rr_len = DNS_RR_LEN( aptr );
- aptr += RRFIXEDSZ;
- if (aptr + rr_len > abuf + alen)
- {
- ares_free(rr_name);
- status = ARES_EBADRESP;
- break;
- }
-
- if ( rr_class == C_IN && rr_type == T_NS )
- {
- /* Decode the RR data and add it to the nameservers list */
- status = ares__expand_name_for_response( aptr, abuf, alen, &rr_data,
- &len, 1);
- if ( status != ARES_SUCCESS )
- {
- ares_free(rr_name);
- break;
- }
-
- nameservers[nameservers_num] = ares_malloc(strlen(rr_data)+1);
-
- if (nameservers[nameservers_num]==NULL)
- {
- ares_free(rr_name);
- ares_free(rr_data);
- status=ARES_ENOMEM;
- break;
- }
- strcpy(nameservers[nameservers_num],rr_data);
- ares_free(rr_data);
-
- nameservers_num++;
+ goto done;
}
- ares_free( rr_name );
+ if (ares_dns_rr_get_class(rr) != ARES_CLASS_IN ||
+ ares_dns_rr_get_type(rr) != ARES_REC_TYPE_NS) {
+ continue;
+ }
- aptr += rr_len;
- if ( aptr > abuf + alen )
- { /* LCOV_EXCL_START: already checked above */
+ hostname = ares_dns_rr_get_str(rr, ARES_RR_NS_NSDNAME);
+ if (hostname == NULL) {
status = ARES_EBADRESP;
- break;
- } /* LCOV_EXCL_STOP */
+ goto done;
+ }
+
+ hostent->h_aliases[nscount] = ares_strdup(hostname);
+ if (hostent->h_aliases[nscount] == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ nscount++;
}
- if ( status == ARES_SUCCESS && nameservers_num == 0 )
- {
+ if (nscount == 0) {
status = ARES_ENODATA;
+ } else {
+ status = ARES_SUCCESS;
}
- if ( status == ARES_SUCCESS )
- {
- /* We got our answer. Allocate memory to build the host entry. */
- nameservers[nameservers_num] = NULL;
- hostent = ares_malloc( sizeof( struct hostent ) );
- if ( hostent )
- {
- hostent->h_addr_list = ares_malloc( 1 * sizeof( char * ) );
- if ( hostent->h_addr_list )
- {
- /* Fill in the hostent and return successfully. */
- hostent->h_name = hostname;
- hostent->h_aliases = nameservers;
- hostent->h_addrtype = AF_INET;
- hostent->h_length = sizeof( struct in_addr );
- hostent->h_addr_list[0] = NULL;
- *host = hostent;
- return ARES_SUCCESS;
- }
- ares_free( hostent );
+
+done:
+ if (status != ARES_SUCCESS) {
+ ares_free_hostent(hostent);
+ /* Compatibility */
+ if (status == ARES_EBADNAME) {
+ status = ARES_EBADRESP;
}
- status = ARES_ENOMEM;
+ } else {
+ *host = hostent;
}
- for ( i = 0; i < nameservers_num; i++ )
- ares_free( nameservers[i] );
- ares_free( nameservers );
- ares_free( hostname );
- return status;
+ ares_dns_record_destroy(dnsrec);
+ return (int)status;
}
diff --git a/contrib/libs/c-ares/src/lib/ares_parse_ptr_reply.c b/contrib/libs/c-ares/src/lib/ares_parse_ptr_reply.c
index 0606d35f1e..6ee20f722e 100644
--- a/contrib/libs/c-ares/src/lib/ares_parse_ptr_reply.c
+++ b/contrib/libs/c-ares/src/lib/ares_parse_ptr_reply.c
@@ -1,7 +1,6 @@
/* MIT License
*
- * Copyright (c) 1998 Massachusetts Institute of Technology
- * Copyright (c) The c-ares project and its contributors
+ * Copyright (c) 2023 Brad House
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -34,206 +33,183 @@
# include <netdb.h>
#endif
-#include "ares_nameser.h"
-
-#ifdef HAVE_STRINGS_H
-# include <strings.h>
-#endif
-
#include "ares.h"
-#include "ares_dns.h"
-#include "ares_nowarn.h"
#include "ares_private.h"
-int ares_parse_ptr_reply(const unsigned char *abuf, int alen, const void *addr,
- int addrlen, int family, struct hostent **host)
+ares_status_t ares_parse_ptr_reply_dnsrec(const ares_dns_record_t *dnsrec,
+ const void *addr, int addrlen,
+ int family, struct hostent **host)
{
- unsigned int qdcount, ancount;
- int status, i, rr_type, rr_class, rr_len;
- long len;
- const unsigned char *aptr;
- char *ptrname, *hostname, *rr_name, *rr_data;
- struct hostent *hostent = NULL;
- int aliascnt = 0;
- int alias_alloc = 8;
- char ** aliases;
- size_t rr_data_len;
-
- /* Set *host to NULL for all failure cases. */
+ ares_status_t status;
+ size_t ptrcount = 0;
+ struct hostent *hostent = NULL;
+ const char *hostname = NULL;
+ const char *ptrname = NULL;
+ size_t i;
+ size_t ancount;
+
*host = NULL;
- /* Give up if abuf doesn't have room for a header. */
- if (alen < HFIXEDSZ)
- return ARES_EBADRESP;
+ /* Fetch name from query as we will use it to compare later on. Old code
+ * did this check, so we'll retain it. */
+ status = ares_dns_record_query_get(dnsrec, 0, &ptrname, NULL, NULL);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
- /* Fetch the question and answer count from the header. */
- qdcount = DNS_HEADER_QDCOUNT(abuf);
- ancount = DNS_HEADER_ANCOUNT(abuf);
- if (qdcount != 1)
- return ARES_EBADRESP;
+ ancount = ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER);
+ if (ancount == 0) {
+ status = ARES_ENODATA;
+ goto done;
+ }
+
+ /* Response structure */
+ hostent = ares_malloc(sizeof(*hostent));
+ if (hostent == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ memset(hostent, 0, sizeof(*hostent));
+
+ hostent->h_addr_list = ares_malloc(2 * sizeof(*hostent->h_addr_list));
+ if (hostent->h_addr_list == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ memset(hostent->h_addr_list, 0, 2 * sizeof(*hostent->h_addr_list));
+ if (addr != NULL && addrlen > 0) {
+ hostent->h_addr_list[0] = ares_malloc((size_t)addrlen);
+ if (hostent->h_addr_list[0] == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ memcpy(hostent->h_addr_list[0], addr, (size_t)addrlen);
+ }
+ hostent->h_addrtype = (HOSTENT_ADDRTYPE_TYPE)family;
+ hostent->h_length = (HOSTENT_LENGTH_TYPE)addrlen;
+
+ /* Preallocate the maximum number + 1 */
+ hostent->h_aliases = ares_malloc((ancount + 1) * sizeof(*hostent->h_aliases));
+ if (hostent->h_aliases == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ memset(hostent->h_aliases, 0, (ancount + 1) * sizeof(*hostent->h_aliases));
+
+
+ /* Cycle through answers */
+ for (i = 0; i < ancount; i++) {
+ const ares_dns_rr_t *rr =
+ ares_dns_record_rr_get_const(dnsrec, ARES_SECTION_ANSWER, i);
+
+ if (rr == NULL) {
+ /* Shouldn't be possible */
+ status = ARES_EBADRESP;
+ goto done;
+ }
- /* Expand the name from the question, and skip past the question. */
- aptr = abuf + HFIXEDSZ;
- status = ares__expand_name_for_response(aptr, abuf, alen, &ptrname, &len, 0);
- if (status != ARES_SUCCESS)
- return status;
- if (aptr + len + QFIXEDSZ > abuf + alen)
- {
- ares_free(ptrname);
- return ARES_EBADRESP;
+ if (ares_dns_rr_get_class(rr) != ARES_CLASS_IN) {
+ continue;
}
- aptr += len + QFIXEDSZ;
-
- /* Examine each answer resource record (RR) in turn. */
- hostname = NULL;
- aliases = ares_malloc(alias_alloc * sizeof(char *));
- if (!aliases)
- {
- ares_free(ptrname);
- return ARES_ENOMEM;
+
+ /* Any time we see a CNAME, replace our ptrname with its value */
+ if (ares_dns_rr_get_type(rr) == ARES_REC_TYPE_CNAME) {
+ ptrname = ares_dns_rr_get_str(rr, ARES_RR_CNAME_CNAME);
+ if (ptrname == NULL) {
+ status = ARES_EBADRESP;
+ goto done;
+ }
}
- for (i = 0; i < (int)ancount; i++)
- {
- /* Decode the RR up to the data field. */
- status = ares__expand_name_for_response(aptr, abuf, alen, &rr_name, &len, 0);
- if (status != ARES_SUCCESS)
- break;
- aptr += len;
- if (aptr + RRFIXEDSZ > abuf + alen)
- {
- ares_free(rr_name);
- status = ARES_EBADRESP;
- break;
- }
- rr_type = DNS_RR_TYPE(aptr);
- rr_class = DNS_RR_CLASS(aptr);
- rr_len = DNS_RR_LEN(aptr);
- aptr += RRFIXEDSZ;
- if (aptr + rr_len > abuf + alen)
- {
- ares_free(rr_name);
- status = ARES_EBADRESP;
- break;
- }
-
- if (rr_class == C_IN && rr_type == T_PTR
- && strcasecmp(rr_name, ptrname) == 0)
- {
- /* Decode the RR data and set hostname to it. */
- status = ares__expand_name_for_response(aptr, abuf, alen, &rr_data,
- &len, 1);
- if (status != ARES_SUCCESS)
- {
- ares_free(rr_name);
- break;
- }
- if (hostname)
- ares_free(hostname);
- hostname = rr_data;
- rr_data_len = strlen(rr_data)+1;
- aliases[aliascnt] = ares_malloc(rr_data_len * sizeof(char));
- if (!aliases[aliascnt])
- {
- ares_free(rr_name);
- status = ARES_ENOMEM;
- break;
- }
- strncpy(aliases[aliascnt], rr_data, rr_data_len);
- aliascnt++;
- if (aliascnt >= alias_alloc) {
- char **ptr;
- alias_alloc *= 2;
- ptr = ares_realloc(aliases, alias_alloc * sizeof(char *));
- if(!ptr) {
- ares_free(rr_name);
- status = ARES_ENOMEM;
- break;
- }
- aliases = ptr;
- }
- }
-
- if (rr_class == C_IN && rr_type == T_CNAME)
- {
- /* Decode the RR data and replace ptrname with it. */
- status = ares__expand_name_for_response(aptr, abuf, alen, &rr_data,
- &len, 1);
- if (status != ARES_SUCCESS)
- {
- ares_free(rr_name);
- break;
- }
- ares_free(ptrname);
- ptrname = rr_data;
- }
-
- ares_free(rr_name);
- aptr += rr_len;
- if (aptr > abuf + alen)
- { /* LCOV_EXCL_START: already checked above */
- status = ARES_EBADRESP;
- break;
- } /* LCOV_EXCL_STOP */
+
+ /* Handling for PTR records below this, otherwise skip */
+ if (ares_dns_rr_get_type(rr) != ARES_REC_TYPE_PTR) {
+ continue;
}
- if (status == ARES_SUCCESS && !hostname)
- status = ARES_ENODATA;
- if (status == ARES_SUCCESS)
- {
- /* If we don't reach the end, we must have failed due to out of memory */
- status = ARES_ENOMEM;
+ /* Issue #683
+ * Old code compared the name in the rr to the ptrname, but I think this
+ * is wrong since it was proven wrong for A & AAAA records. Leaving
+ * this code commented out for future reference
+ *
+ * rname = ares_dns_rr_get_name(rr);
+ * if (rname == NULL) {
+ * status = ARES_EBADRESP;
+ * goto done;
+ * }
+ * if (strcasecmp(ptrname, rname) != 0) {
+ * continue;
+ * }
+ */
+
+ /* Save most recent PTR record as the hostname */
+ hostname = ares_dns_rr_get_str(rr, ARES_RR_PTR_DNAME);
+ if (hostname == NULL) {
+ status = ARES_EBADRESP;
+ goto done;
+ }
- /* We got our answer. Allocate memory to build the host entry. */
- hostent = ares_malloc(sizeof(*hostent));
- if (!hostent)
- goto fail;
+ /* Append as an alias */
+ hostent->h_aliases[ptrcount] = ares_strdup(hostname);
+ if (hostent->h_aliases[ptrcount] == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ ptrcount++;
+ }
- /* If we don't memset here, cleanups may fail */
- memset(hostent, 0, sizeof(*hostent));
+ if (ptrcount == 0) {
+ status = ARES_ENODATA;
+ goto done;
+ } else {
+ status = ARES_SUCCESS;
+ }
+
+ /* Fill in hostname */
+ hostent->h_name = ares_strdup(hostname);
+ if (hostent->h_name == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+done:
+ if (status != ARES_SUCCESS) {
+ ares_free_hostent(hostent);
+ /* Compatibility */
+ if (status == ARES_EBADNAME) {
+ status = ARES_EBADRESP;
+ }
+ } else {
+ *host = hostent;
+ }
+ return status;
+}
- hostent->h_addr_list = ares_malloc(2 * sizeof(char *));
- if (!hostent->h_addr_list)
- goto fail;
+int ares_parse_ptr_reply(const unsigned char *abuf, int alen_int,
+ const void *addr, int addrlen, int family,
+ struct hostent **host)
+{
+ size_t alen;
+ ares_dns_record_t *dnsrec = NULL;
+ ares_status_t status;
+ if (alen_int < 0) {
+ return ARES_EBADRESP;
+ }
- if (addr && addrlen) {
- hostent->h_addr_list[0] = ares_malloc(addrlen);
- if (!hostent->h_addr_list[0])
- goto fail;
- } else {
- hostent->h_addr_list[0] = NULL;
- }
+ alen = (size_t)alen_int;
- hostent->h_aliases = ares_malloc((aliascnt+1) * sizeof (char *));
- if (!hostent->h_aliases)
- goto fail;
-
- /* Fill in the hostent and return successfully. */
- hostent->h_name = hostname;
- for (i=0 ; i<aliascnt ; i++)
- hostent->h_aliases[i] = aliases[i];
- hostent->h_aliases[aliascnt] = NULL;
- hostent->h_addrtype = aresx_sitoss(family);
- hostent->h_length = aresx_sitoss(addrlen);
- if (addr && addrlen)
- memcpy(hostent->h_addr_list[0], addr, addrlen);
- hostent->h_addr_list[1] = NULL;
- *host = hostent;
- ares_free(aliases);
- ares_free(ptrname);
-
- return ARES_SUCCESS;
- }
+ status = ares_dns_parse(abuf, alen, 0, &dnsrec);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
-fail:
- ares_free_hostent(hostent);
+ status = ares_parse_ptr_reply_dnsrec(dnsrec, addr, addrlen, family, host);
- for (i=0 ; i<aliascnt ; i++)
- if (aliases[i])
- ares_free(aliases[i]);
- ares_free(aliases);
- if (hostname)
- ares_free(hostname);
- ares_free(ptrname);
- return status;
+done:
+ ares_dns_record_destroy(dnsrec);
+ if (status == ARES_EBADNAME) {
+ status = ARES_EBADRESP;
+ }
+ return (int)status;
}
diff --git a/contrib/libs/c-ares/src/lib/ares_parse_soa_reply.c b/contrib/libs/c-ares/src/lib/ares_parse_soa_reply.c
index f37ba19173..2777dbcb0b 100644
--- a/contrib/libs/c-ares/src/lib/ares_parse_soa_reply.c
+++ b/contrib/libs/c-ares/src/lib/ares_parse_soa_reply.c
@@ -1,7 +1,6 @@
/* MIT License
*
- * Copyright (c) 1998 Massachusetts Institute of Technology
- * Copyright (c) 2012 Marko Kreen
+ * Copyright (c) 2023 Brad House
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -26,164 +25,93 @@
*/
#include "ares_setup.h"
-
-#ifdef HAVE_NETINET_IN_H
-# include <netinet/in.h>
-#endif
-#ifdef HAVE_NETDB_H
-# include <netdb.h>
-#endif
-#ifdef HAVE_ARPA_INET_H
-# include <arpa/inet.h>
-#endif
-
-#include "ares_nameser.h"
-
#include "ares.h"
-#include "ares_dns.h"
#include "ares_data.h"
#include "ares_private.h"
-int
-ares_parse_soa_reply(const unsigned char *abuf, int alen,
- struct ares_soa_reply **soa_out)
+int ares_parse_soa_reply(const unsigned char *abuf, int alen_int,
+ struct ares_soa_reply **soa_out)
{
- const unsigned char *aptr;
- long len;
- char *qname = NULL, *rr_name = NULL;
- struct ares_soa_reply *soa = NULL;
- int qdcount, ancount, qclass;
- int status, i, rr_type, rr_class, rr_len;
+ ares_status_t status;
+ size_t alen;
+ struct ares_soa_reply *soa = NULL;
+ ares_dns_record_t *dnsrec = NULL;
+ size_t i;
- if (alen < HFIXEDSZ)
- return ARES_EBADRESP;
-
- /* parse message header */
- qdcount = DNS_HEADER_QDCOUNT(abuf);
- ancount = DNS_HEADER_ANCOUNT(abuf);
+ *soa_out = NULL;
- if (qdcount != 1)
- return ARES_EBADRESP;
- if (ancount == 0)
+ if (alen_int < 0) {
return ARES_EBADRESP;
+ }
- aptr = abuf + HFIXEDSZ;
-
- /* query name */
- status = ares__expand_name_for_response(aptr, abuf, alen, &qname, &len, 0);
- if (status != ARES_SUCCESS)
- goto failed_stat;
-
- if (alen <= len + HFIXEDSZ + 1)
- goto failed;
- aptr += len;
-
- qclass = DNS_QUESTION_TYPE(aptr);
+ alen = (size_t)alen_int;
- /* skip qtype & qclass */
- if (aptr + QFIXEDSZ > abuf + alen)
- goto failed;
- aptr += QFIXEDSZ;
+ status = ares_dns_parse(abuf, alen, 0, &dnsrec);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
- /* qclass of SOA with multiple answers */
- if (qclass == T_SOA && ancount > 1)
- goto failed;
+ if (ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER) == 0) {
+ status = ARES_EBADRESP; /* ENODATA might make more sense */
+ goto done;
+ }
- /* examine all the records, break and return if found soa */
- for (i = 0; i < ancount; i++)
- {
- rr_name = NULL;
- status = ares__expand_name_for_response (aptr, abuf, alen, &rr_name, &len, 0);
- if (status != ARES_SUCCESS)
- {
- ares_free(rr_name);
- goto failed_stat;
- }
+ for (i = 0; i < ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER); i++) {
+ const ares_dns_rr_t *rr =
+ ares_dns_record_rr_get(dnsrec, ARES_SECTION_ANSWER, i);
- aptr += len;
- if ( aptr + RRFIXEDSZ > abuf + alen )
- {
- ares_free(rr_name);
+ if (rr == NULL) {
+ /* Shouldn't be possible */
status = ARES_EBADRESP;
- goto failed_stat;
+ goto done;
}
- rr_type = DNS_RR_TYPE( aptr );
- rr_class = DNS_RR_CLASS( aptr );
- rr_len = DNS_RR_LEN( aptr );
- aptr += RRFIXEDSZ;
- if (aptr + rr_len > abuf + alen)
- {
- ares_free(rr_name);
- status = ARES_EBADRESP;
- goto failed_stat;
- }
- if ( rr_class == C_IN && rr_type == T_SOA )
- {
- /* allocate result struct */
- soa = ares_malloc_data(ARES_DATATYPE_SOA_REPLY);
- if (!soa)
- {
- ares_free(rr_name);
- status = ARES_ENOMEM;
- goto failed_stat;
- }
- /* nsname */
- status = ares__expand_name_for_response(aptr, abuf, alen, &soa->nsname,
- &len, 0);
- if (status != ARES_SUCCESS)
- {
- ares_free(rr_name);
- goto failed_stat;
- }
- aptr += len;
-
- /* hostmaster */
- status = ares__expand_name_for_response(aptr, abuf, alen,
- &soa->hostmaster, &len, 0);
- if (status != ARES_SUCCESS)
- {
- ares_free(rr_name);
- goto failed_stat;
- }
- aptr += len;
-
- /* integer fields */
- if (aptr + 5 * 4 > abuf + alen)
- {
- ares_free(rr_name);
- goto failed;
- }
- soa->serial = DNS__32BIT(aptr + 0 * 4);
- soa->refresh = DNS__32BIT(aptr + 1 * 4);
- soa->retry = DNS__32BIT(aptr + 2 * 4);
- soa->expire = DNS__32BIT(aptr + 3 * 4);
- soa->minttl = DNS__32BIT(aptr + 4 * 4);
-
- ares_free(qname);
- ares_free(rr_name);
-
- *soa_out = soa;
+ if (ares_dns_rr_get_class(rr) != ARES_CLASS_IN ||
+ ares_dns_rr_get_type(rr) != ARES_REC_TYPE_SOA) {
+ continue;
+ }
- return ARES_SUCCESS;
+ /* allocate result struct */
+ soa = ares_malloc_data(ARES_DATATYPE_SOA_REPLY);
+ if (soa == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
}
- aptr += rr_len;
- ares_free(rr_name);
+ soa->serial = ares_dns_rr_get_u32(rr, ARES_RR_SOA_SERIAL);
+ soa->refresh = ares_dns_rr_get_u32(rr, ARES_RR_SOA_REFRESH);
+ soa->retry = ares_dns_rr_get_u32(rr, ARES_RR_SOA_RETRY);
+ soa->expire = ares_dns_rr_get_u32(rr, ARES_RR_SOA_EXPIRE);
+ soa->minttl = ares_dns_rr_get_u32(rr, ARES_RR_SOA_MINIMUM);
+ soa->nsname = ares_strdup(ares_dns_rr_get_str(rr, ARES_RR_SOA_MNAME));
+ if (soa->nsname == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ soa->hostmaster = ares_strdup(ares_dns_rr_get_str(rr, ARES_RR_SOA_RNAME));
+ if (soa->hostmaster == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ break;
+ }
- if (aptr > abuf + alen)
- goto failed_stat;
+ if (soa == NULL) {
+ status = ARES_EBADRESP;
}
- /* no SOA record found */
- status = ARES_EBADRESP;
- goto failed_stat;
-failed:
- status = ARES_EBADRESP;
-failed_stat:
- if (soa)
+done:
+ /* clean up on error */
+ if (status != ARES_SUCCESS) {
ares_free_data(soa);
- if (qname)
- ares_free(qname);
- return status;
+ /* Compatibility */
+ if (status == ARES_EBADNAME) {
+ status = ARES_EBADRESP;
+ }
+ } else {
+ /* everything looks fine, return the data */
+ *soa_out = soa;
+ }
+ ares_dns_record_destroy(dnsrec);
+ return (int)status;
}
diff --git a/contrib/libs/c-ares/src/lib/ares_parse_srv_reply.c b/contrib/libs/c-ares/src/lib/ares_parse_srv_reply.c
index 0125092c02..f27bcce733 100644
--- a/contrib/libs/c-ares/src/lib/ares_parse_srv_reply.c
+++ b/contrib/libs/c-ares/src/lib/ares_parse_srv_reply.c
@@ -1,7 +1,6 @@
/* MIT License
*
- * Copyright (c) 1998 Massachusetts Institute of Technology
- * Copyright (c) 2009 Jakub Hrozek
+ * Copyright (c) 2023 Brad House
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -26,153 +25,92 @@
*/
#include "ares_setup.h"
-
-#ifdef HAVE_NETINET_IN_H
-# include <netinet/in.h>
-#endif
-#ifdef HAVE_NETDB_H
-# include <netdb.h>
-#endif
-#ifdef HAVE_ARPA_INET_H
-# include <arpa/inet.h>
-#endif
-
-#include "ares_nameser.h"
-
#include "ares.h"
-#include "ares_dns.h"
#include "ares_data.h"
#include "ares_private.h"
-int
-ares_parse_srv_reply (const unsigned char *abuf, int alen,
- struct ares_srv_reply **srv_out)
+int ares_parse_srv_reply(const unsigned char *abuf, int alen_int,
+ struct ares_srv_reply **srv_out)
{
- unsigned int qdcount, ancount, i;
- const unsigned char *aptr, *vptr;
- int status, rr_type, rr_class, rr_len;
- long len;
- char *hostname = NULL, *rr_name = NULL;
+ ares_status_t status;
+ size_t alen;
struct ares_srv_reply *srv_head = NULL;
struct ares_srv_reply *srv_last = NULL;
struct ares_srv_reply *srv_curr;
+ ares_dns_record_t *dnsrec = NULL;
+ size_t i;
- /* Set *srv_out to NULL for all failure cases. */
*srv_out = NULL;
- /* Give up if abuf doesn't have room for a header. */
- if (alen < HFIXEDSZ)
+ if (alen_int < 0) {
return ARES_EBADRESP;
+ }
- /* Fetch the question and answer count from the header. */
- qdcount = DNS_HEADER_QDCOUNT (abuf);
- ancount = DNS_HEADER_ANCOUNT (abuf);
- if (qdcount != 1)
- return ARES_EBADRESP;
- if (ancount == 0)
- return ARES_ENODATA;
-
- /* Expand the name from the question, and skip past the question. */
- aptr = abuf + HFIXEDSZ;
- status = ares_expand_name (aptr, abuf, alen, &hostname, &len);
- if (status != ARES_SUCCESS)
- return status;
-
- if (aptr + len + QFIXEDSZ > abuf + alen)
- {
- ares_free (hostname);
- return ARES_EBADRESP;
+ alen = (size_t)alen_int;
+
+ status = ares_dns_parse(abuf, alen, 0, &dnsrec);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ if (ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER) == 0) {
+ status = ARES_ENODATA;
+ goto done;
+ }
+
+ for (i = 0; i < ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER); i++) {
+ const ares_dns_rr_t *rr =
+ ares_dns_record_rr_get(dnsrec, ARES_SECTION_ANSWER, i);
+
+ if (rr == NULL) {
+ /* Shouldn't be possible */
+ status = ARES_EBADRESP;
+ goto done;
}
- aptr += len + QFIXEDSZ;
-
- /* Examine each answer resource record (RR) in turn. */
- for (i = 0; i < ancount; i++)
- {
- /* Decode the RR up to the data field. */
- status = ares_expand_name (aptr, abuf, alen, &rr_name, &len);
- if (status != ARES_SUCCESS)
- {
- break;
- }
- aptr += len;
- if (aptr + RRFIXEDSZ > abuf + alen)
- {
- status = ARES_EBADRESP;
- break;
- }
- rr_type = DNS_RR_TYPE (aptr);
- rr_class = DNS_RR_CLASS (aptr);
- rr_len = DNS_RR_LEN (aptr);
- aptr += RRFIXEDSZ;
- if (aptr + rr_len > abuf + alen)
- {
- status = ARES_EBADRESP;
- break;
- }
-
- /* Check if we are really looking at a SRV record */
- if (rr_class == C_IN && rr_type == T_SRV)
- {
- /* parse the SRV record itself */
- if (rr_len < 6)
- {
- status = ARES_EBADRESP;
- break;
- }
-
- /* Allocate storage for this SRV answer appending it to the list */
- srv_curr = ares_malloc_data(ARES_DATATYPE_SRV_REPLY);
- if (!srv_curr)
- {
- status = ARES_ENOMEM;
- break;
- }
- if (srv_last)
- {
- srv_last->next = srv_curr;
- }
- else
- {
- srv_head = srv_curr;
- }
- srv_last = srv_curr;
-
- vptr = aptr;
- srv_curr->priority = DNS__16BIT(vptr);
- vptr += sizeof(unsigned short);
- srv_curr->weight = DNS__16BIT(vptr);
- vptr += sizeof(unsigned short);
- srv_curr->port = DNS__16BIT(vptr);
- vptr += sizeof(unsigned short);
-
- status = ares_expand_name (vptr, abuf, alen, &srv_curr->host, &len);
- if (status != ARES_SUCCESS)
- break;
- }
-
- /* Don't lose memory in the next iteration */
- ares_free (rr_name);
- rr_name = NULL;
-
- /* Move on to the next record */
- aptr += rr_len;
+
+ if (ares_dns_rr_get_class(rr) != ARES_CLASS_IN ||
+ ares_dns_rr_get_type(rr) != ARES_REC_TYPE_SRV) {
+ continue;
}
- if (hostname)
- ares_free (hostname);
- if (rr_name)
- ares_free (rr_name);
+ /* Allocate storage for this SRV answer appending it to the list */
+ srv_curr = ares_malloc_data(ARES_DATATYPE_SRV_REPLY);
+ if (srv_curr == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
- /* clean up on error */
- if (status != ARES_SUCCESS)
- {
- if (srv_head)
- ares_free_data (srv_head);
- return status;
+ /* Link in the record */
+ if (srv_last) {
+ srv_last->next = srv_curr;
+ } else {
+ srv_head = srv_curr;
}
+ srv_last = srv_curr;
+
+
+ srv_curr->priority = ares_dns_rr_get_u16(rr, ARES_RR_SRV_PRIORITY);
+ srv_curr->weight = ares_dns_rr_get_u16(rr, ARES_RR_SRV_WEIGHT);
+ srv_curr->port = ares_dns_rr_get_u16(rr, ARES_RR_SRV_PORT);
- /* everything looks fine, return the data */
- *srv_out = srv_head;
+ srv_curr->host = ares_strdup(ares_dns_rr_get_str(rr, ARES_RR_SRV_TARGET));
- return ARES_SUCCESS;
+ if (srv_curr->host == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ }
+
+done:
+ /* clean up on error */
+ if (status != ARES_SUCCESS) {
+ if (srv_head) {
+ ares_free_data(srv_head);
+ }
+ } else {
+ /* everything looks fine, return the data */
+ *srv_out = srv_head;
+ }
+ ares_dns_record_destroy(dnsrec);
+ return (int)status;
}
diff --git a/contrib/libs/c-ares/src/lib/ares_parse_txt_reply.c b/contrib/libs/c-ares/src/lib/ares_parse_txt_reply.c
index 083cbf4dff..85c3644b8c 100644
--- a/contrib/libs/c-ares/src/lib/ares_parse_txt_reply.c
+++ b/contrib/libs/c-ares/src/lib/ares_parse_txt_reply.c
@@ -1,7 +1,6 @@
/* MIT License
*
- * Copyright (c) 1998 Massachusetts Institute of Technology
- * Copyright (c) 2009 Jakub Hrozek
+ * Copyright (c) 2023 Brad House
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -26,199 +25,113 @@
*/
#include "ares_setup.h"
-
-#ifdef HAVE_NETINET_IN_H
-# include <netinet/in.h>
-#endif
-#ifdef HAVE_NETDB_H
-# include <netdb.h>
-#endif
-#ifdef HAVE_ARPA_INET_H
-# include <arpa/inet.h>
-#endif
-
-#include "ares_nameser.h"
-
-#ifdef HAVE_STRINGS_H
-# include <strings.h>
-#endif
-
#include "ares.h"
-#include "ares_dns.h"
#include "ares_data.h"
#include "ares_private.h"
-static int
-ares__parse_txt_reply (const unsigned char *abuf, int alen,
- int ex, void **txt_out)
+static int ares__parse_txt_reply(const unsigned char *abuf, size_t alen,
+ ares_bool_t ex, void **txt_out)
{
- size_t substr_len;
- unsigned int qdcount, ancount, i;
- const unsigned char *aptr;
- const unsigned char *strptr;
- int status, rr_type, rr_class, rr_len;
- long len;
- char *hostname = NULL, *rr_name = NULL;
+ ares_status_t status;
struct ares_txt_ext *txt_head = NULL;
struct ares_txt_ext *txt_last = NULL;
struct ares_txt_ext *txt_curr;
+ ares_dns_record_t *dnsrec = NULL;
+ size_t i;
- /* Set *txt_out to NULL for all failure cases. */
*txt_out = NULL;
- /* Give up if abuf doesn't have room for a header. */
- if (alen < HFIXEDSZ)
- return ARES_EBADRESP;
+ status = ares_dns_parse(abuf, alen, 0, &dnsrec);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ if (ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER) == 0) {
+ status = ARES_ENODATA;
+ goto done;
+ }
+
+ for (i = 0; i < ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER); i++) {
+ const ares_dns_rr_t *rr =
+ ares_dns_record_rr_get(dnsrec, ARES_SECTION_ANSWER, i);
+ const unsigned char *ptr;
+ size_t ptr_len;
+
+ if (rr == NULL) {
+ /* Shouldn't be possible */
+ status = ARES_EBADRESP;
+ goto done;
+ }
- /* Fetch the question and answer count from the header. */
- qdcount = DNS_HEADER_QDCOUNT (abuf);
- ancount = DNS_HEADER_ANCOUNT (abuf);
- if (qdcount != 1)
- return ARES_EBADRESP;
- if (ancount == 0)
- return ARES_ENODATA;
-
- /* Expand the name from the question, and skip past the question. */
- aptr = abuf + HFIXEDSZ;
- status = ares_expand_name (aptr, abuf, alen, &hostname, &len);
- if (status != ARES_SUCCESS)
- return status;
-
- if (aptr + len + QFIXEDSZ > abuf + alen)
- {
- ares_free (hostname);
- return ARES_EBADRESP;
+ /* XXX: Why Chaos? */
+ if ((ares_dns_rr_get_class(rr) != ARES_CLASS_IN &&
+ ares_dns_rr_get_class(rr) != ARES_CLASS_CHAOS) ||
+ ares_dns_rr_get_type(rr) != ARES_REC_TYPE_TXT) {
+ continue;
}
- aptr += len + QFIXEDSZ;
-
- /* Examine each answer resource record (RR) in turn. */
- for (i = 0; i < ancount; i++)
- {
- /* Decode the RR up to the data field. */
- status = ares_expand_name (aptr, abuf, alen, &rr_name, &len);
- if (status != ARES_SUCCESS)
- {
- break;
- }
- aptr += len;
- if (aptr + RRFIXEDSZ > abuf + alen)
- {
- status = ARES_EBADRESP;
- break;
- }
- rr_type = DNS_RR_TYPE (aptr);
- rr_class = DNS_RR_CLASS (aptr);
- rr_len = DNS_RR_LEN (aptr);
- aptr += RRFIXEDSZ;
- if (aptr + rr_len > abuf + alen)
- {
- status = ARES_EBADRESP;
- break;
- }
-
- /* Check if we are really looking at a TXT record */
- if ((rr_class == C_IN || rr_class == C_CHAOS) && rr_type == T_TXT)
- {
- /*
- * There may be multiple substrings in a single TXT record. Each
- * substring may be up to 255 characters in length, with a
- * "length byte" indicating the size of the substring payload.
- * RDATA contains both the length-bytes and payloads of all
- * substrings contained therein.
- */
-
- strptr = aptr;
- while (strptr < (aptr + rr_len))
- {
- substr_len = (unsigned char)*strptr;
- if (strptr + substr_len + 1 > aptr + rr_len)
- {
- status = ARES_EBADRESP;
- break;
- }
-
- /* Allocate storage for this TXT answer appending it to the list */
- txt_curr = ares_malloc_data(ex ? ARES_DATATYPE_TXT_EXT :
- ARES_DATATYPE_TXT_REPLY);
- if (!txt_curr)
- {
- status = ARES_ENOMEM;
- break;
- }
- if (txt_last)
- {
- txt_last->next = txt_curr;
- }
- else
- {
- txt_head = txt_curr;
- }
- txt_last = txt_curr;
-
- if (ex)
- txt_curr->record_start = (strptr == aptr);
- txt_curr->length = substr_len;
- txt_curr->txt = ares_malloc (substr_len + 1/* Including null byte */);
- if (txt_curr->txt == NULL)
- {
- status = ARES_ENOMEM;
- break;
- }
-
- ++strptr;
- memcpy ((char *) txt_curr->txt, strptr, substr_len);
-
- /* Make sure we NULL-terminate */
- txt_curr->txt[substr_len] = 0;
-
- strptr += substr_len;
- }
- }
-
- /* Propagate any failures */
- if (status != ARES_SUCCESS)
- {
- break;
- }
-
- /* Don't lose memory in the next iteration */
- ares_free (rr_name);
- rr_name = NULL;
-
- /* Move on to the next record */
- aptr += rr_len;
+
+ /* Allocate storage for this TXT answer appending it to the list */
+ txt_curr =
+ ares_malloc_data(ex ? ARES_DATATYPE_TXT_EXT : ARES_DATATYPE_TXT_REPLY);
+ if (txt_curr == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
}
- if (hostname)
- ares_free (hostname);
- if (rr_name)
- ares_free (rr_name);
+ /* Link in the record */
+ if (txt_last) {
+ txt_last->next = txt_curr;
+ } else {
+ txt_head = txt_curr;
+ }
+ txt_last = txt_curr;
- /* clean up on error */
- if (status != ARES_SUCCESS)
- {
- if (txt_head)
- ares_free_data (txt_head);
- return status;
+ /* These days, records are joined, always tag as start */
+ if (ex) {
+ txt_curr->record_start = 1;
}
- /* everything looks fine, return the data */
- *txt_out = txt_head;
+ ptr = ares_dns_rr_get_bin(rr, ARES_RR_TXT_DATA, &ptr_len);
+
+ txt_curr->txt = ares_malloc(ptr_len + 1);
+ if (txt_curr->txt == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ memcpy(txt_curr->txt, ptr, ptr_len);
+ txt_curr->txt[ptr_len] = 0;
+ txt_curr->length = ptr_len;
+ }
- return ARES_SUCCESS;
+done:
+ /* clean up on error */
+ if (status != ARES_SUCCESS) {
+ if (txt_head) {
+ ares_free_data(txt_head);
+ }
+ } else {
+ /* everything looks fine, return the data */
+ *txt_out = txt_head;
+ }
+ ares_dns_record_destroy(dnsrec);
+ return (int)status;
}
-int
-ares_parse_txt_reply (const unsigned char *abuf, int alen,
- struct ares_txt_reply **txt_out)
+int ares_parse_txt_reply(const unsigned char *abuf, int alen,
+ struct ares_txt_reply **txt_out)
{
- return ares__parse_txt_reply(abuf, alen, 0, (void **) txt_out);
+ if (alen < 0) {
+ return ARES_EBADRESP;
+ }
+ return ares__parse_txt_reply(abuf, (size_t)alen, ARES_FALSE,
+ (void **)txt_out);
}
-
-int
-ares_parse_txt_reply_ext (const unsigned char *abuf, int alen,
- struct ares_txt_ext **txt_out)
+int ares_parse_txt_reply_ext(const unsigned char *abuf, int alen,
+ struct ares_txt_ext **txt_out)
{
- return ares__parse_txt_reply(abuf, alen, 1, (void **) txt_out);
+ if (alen < 0) {
+ return ARES_EBADRESP;
+ }
+ return ares__parse_txt_reply(abuf, (size_t)alen, ARES_TRUE, (void **)txt_out);
}
diff --git a/contrib/libs/c-ares/src/lib/ares_parse_uri_reply.c b/contrib/libs/c-ares/src/lib/ares_parse_uri_reply.c
index d5bb7ee45d..bff7023f78 100644
--- a/contrib/libs/c-ares/src/lib/ares_parse_uri_reply.c
+++ b/contrib/libs/c-ares/src/lib/ares_parse_uri_reply.c
@@ -1,7 +1,6 @@
/* MIT License
*
- * Copyright (c) 1998 Massachusetts Institute of Technology
- * Copyright (c) 2009 Jakub Hrozek
+ * Copyright (c) 2023 Brad House
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -26,166 +25,91 @@
*/
#include "ares_setup.h"
-
-#ifdef HAVE_NETINET_IN_H
-# include <netinet/in.h>
-#endif
-#ifdef HAVE_NETDB_H
-# include <netdb.h>
-#endif
-#ifdef HAVE_ARPA_INET_H
-# include <arpa/inet.h>
-#endif
-
-#include "ares_nameser.h"
-
#include "ares.h"
-#include "ares_dns.h"
#include "ares_data.h"
#include "ares_private.h"
-/* AIX portability check */
-#ifndef T_URI
-# define T_URI 256 /* uri selection */
-#endif
-
-int
-ares_parse_uri_reply (const unsigned char *abuf, int alen,
- struct ares_uri_reply **uri_out)
+int ares_parse_uri_reply(const unsigned char *abuf, int alen_int,
+ struct ares_uri_reply **uri_out)
{
- unsigned int qdcount, ancount, i;
- const unsigned char *aptr, *vptr;
- int status, rr_type, rr_class, rr_len, rr_ttl;
- long len;
- char *uri_str = NULL, *rr_name = NULL;
+ ares_status_t status;
+ size_t alen;
struct ares_uri_reply *uri_head = NULL;
struct ares_uri_reply *uri_last = NULL;
struct ares_uri_reply *uri_curr;
+ ares_dns_record_t *dnsrec = NULL;
+ size_t i;
- /* Set *uri_out to NULL for all failure cases. */
*uri_out = NULL;
- /* Give up if abuf doesn't have room for a header. */
- if (alen < HFIXEDSZ){
- return ARES_EBADRESP;
+ if (alen_int < 0) {
+ return ARES_EBADRESP;
}
- /* Fetch the question and answer count from the header. */
- qdcount = DNS_HEADER_QDCOUNT (abuf);
- ancount = DNS_HEADER_ANCOUNT (abuf);
- if (qdcount != 1) {
- return ARES_EBADRESP;
- }
- if (ancount == 0) {
- return ARES_ENODATA;
+ alen = (size_t)alen_int;
+
+ status = ares_dns_parse(abuf, alen, 0, &dnsrec);
+ if (status != ARES_SUCCESS) {
+ goto done;
}
- /* Expand the name from the question, and skip past the question. */
- aptr = abuf + HFIXEDSZ;
- status = ares_expand_name (aptr, abuf, alen, &uri_str, &len);
- if (status != ARES_SUCCESS){
- return status;
+ if (ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER) == 0) {
+ status = ARES_ENODATA;
+ goto done;
}
- if (aptr + len + QFIXEDSZ > abuf + alen)
- {
- ares_free (uri_str);
- return ARES_EBADRESP;
+
+ for (i = 0; i < ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER); i++) {
+ const ares_dns_rr_t *rr =
+ ares_dns_record_rr_get(dnsrec, ARES_SECTION_ANSWER, i);
+
+ if (rr == NULL) {
+ /* Shouldn't be possible */
+ status = ARES_EBADRESP;
+ goto done;
}
- aptr += len + QFIXEDSZ;
-
- /* Examine each answer resource record (RR) in turn. */
- for (i = 0; i < ancount; i++)
- {
- /* Decode the RR up to the data field. */
- status = ares_expand_name (aptr, abuf, alen, &rr_name, &len);
- if (status != ARES_SUCCESS)
- {
- break;
- }
- aptr += len;
- if (aptr + RRFIXEDSZ > abuf + alen)
- {
- status = ARES_EBADRESP;
- break;
- }
-
- rr_type = DNS_RR_TYPE (aptr);
- rr_class = DNS_RR_CLASS (aptr);
- rr_ttl = DNS_RR_TTL(aptr);
- rr_len = DNS_RR_LEN (aptr);
- aptr += RRFIXEDSZ;
-
- if (aptr + rr_len > abuf + alen)
- {
- status = ARES_EBADRESP;
- break;
- }
-
- /* Check if we are really looking at a URI record */
- if (rr_class == C_IN && rr_type == T_URI)
- {
- /* parse the URI record itself */
- if (rr_len < 5)
- {
- status = ARES_EBADRESP;
- break;
- }
- /* Allocate storage for this URI answer appending it to the list */
- uri_curr = ares_malloc_data(ARES_DATATYPE_URI_REPLY);
- if (!uri_curr)
- {
- status = ARES_ENOMEM;
- break;
- }
- if (uri_last)
- {
- uri_last->next = uri_curr;
- }
- else
- {
- uri_head = uri_curr;
- }
- uri_last = uri_curr;
-
- vptr = aptr;
- uri_curr->priority = DNS__16BIT(vptr);
- vptr += sizeof(unsigned short);
- uri_curr->weight = DNS__16BIT(vptr);
- vptr += sizeof(unsigned short);
- uri_curr->uri = (char *)ares_malloc(rr_len-3);
- if (!uri_curr->uri)
- {
- status = ARES_ENOMEM;
- break;
- }
- uri_curr->uri = strncpy(uri_curr->uri, (const char *)vptr, rr_len-4);
- uri_curr->uri[rr_len-4]='\0';
- uri_curr->ttl = rr_ttl;
- }
-
- /* Don't lose memory in the next iteration */
- ares_free (rr_name);
- rr_name = NULL;
-
- /* Move on to the next record */
- aptr += rr_len;
+
+ if (ares_dns_rr_get_class(rr) != ARES_CLASS_IN ||
+ ares_dns_rr_get_type(rr) != ARES_REC_TYPE_URI) {
+ continue;
}
- if (uri_str)
- ares_free (uri_str);
- if (rr_name)
- ares_free (rr_name);
+ /* Allocate storage for this URI answer appending it to the list */
+ uri_curr = ares_malloc_data(ARES_DATATYPE_URI_REPLY);
+ if (uri_curr == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
- /* clean up on error */
- if (status != ARES_SUCCESS)
- {
- if (uri_head)
- ares_free_data (uri_head);
- return status;
+ /* Link in the record */
+ if (uri_last) {
+ uri_last->next = uri_curr;
+ } else {
+ uri_head = uri_curr;
}
+ uri_last = uri_curr;
+
- /* everything looks fine, return the data */
- *uri_out = uri_head;
+ uri_curr->priority = ares_dns_rr_get_u16(rr, ARES_RR_URI_PRIORITY);
+ uri_curr->weight = ares_dns_rr_get_u16(rr, ARES_RR_URI_WEIGHT);
+ uri_curr->uri = ares_strdup(ares_dns_rr_get_str(rr, ARES_RR_URI_TARGET));
+ uri_curr->ttl = (int)ares_dns_rr_get_ttl(rr);
- return ARES_SUCCESS;
+ if (uri_curr->uri == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ }
+
+done:
+ /* clean up on error */
+ if (status != ARES_SUCCESS) {
+ if (uri_head) {
+ ares_free_data(uri_head);
+ }
+ } else {
+ /* everything looks fine, return the data */
+ *uri_out = uri_head;
+ }
+ ares_dns_record_destroy(dnsrec);
+ return (int)status;
}
diff --git a/contrib/libs/c-ares/src/lib/ares_platform.c b/contrib/libs/c-ares/src/lib/ares_platform.c
index 6fcbd49bb8..0727ae001c 100644
--- a/contrib/libs/c-ares/src/lib/ares_platform.c
+++ b/contrib/libs/c-ares/src/lib/ares_platform.c
@@ -29,15 +29,14 @@
#include "ares.h"
#include "ares_platform.h"
-#include "ares_nowarn.h"
#include "ares_private.h"
#if defined(WIN32) && !defined(MSDOS)
-#define V_PLATFORM_WIN32s 0
-#define V_PLATFORM_WIN32_WINDOWS 1
-#define V_PLATFORM_WIN32_NT 2
-#define V_PLATFORM_WIN32_CE 3
+# define V_PLATFORM_WIN32s 0
+# define V_PLATFORM_WIN32_WINDOWS 1
+# define V_PLATFORM_WIN32_NT 2
+# define V_PLATFORM_WIN32_CE 3
win_platform ares__getplatform(void)
{
@@ -45,38 +44,38 @@ win_platform ares__getplatform(void)
memset(&OsvEx, 0, sizeof(OsvEx));
OsvEx.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
-#ifdef _MSC_VER
-#pragma warning(push)
-#pragma warning(disable:4996) /* warning C4996: 'GetVersionExW': was declared deprecated */
-#endif
- if (!GetVersionEx((void *)&OsvEx))
- {
- memset(&OsvEx, 0, sizeof(OsvEx));
- OsvEx.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
- if (!GetVersionEx((void *)&OsvEx))
- return WIN_UNKNOWN;
+# ifdef _MSC_VER
+# pragma warning(push)
+# pragma warning(disable : 4996) /* warning C4996: 'GetVersionExW': was \
+ declared deprecated */
+# endif
+ if (!GetVersionEx((void *)&OsvEx)) {
+ memset(&OsvEx, 0, sizeof(OsvEx));
+ OsvEx.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+ if (!GetVersionEx((void *)&OsvEx)) {
+ return WIN_UNKNOWN;
}
-#ifdef _MSC_VER
-#pragma warning(pop)
-#endif
+ }
+# ifdef _MSC_VER
+# pragma warning(pop)
+# endif
- switch(OsvEx.dwPlatformId)
- {
- case V_PLATFORM_WIN32s:
- return WIN_3X;
+ switch (OsvEx.dwPlatformId) {
+ case V_PLATFORM_WIN32s:
+ return WIN_3X;
- case V_PLATFORM_WIN32_WINDOWS:
- return WIN_9X;
+ case V_PLATFORM_WIN32_WINDOWS:
+ return WIN_9X;
- case V_PLATFORM_WIN32_NT:
- return WIN_NT;
+ case V_PLATFORM_WIN32_NT:
+ return WIN_NT;
- case V_PLATFORM_WIN32_CE:
- return WIN_CE;
+ case V_PLATFORM_WIN32_CE:
+ return WIN_CE;
- default:
- return WIN_UNKNOWN;
- }
+ default:
+ return WIN_UNKNOWN;
+ }
}
#endif /* WIN32 && ! MSDOS */
@@ -84,16 +83,16 @@ win_platform ares__getplatform(void)
#if defined(_WIN32_WCE)
/* IANA Well Known Ports are in range 0-1023 */
-#define USE_IANA_WELL_KNOWN_PORTS 1
+# define USE_IANA_WELL_KNOWN_PORTS 1
/* IANA Registered Ports are in range 1024-49151 */
-#define USE_IANA_REGISTERED_PORTS 1
+# define USE_IANA_REGISTERED_PORTS 1
struct pvt_servent {
- char *s_name;
- char **s_aliases;
- unsigned short s_port;
- char *s_proto;
+ char *s_name;
+ char **s_aliases;
+ unsigned short s_port;
+ char *s_proto;
};
/*
@@ -101,10948 +100,10948 @@ struct pvt_servent {
*/
static struct pvt_servent IANAports[] = {
-#ifdef USE_IANA_WELL_KNOWN_PORTS
-{"tcpmux", {NULL}, 1, "tcp"},
-{"tcpmux", {NULL}, 1, "udp"},
-{"compressnet", {NULL}, 2, "tcp"},
-{"compressnet", {NULL}, 2, "udp"},
-{"compressnet", {NULL}, 3, "tcp"},
-{"compressnet", {NULL}, 3, "udp"},
-{"rje", {NULL}, 5, "tcp"},
-{"rje", {NULL}, 5, "udp"},
-{"echo", {NULL}, 7, "tcp"},
-{"echo", {NULL}, 7, "udp"},
-{"discard", {NULL}, 9, "tcp"},
-{"discard", {NULL}, 9, "udp"},
-{"discard", {NULL}, 9, "sctp"},
-{"discard", {NULL}, 9, "dccp"},
-{"systat", {NULL}, 11, "tcp"},
-{"systat", {NULL}, 11, "udp"},
-{"daytime", {NULL}, 13, "tcp"},
-{"daytime", {NULL}, 13, "udp"},
-{"qotd", {NULL}, 17, "tcp"},
-{"qotd", {NULL}, 17, "udp"},
-{"msp", {NULL}, 18, "tcp"},
-{"msp", {NULL}, 18, "udp"},
-{"chargen", {NULL}, 19, "tcp"},
-{"chargen", {NULL}, 19, "udp"},
-{"ftp-data", {NULL}, 20, "tcp"},
-{"ftp-data", {NULL}, 20, "udp"},
-{"ftp-data", {NULL}, 20, "sctp"},
-{"ftp", {NULL}, 21, "tcp"},
-{"ftp", {NULL}, 21, "udp"},
-{"ftp", {NULL}, 21, "sctp"},
-{"ssh", {NULL}, 22, "tcp"},
-{"ssh", {NULL}, 22, "udp"},
-{"ssh", {NULL}, 22, "sctp"},
-{"telnet", {NULL}, 23, "tcp"},
-{"telnet", {NULL}, 23, "udp"},
-{"smtp", {NULL}, 25, "tcp"},
-{"smtp", {NULL}, 25, "udp"},
-{"nsw-fe", {NULL}, 27, "tcp"},
-{"nsw-fe", {NULL}, 27, "udp"},
-{"msg-icp", {NULL}, 29, "tcp"},
-{"msg-icp", {NULL}, 29, "udp"},
-{"msg-auth", {NULL}, 31, "tcp"},
-{"msg-auth", {NULL}, 31, "udp"},
-{"dsp", {NULL}, 33, "tcp"},
-{"dsp", {NULL}, 33, "udp"},
-{"time", {NULL}, 37, "tcp"},
-{"time", {NULL}, 37, "udp"},
-{"rap", {NULL}, 38, "tcp"},
-{"rap", {NULL}, 38, "udp"},
-{"rlp", {NULL}, 39, "tcp"},
-{"rlp", {NULL}, 39, "udp"},
-{"graphics", {NULL}, 41, "tcp"},
-{"graphics", {NULL}, 41, "udp"},
-{"name", {NULL}, 42, "tcp"},
-{"name", {NULL}, 42, "udp"},
-{"nameserver", {NULL}, 42, "tcp"},
-{"nameserver", {NULL}, 42, "udp"},
-{"nicname", {NULL}, 43, "tcp"},
-{"nicname", {NULL}, 43, "udp"},
-{"mpm-flags", {NULL}, 44, "tcp"},
-{"mpm-flags", {NULL}, 44, "udp"},
-{"mpm", {NULL}, 45, "tcp"},
-{"mpm", {NULL}, 45, "udp"},
-{"mpm-snd", {NULL}, 46, "tcp"},
-{"mpm-snd", {NULL}, 46, "udp"},
-{"ni-ftp", {NULL}, 47, "tcp"},
-{"ni-ftp", {NULL}, 47, "udp"},
-{"auditd", {NULL}, 48, "tcp"},
-{"auditd", {NULL}, 48, "udp"},
-{"tacacs", {NULL}, 49, "tcp"},
-{"tacacs", {NULL}, 49, "udp"},
-{"re-mail-ck", {NULL}, 50, "tcp"},
-{"re-mail-ck", {NULL}, 50, "udp"},
-{"la-maint", {NULL}, 51, "tcp"},
-{"la-maint", {NULL}, 51, "udp"},
-{"xns-time", {NULL}, 52, "tcp"},
-{"xns-time", {NULL}, 52, "udp"},
-{"domain", {NULL}, 53, "tcp"},
-{"domain", {NULL}, 53, "udp"},
-{"xns-ch", {NULL}, 54, "tcp"},
-{"xns-ch", {NULL}, 54, "udp"},
-{"isi-gl", {NULL}, 55, "tcp"},
-{"isi-gl", {NULL}, 55, "udp"},
-{"xns-auth", {NULL}, 56, "tcp"},
-{"xns-auth", {NULL}, 56, "udp"},
-{"xns-mail", {NULL}, 58, "tcp"},
-{"xns-mail", {NULL}, 58, "udp"},
-{"ni-mail", {NULL}, 61, "tcp"},
-{"ni-mail", {NULL}, 61, "udp"},
-{"acas", {NULL}, 62, "tcp"},
-{"acas", {NULL}, 62, "udp"},
-{"whois++", {NULL}, 63, "tcp"},
-{"whois++", {NULL}, 63, "udp"},
-{"covia", {NULL}, 64, "tcp"},
-{"covia", {NULL}, 64, "udp"},
-{"tacacs-ds", {NULL}, 65, "tcp"},
-{"tacacs-ds", {NULL}, 65, "udp"},
-{"sql*net", {NULL}, 66, "tcp"},
-{"sql*net", {NULL}, 66, "udp"},
-{"bootps", {NULL}, 67, "tcp"},
-{"bootps", {NULL}, 67, "udp"},
-{"bootpc", {NULL}, 68, "tcp"},
-{"bootpc", {NULL}, 68, "udp"},
-{"tftp", {NULL}, 69, "tcp"},
-{"tftp", {NULL}, 69, "udp"},
-{"gopher", {NULL}, 70, "tcp"},
-{"gopher", {NULL}, 70, "udp"},
-{"netrjs-1", {NULL}, 71, "tcp"},
-{"netrjs-1", {NULL}, 71, "udp"},
-{"netrjs-2", {NULL}, 72, "tcp"},
-{"netrjs-2", {NULL}, 72, "udp"},
-{"netrjs-3", {NULL}, 73, "tcp"},
-{"netrjs-3", {NULL}, 73, "udp"},
-{"netrjs-4", {NULL}, 74, "tcp"},
-{"netrjs-4", {NULL}, 74, "udp"},
-{"deos", {NULL}, 76, "tcp"},
-{"deos", {NULL}, 76, "udp"},
-{"vettcp", {NULL}, 78, "tcp"},
-{"vettcp", {NULL}, 78, "udp"},
-{"finger", {NULL}, 79, "tcp"},
-{"finger", {NULL}, 79, "udp"},
-{"http", {NULL}, 80, "tcp"},
-{"http", {NULL}, 80, "udp"},
-{"www", {NULL}, 80, "tcp"},
-{"www", {NULL}, 80, "udp"},
-{"www-http", {NULL}, 80, "tcp"},
-{"www-http", {NULL}, 80, "udp"},
-{"http", {NULL}, 80, "sctp"},
-{"xfer", {NULL}, 82, "tcp"},
-{"xfer", {NULL}, 82, "udp"},
-{"mit-ml-dev", {NULL}, 83, "tcp"},
-{"mit-ml-dev", {NULL}, 83, "udp"},
-{"ctf", {NULL}, 84, "tcp"},
-{"ctf", {NULL}, 84, "udp"},
-{"mit-ml-dev", {NULL}, 85, "tcp"},
-{"mit-ml-dev", {NULL}, 85, "udp"},
-{"mfcobol", {NULL}, 86, "tcp"},
-{"mfcobol", {NULL}, 86, "udp"},
-{"kerberos", {NULL}, 88, "tcp"},
-{"kerberos", {NULL}, 88, "udp"},
-{"su-mit-tg", {NULL}, 89, "tcp"},
-{"su-mit-tg", {NULL}, 89, "udp"},
-{"dnsix", {NULL}, 90, "tcp"},
-{"dnsix", {NULL}, 90, "udp"},
-{"mit-dov", {NULL}, 91, "tcp"},
-{"mit-dov", {NULL}, 91, "udp"},
-{"npp", {NULL}, 92, "tcp"},
-{"npp", {NULL}, 92, "udp"},
-{"dcp", {NULL}, 93, "tcp"},
-{"dcp", {NULL}, 93, "udp"},
-{"objcall", {NULL}, 94, "tcp"},
-{"objcall", {NULL}, 94, "udp"},
-{"supdup", {NULL}, 95, "tcp"},
-{"supdup", {NULL}, 95, "udp"},
-{"dixie", {NULL}, 96, "tcp"},
-{"dixie", {NULL}, 96, "udp"},
-{"swift-rvf", {NULL}, 97, "tcp"},
-{"swift-rvf", {NULL}, 97, "udp"},
-{"tacnews", {NULL}, 98, "tcp"},
-{"tacnews", {NULL}, 98, "udp"},
-{"metagram", {NULL}, 99, "tcp"},
-{"metagram", {NULL}, 99, "udp"},
-{"newacct", {NULL}, 100, "tcp"},
-{"hostname", {NULL}, 101, "tcp"},
-{"hostname", {NULL}, 101, "udp"},
-{"iso-tsap", {NULL}, 102, "tcp"},
-{"iso-tsap", {NULL}, 102, "udp"},
-{"gppitnp", {NULL}, 103, "tcp"},
-{"gppitnp", {NULL}, 103, "udp"},
-{"acr-nema", {NULL}, 104, "tcp"},
-{"acr-nema", {NULL}, 104, "udp"},
-{"cso", {NULL}, 105, "tcp"},
-{"cso", {NULL}, 105, "udp"},
-{"csnet-ns", {NULL}, 105, "tcp"},
-{"csnet-ns", {NULL}, 105, "udp"},
-{"3com-tsmux", {NULL}, 106, "tcp"},
-{"3com-tsmux", {NULL}, 106, "udp"},
-{"rtelnet", {NULL}, 107, "tcp"},
-{"rtelnet", {NULL}, 107, "udp"},
-{"snagas", {NULL}, 108, "tcp"},
-{"snagas", {NULL}, 108, "udp"},
-{"pop2", {NULL}, 109, "tcp"},
-{"pop2", {NULL}, 109, "udp"},
-{"pop3", {NULL}, 110, "tcp"},
-{"pop3", {NULL}, 110, "udp"},
-{"sunrpc", {NULL}, 111, "tcp"},
-{"sunrpc", {NULL}, 111, "udp"},
-{"mcidas", {NULL}, 112, "tcp"},
-{"mcidas", {NULL}, 112, "udp"},
-{"ident", {NULL}, 113, "tcp"},
-{"auth", {NULL}, 113, "tcp"},
-{"auth", {NULL}, 113, "udp"},
-{"sftp", {NULL}, 115, "tcp"},
-{"sftp", {NULL}, 115, "udp"},
-{"ansanotify", {NULL}, 116, "tcp"},
-{"ansanotify", {NULL}, 116, "udp"},
-{"uucp-path", {NULL}, 117, "tcp"},
-{"uucp-path", {NULL}, 117, "udp"},
-{"sqlserv", {NULL}, 118, "tcp"},
-{"sqlserv", {NULL}, 118, "udp"},
-{"nntp", {NULL}, 119, "tcp"},
-{"nntp", {NULL}, 119, "udp"},
-{"cfdptkt", {NULL}, 120, "tcp"},
-{"cfdptkt", {NULL}, 120, "udp"},
-{"erpc", {NULL}, 121, "tcp"},
-{"erpc", {NULL}, 121, "udp"},
-{"smakynet", {NULL}, 122, "tcp"},
-{"smakynet", {NULL}, 122, "udp"},
-{"ntp", {NULL}, 123, "tcp"},
-{"ntp", {NULL}, 123, "udp"},
-{"ansatrader", {NULL}, 124, "tcp"},
-{"ansatrader", {NULL}, 124, "udp"},
-{"locus-map", {NULL}, 125, "tcp"},
-{"locus-map", {NULL}, 125, "udp"},
-{"nxedit", {NULL}, 126, "tcp"},
-{"nxedit", {NULL}, 126, "udp"},
-{"locus-con", {NULL}, 127, "tcp"},
-{"locus-con", {NULL}, 127, "udp"},
-{"gss-xlicen", {NULL}, 128, "tcp"},
-{"gss-xlicen", {NULL}, 128, "udp"},
-{"pwdgen", {NULL}, 129, "tcp"},
-{"pwdgen", {NULL}, 129, "udp"},
-{"cisco-fna", {NULL}, 130, "tcp"},
-{"cisco-fna", {NULL}, 130, "udp"},
-{"cisco-tna", {NULL}, 131, "tcp"},
-{"cisco-tna", {NULL}, 131, "udp"},
-{"cisco-sys", {NULL}, 132, "tcp"},
-{"cisco-sys", {NULL}, 132, "udp"},
-{"statsrv", {NULL}, 133, "tcp"},
-{"statsrv", {NULL}, 133, "udp"},
-{"ingres-net", {NULL}, 134, "tcp"},
-{"ingres-net", {NULL}, 134, "udp"},
-{"epmap", {NULL}, 135, "tcp"},
-{"epmap", {NULL}, 135, "udp"},
-{"profile", {NULL}, 136, "tcp"},
-{"profile", {NULL}, 136, "udp"},
-{"netbios-ns", {NULL}, 137, "tcp"},
-{"netbios-ns", {NULL}, 137, "udp"},
-{"netbios-dgm", {NULL}, 138, "tcp"},
-{"netbios-dgm", {NULL}, 138, "udp"},
-{"netbios-ssn", {NULL}, 139, "tcp"},
-{"netbios-ssn", {NULL}, 139, "udp"},
-{"emfis-data", {NULL}, 140, "tcp"},
-{"emfis-data", {NULL}, 140, "udp"},
-{"emfis-cntl", {NULL}, 141, "tcp"},
-{"emfis-cntl", {NULL}, 141, "udp"},
-{"bl-idm", {NULL}, 142, "tcp"},
-{"bl-idm", {NULL}, 142, "udp"},
-{"imap", {NULL}, 143, "tcp"},
-{"imap", {NULL}, 143, "udp"},
-{"uma", {NULL}, 144, "tcp"},
-{"uma", {NULL}, 144, "udp"},
-{"uaac", {NULL}, 145, "tcp"},
-{"uaac", {NULL}, 145, "udp"},
-{"iso-tp0", {NULL}, 146, "tcp"},
-{"iso-tp0", {NULL}, 146, "udp"},
-{"iso-ip", {NULL}, 147, "tcp"},
-{"iso-ip", {NULL}, 147, "udp"},
-{"jargon", {NULL}, 148, "tcp"},
-{"jargon", {NULL}, 148, "udp"},
-{"aed-512", {NULL}, 149, "tcp"},
-{"aed-512", {NULL}, 149, "udp"},
-{"sql-net", {NULL}, 150, "tcp"},
-{"sql-net", {NULL}, 150, "udp"},
-{"hems", {NULL}, 151, "tcp"},
-{"hems", {NULL}, 151, "udp"},
-{"bftp", {NULL}, 152, "tcp"},
-{"bftp", {NULL}, 152, "udp"},
-{"sgmp", {NULL}, 153, "tcp"},
-{"sgmp", {NULL}, 153, "udp"},
-{"netsc-prod", {NULL}, 154, "tcp"},
-{"netsc-prod", {NULL}, 154, "udp"},
-{"netsc-dev", {NULL}, 155, "tcp"},
-{"netsc-dev", {NULL}, 155, "udp"},
-{"sqlsrv", {NULL}, 156, "tcp"},
-{"sqlsrv", {NULL}, 156, "udp"},
-{"knet-cmp", {NULL}, 157, "tcp"},
-{"knet-cmp", {NULL}, 157, "udp"},
-{"pcmail-srv", {NULL}, 158, "tcp"},
-{"pcmail-srv", {NULL}, 158, "udp"},
-{"nss-routing", {NULL}, 159, "tcp"},
-{"nss-routing", {NULL}, 159, "udp"},
-{"sgmp-traps", {NULL}, 160, "tcp"},
-{"sgmp-traps", {NULL}, 160, "udp"},
-{"snmp", {NULL}, 161, "tcp"},
-{"snmp", {NULL}, 161, "udp"},
-{"snmptrap", {NULL}, 162, "tcp"},
-{"snmptrap", {NULL}, 162, "udp"},
-{"cmip-man", {NULL}, 163, "tcp"},
-{"cmip-man", {NULL}, 163, "udp"},
-{"cmip-agent", {NULL}, 164, "tcp"},
-{"cmip-agent", {NULL}, 164, "udp"},
-{"xns-courier", {NULL}, 165, "tcp"},
-{"xns-courier", {NULL}, 165, "udp"},
-{"s-net", {NULL}, 166, "tcp"},
-{"s-net", {NULL}, 166, "udp"},
-{"namp", {NULL}, 167, "tcp"},
-{"namp", {NULL}, 167, "udp"},
-{"rsvd", {NULL}, 168, "tcp"},
-{"rsvd", {NULL}, 168, "udp"},
-{"send", {NULL}, 169, "tcp"},
-{"send", {NULL}, 169, "udp"},
-{"print-srv", {NULL}, 170, "tcp"},
-{"print-srv", {NULL}, 170, "udp"},
-{"multiplex", {NULL}, 171, "tcp"},
-{"multiplex", {NULL}, 171, "udp"},
-{"cl/1", {NULL}, 172, "tcp"},
-{"cl/1", {NULL}, 172, "udp"},
-{"xyplex-mux", {NULL}, 173, "tcp"},
-{"xyplex-mux", {NULL}, 173, "udp"},
-{"mailq", {NULL}, 174, "tcp"},
-{"mailq", {NULL}, 174, "udp"},
-{"vmnet", {NULL}, 175, "tcp"},
-{"vmnet", {NULL}, 175, "udp"},
-{"genrad-mux", {NULL}, 176, "tcp"},
-{"genrad-mux", {NULL}, 176, "udp"},
-{"xdmcp", {NULL}, 177, "tcp"},
-{"xdmcp", {NULL}, 177, "udp"},
-{"nextstep", {NULL}, 178, "tcp"},
-{"nextstep", {NULL}, 178, "udp"},
-{"bgp", {NULL}, 179, "tcp"},
-{"bgp", {NULL}, 179, "udp"},
-{"bgp", {NULL}, 179, "sctp"},
-{"ris", {NULL}, 180, "tcp"},
-{"ris", {NULL}, 180, "udp"},
-{"unify", {NULL}, 181, "tcp"},
-{"unify", {NULL}, 181, "udp"},
-{"audit", {NULL}, 182, "tcp"},
-{"audit", {NULL}, 182, "udp"},
-{"ocbinder", {NULL}, 183, "tcp"},
-{"ocbinder", {NULL}, 183, "udp"},
-{"ocserver", {NULL}, 184, "tcp"},
-{"ocserver", {NULL}, 184, "udp"},
-{"remote-kis", {NULL}, 185, "tcp"},
-{"remote-kis", {NULL}, 185, "udp"},
-{"kis", {NULL}, 186, "tcp"},
-{"kis", {NULL}, 186, "udp"},
-{"aci", {NULL}, 187, "tcp"},
-{"aci", {NULL}, 187, "udp"},
-{"mumps", {NULL}, 188, "tcp"},
-{"mumps", {NULL}, 188, "udp"},
-{"qft", {NULL}, 189, "tcp"},
-{"qft", {NULL}, 189, "udp"},
-{"gacp", {NULL}, 190, "tcp"},
-{"gacp", {NULL}, 190, "udp"},
-{"prospero", {NULL}, 191, "tcp"},
-{"prospero", {NULL}, 191, "udp"},
-{"osu-nms", {NULL}, 192, "tcp"},
-{"osu-nms", {NULL}, 192, "udp"},
-{"srmp", {NULL}, 193, "tcp"},
-{"srmp", {NULL}, 193, "udp"},
-{"irc", {NULL}, 194, "tcp"},
-{"irc", {NULL}, 194, "udp"},
-{"dn6-nlm-aud", {NULL}, 195, "tcp"},
-{"dn6-nlm-aud", {NULL}, 195, "udp"},
-{"dn6-smm-red", {NULL}, 196, "tcp"},
-{"dn6-smm-red", {NULL}, 196, "udp"},
-{"dls", {NULL}, 197, "tcp"},
-{"dls", {NULL}, 197, "udp"},
-{"dls-mon", {NULL}, 198, "tcp"},
-{"dls-mon", {NULL}, 198, "udp"},
-{"smux", {NULL}, 199, "tcp"},
-{"smux", {NULL}, 199, "udp"},
-{"src", {NULL}, 200, "tcp"},
-{"src", {NULL}, 200, "udp"},
-{"at-rtmp", {NULL}, 201, "tcp"},
-{"at-rtmp", {NULL}, 201, "udp"},
-{"at-nbp", {NULL}, 202, "tcp"},
-{"at-nbp", {NULL}, 202, "udp"},
-{"at-3", {NULL}, 203, "tcp"},
-{"at-3", {NULL}, 203, "udp"},
-{"at-echo", {NULL}, 204, "tcp"},
-{"at-echo", {NULL}, 204, "udp"},
-{"at-5", {NULL}, 205, "tcp"},
-{"at-5", {NULL}, 205, "udp"},
-{"at-zis", {NULL}, 206, "tcp"},
-{"at-zis", {NULL}, 206, "udp"},
-{"at-7", {NULL}, 207, "tcp"},
-{"at-7", {NULL}, 207, "udp"},
-{"at-8", {NULL}, 208, "tcp"},
-{"at-8", {NULL}, 208, "udp"},
-{"qmtp", {NULL}, 209, "tcp"},
-{"qmtp", {NULL}, 209, "udp"},
-{"z39.50", {NULL}, 210, "tcp"},
-{"z39.50", {NULL}, 210, "udp"},
-{"914c/g", {NULL}, 211, "tcp"},
-{"914c/g", {NULL}, 211, "udp"},
-{"anet", {NULL}, 212, "tcp"},
-{"anet", {NULL}, 212, "udp"},
-{"ipx", {NULL}, 213, "tcp"},
-{"ipx", {NULL}, 213, "udp"},
-{"vmpwscs", {NULL}, 214, "tcp"},
-{"vmpwscs", {NULL}, 214, "udp"},
-{"softpc", {NULL}, 215, "tcp"},
-{"softpc", {NULL}, 215, "udp"},
-{"CAIlic", {NULL}, 216, "tcp"},
-{"CAIlic", {NULL}, 216, "udp"},
-{"dbase", {NULL}, 217, "tcp"},
-{"dbase", {NULL}, 217, "udp"},
-{"mpp", {NULL}, 218, "tcp"},
-{"mpp", {NULL}, 218, "udp"},
-{"uarps", {NULL}, 219, "tcp"},
-{"uarps", {NULL}, 219, "udp"},
-{"imap3", {NULL}, 220, "tcp"},
-{"imap3", {NULL}, 220, "udp"},
-{"fln-spx", {NULL}, 221, "tcp"},
-{"fln-spx", {NULL}, 221, "udp"},
-{"rsh-spx", {NULL}, 222, "tcp"},
-{"rsh-spx", {NULL}, 222, "udp"},
-{"cdc", {NULL}, 223, "tcp"},
-{"cdc", {NULL}, 223, "udp"},
-{"masqdialer", {NULL}, 224, "tcp"},
-{"masqdialer", {NULL}, 224, "udp"},
-{"direct", {NULL}, 242, "tcp"},
-{"direct", {NULL}, 242, "udp"},
-{"sur-meas", {NULL}, 243, "tcp"},
-{"sur-meas", {NULL}, 243, "udp"},
-{"inbusiness", {NULL}, 244, "tcp"},
-{"inbusiness", {NULL}, 244, "udp"},
-{"link", {NULL}, 245, "tcp"},
-{"link", {NULL}, 245, "udp"},
-{"dsp3270", {NULL}, 246, "tcp"},
-{"dsp3270", {NULL}, 246, "udp"},
-{"subntbcst_tftp", {NULL}, 247, "tcp"},
-{"subntbcst_tftp", {NULL}, 247, "udp"},
-{"bhfhs", {NULL}, 248, "tcp"},
-{"bhfhs", {NULL}, 248, "udp"},
-{"rap", {NULL}, 256, "tcp"},
-{"rap", {NULL}, 256, "udp"},
-{"set", {NULL}, 257, "tcp"},
-{"set", {NULL}, 257, "udp"},
-{"esro-gen", {NULL}, 259, "tcp"},
-{"esro-gen", {NULL}, 259, "udp"},
-{"openport", {NULL}, 260, "tcp"},
-{"openport", {NULL}, 260, "udp"},
-{"nsiiops", {NULL}, 261, "tcp"},
-{"nsiiops", {NULL}, 261, "udp"},
-{"arcisdms", {NULL}, 262, "tcp"},
-{"arcisdms", {NULL}, 262, "udp"},
-{"hdap", {NULL}, 263, "tcp"},
-{"hdap", {NULL}, 263, "udp"},
-{"bgmp", {NULL}, 264, "tcp"},
-{"bgmp", {NULL}, 264, "udp"},
-{"x-bone-ctl", {NULL}, 265, "tcp"},
-{"x-bone-ctl", {NULL}, 265, "udp"},
-{"sst", {NULL}, 266, "tcp"},
-{"sst", {NULL}, 266, "udp"},
-{"td-service", {NULL}, 267, "tcp"},
-{"td-service", {NULL}, 267, "udp"},
-{"td-replica", {NULL}, 268, "tcp"},
-{"td-replica", {NULL}, 268, "udp"},
-{"manet", {NULL}, 269, "tcp"},
-{"manet", {NULL}, 269, "udp"},
-{"gist", {NULL}, 270, "udp"},
-{"http-mgmt", {NULL}, 280, "tcp"},
-{"http-mgmt", {NULL}, 280, "udp"},
-{"personal-link", {NULL}, 281, "tcp"},
-{"personal-link", {NULL}, 281, "udp"},
-{"cableport-ax", {NULL}, 282, "tcp"},
-{"cableport-ax", {NULL}, 282, "udp"},
-{"rescap", {NULL}, 283, "tcp"},
-{"rescap", {NULL}, 283, "udp"},
-{"corerjd", {NULL}, 284, "tcp"},
-{"corerjd", {NULL}, 284, "udp"},
-{"fxp", {NULL}, 286, "tcp"},
-{"fxp", {NULL}, 286, "udp"},
-{"k-block", {NULL}, 287, "tcp"},
-{"k-block", {NULL}, 287, "udp"},
-{"novastorbakcup", {NULL}, 308, "tcp"},
-{"novastorbakcup", {NULL}, 308, "udp"},
-{"entrusttime", {NULL}, 309, "tcp"},
-{"entrusttime", {NULL}, 309, "udp"},
-{"bhmds", {NULL}, 310, "tcp"},
-{"bhmds", {NULL}, 310, "udp"},
-{"asip-webadmin", {NULL}, 311, "tcp"},
-{"asip-webadmin", {NULL}, 311, "udp"},
-{"vslmp", {NULL}, 312, "tcp"},
-{"vslmp", {NULL}, 312, "udp"},
-{"magenta-logic", {NULL}, 313, "tcp"},
-{"magenta-logic", {NULL}, 313, "udp"},
-{"opalis-robot", {NULL}, 314, "tcp"},
-{"opalis-robot", {NULL}, 314, "udp"},
-{"dpsi", {NULL}, 315, "tcp"},
-{"dpsi", {NULL}, 315, "udp"},
-{"decauth", {NULL}, 316, "tcp"},
-{"decauth", {NULL}, 316, "udp"},
-{"zannet", {NULL}, 317, "tcp"},
-{"zannet", {NULL}, 317, "udp"},
-{"pkix-timestamp", {NULL}, 318, "tcp"},
-{"pkix-timestamp", {NULL}, 318, "udp"},
-{"ptp-event", {NULL}, 319, "tcp"},
-{"ptp-event", {NULL}, 319, "udp"},
-{"ptp-general", {NULL}, 320, "tcp"},
-{"ptp-general", {NULL}, 320, "udp"},
-{"pip", {NULL}, 321, "tcp"},
-{"pip", {NULL}, 321, "udp"},
-{"rtsps", {NULL}, 322, "tcp"},
-{"rtsps", {NULL}, 322, "udp"},
-{"texar", {NULL}, 333, "tcp"},
-{"texar", {NULL}, 333, "udp"},
-{"pdap", {NULL}, 344, "tcp"},
-{"pdap", {NULL}, 344, "udp"},
-{"pawserv", {NULL}, 345, "tcp"},
-{"pawserv", {NULL}, 345, "udp"},
-{"zserv", {NULL}, 346, "tcp"},
-{"zserv", {NULL}, 346, "udp"},
-{"fatserv", {NULL}, 347, "tcp"},
-{"fatserv", {NULL}, 347, "udp"},
-{"csi-sgwp", {NULL}, 348, "tcp"},
-{"csi-sgwp", {NULL}, 348, "udp"},
-{"mftp", {NULL}, 349, "tcp"},
-{"mftp", {NULL}, 349, "udp"},
-{"matip-type-a", {NULL}, 350, "tcp"},
-{"matip-type-a", {NULL}, 350, "udp"},
-{"matip-type-b", {NULL}, 351, "tcp"},
-{"matip-type-b", {NULL}, 351, "udp"},
-{"bhoetty", {NULL}, 351, "tcp"},
-{"bhoetty", {NULL}, 351, "udp"},
-{"dtag-ste-sb", {NULL}, 352, "tcp"},
-{"dtag-ste-sb", {NULL}, 352, "udp"},
-{"bhoedap4", {NULL}, 352, "tcp"},
-{"bhoedap4", {NULL}, 352, "udp"},
-{"ndsauth", {NULL}, 353, "tcp"},
-{"ndsauth", {NULL}, 353, "udp"},
-{"bh611", {NULL}, 354, "tcp"},
-{"bh611", {NULL}, 354, "udp"},
-{"datex-asn", {NULL}, 355, "tcp"},
-{"datex-asn", {NULL}, 355, "udp"},
-{"cloanto-net-1", {NULL}, 356, "tcp"},
-{"cloanto-net-1", {NULL}, 356, "udp"},
-{"bhevent", {NULL}, 357, "tcp"},
-{"bhevent", {NULL}, 357, "udp"},
-{"shrinkwrap", {NULL}, 358, "tcp"},
-{"shrinkwrap", {NULL}, 358, "udp"},
-{"nsrmp", {NULL}, 359, "tcp"},
-{"nsrmp", {NULL}, 359, "udp"},
-{"scoi2odialog", {NULL}, 360, "tcp"},
-{"scoi2odialog", {NULL}, 360, "udp"},
-{"semantix", {NULL}, 361, "tcp"},
-{"semantix", {NULL}, 361, "udp"},
-{"srssend", {NULL}, 362, "tcp"},
-{"srssend", {NULL}, 362, "udp"},
-{"rsvp_tunnel", {NULL}, 363, "tcp"},
-{"rsvp_tunnel", {NULL}, 363, "udp"},
-{"aurora-cmgr", {NULL}, 364, "tcp"},
-{"aurora-cmgr", {NULL}, 364, "udp"},
-{"dtk", {NULL}, 365, "tcp"},
-{"dtk", {NULL}, 365, "udp"},
-{"odmr", {NULL}, 366, "tcp"},
-{"odmr", {NULL}, 366, "udp"},
-{"mortgageware", {NULL}, 367, "tcp"},
-{"mortgageware", {NULL}, 367, "udp"},
-{"qbikgdp", {NULL}, 368, "tcp"},
-{"qbikgdp", {NULL}, 368, "udp"},
-{"rpc2portmap", {NULL}, 369, "tcp"},
-{"rpc2portmap", {NULL}, 369, "udp"},
-{"codaauth2", {NULL}, 370, "tcp"},
-{"codaauth2", {NULL}, 370, "udp"},
-{"clearcase", {NULL}, 371, "tcp"},
-{"clearcase", {NULL}, 371, "udp"},
-{"ulistproc", {NULL}, 372, "tcp"},
-{"ulistproc", {NULL}, 372, "udp"},
-{"legent-1", {NULL}, 373, "tcp"},
-{"legent-1", {NULL}, 373, "udp"},
-{"legent-2", {NULL}, 374, "tcp"},
-{"legent-2", {NULL}, 374, "udp"},
-{"hassle", {NULL}, 375, "tcp"},
-{"hassle", {NULL}, 375, "udp"},
-{"nip", {NULL}, 376, "tcp"},
-{"nip", {NULL}, 376, "udp"},
-{"tnETOS", {NULL}, 377, "tcp"},
-{"tnETOS", {NULL}, 377, "udp"},
-{"dsETOS", {NULL}, 378, "tcp"},
-{"dsETOS", {NULL}, 378, "udp"},
-{"is99c", {NULL}, 379, "tcp"},
-{"is99c", {NULL}, 379, "udp"},
-{"is99s", {NULL}, 380, "tcp"},
-{"is99s", {NULL}, 380, "udp"},
-{"hp-collector", {NULL}, 381, "tcp"},
-{"hp-collector", {NULL}, 381, "udp"},
-{"hp-managed-node", {NULL}, 382, "tcp"},
-{"hp-managed-node", {NULL}, 382, "udp"},
-{"hp-alarm-mgr", {NULL}, 383, "tcp"},
-{"hp-alarm-mgr", {NULL}, 383, "udp"},
-{"arns", {NULL}, 384, "tcp"},
-{"arns", {NULL}, 384, "udp"},
-{"ibm-app", {NULL}, 385, "tcp"},
-{"ibm-app", {NULL}, 385, "udp"},
-{"asa", {NULL}, 386, "tcp"},
-{"asa", {NULL}, 386, "udp"},
-{"aurp", {NULL}, 387, "tcp"},
-{"aurp", {NULL}, 387, "udp"},
-{"unidata-ldm", {NULL}, 388, "tcp"},
-{"unidata-ldm", {NULL}, 388, "udp"},
-{"ldap", {NULL}, 389, "tcp"},
-{"ldap", {NULL}, 389, "udp"},
-{"uis", {NULL}, 390, "tcp"},
-{"uis", {NULL}, 390, "udp"},
-{"synotics-relay", {NULL}, 391, "tcp"},
-{"synotics-relay", {NULL}, 391, "udp"},
-{"synotics-broker", {NULL}, 392, "tcp"},
-{"synotics-broker", {NULL}, 392, "udp"},
-{"meta5", {NULL}, 393, "tcp"},
-{"meta5", {NULL}, 393, "udp"},
-{"embl-ndt", {NULL}, 394, "tcp"},
-{"embl-ndt", {NULL}, 394, "udp"},
-{"netcp", {NULL}, 395, "tcp"},
-{"netcp", {NULL}, 395, "udp"},
-{"netware-ip", {NULL}, 396, "tcp"},
-{"netware-ip", {NULL}, 396, "udp"},
-{"mptn", {NULL}, 397, "tcp"},
-{"mptn", {NULL}, 397, "udp"},
-{"kryptolan", {NULL}, 398, "tcp"},
-{"kryptolan", {NULL}, 398, "udp"},
-{"iso-tsap-c2", {NULL}, 399, "tcp"},
-{"iso-tsap-c2", {NULL}, 399, "udp"},
-{"osb-sd", {NULL}, 400, "tcp"},
-{"osb-sd", {NULL}, 400, "udp"},
-{"ups", {NULL}, 401, "tcp"},
-{"ups", {NULL}, 401, "udp"},
-{"genie", {NULL}, 402, "tcp"},
-{"genie", {NULL}, 402, "udp"},
-{"decap", {NULL}, 403, "tcp"},
-{"decap", {NULL}, 403, "udp"},
-{"nced", {NULL}, 404, "tcp"},
-{"nced", {NULL}, 404, "udp"},
-{"ncld", {NULL}, 405, "tcp"},
-{"ncld", {NULL}, 405, "udp"},
-{"imsp", {NULL}, 406, "tcp"},
-{"imsp", {NULL}, 406, "udp"},
-{"timbuktu", {NULL}, 407, "tcp"},
-{"timbuktu", {NULL}, 407, "udp"},
-{"prm-sm", {NULL}, 408, "tcp"},
-{"prm-sm", {NULL}, 408, "udp"},
-{"prm-nm", {NULL}, 409, "tcp"},
-{"prm-nm", {NULL}, 409, "udp"},
-{"decladebug", {NULL}, 410, "tcp"},
-{"decladebug", {NULL}, 410, "udp"},
-{"rmt", {NULL}, 411, "tcp"},
-{"rmt", {NULL}, 411, "udp"},
-{"synoptics-trap", {NULL}, 412, "tcp"},
-{"synoptics-trap", {NULL}, 412, "udp"},
-{"smsp", {NULL}, 413, "tcp"},
-{"smsp", {NULL}, 413, "udp"},
-{"infoseek", {NULL}, 414, "tcp"},
-{"infoseek", {NULL}, 414, "udp"},
-{"bnet", {NULL}, 415, "tcp"},
-{"bnet", {NULL}, 415, "udp"},
-{"silverplatter", {NULL}, 416, "tcp"},
-{"silverplatter", {NULL}, 416, "udp"},
-{"onmux", {NULL}, 417, "tcp"},
-{"onmux", {NULL}, 417, "udp"},
-{"hyper-g", {NULL}, 418, "tcp"},
-{"hyper-g", {NULL}, 418, "udp"},
-{"ariel1", {NULL}, 419, "tcp"},
-{"ariel1", {NULL}, 419, "udp"},
-{"smpte", {NULL}, 420, "tcp"},
-{"smpte", {NULL}, 420, "udp"},
-{"ariel2", {NULL}, 421, "tcp"},
-{"ariel2", {NULL}, 421, "udp"},
-{"ariel3", {NULL}, 422, "tcp"},
-{"ariel3", {NULL}, 422, "udp"},
-{"opc-job-start", {NULL}, 423, "tcp"},
-{"opc-job-start", {NULL}, 423, "udp"},
-{"opc-job-track", {NULL}, 424, "tcp"},
-{"opc-job-track", {NULL}, 424, "udp"},
-{"icad-el", {NULL}, 425, "tcp"},
-{"icad-el", {NULL}, 425, "udp"},
-{"smartsdp", {NULL}, 426, "tcp"},
-{"smartsdp", {NULL}, 426, "udp"},
-{"svrloc", {NULL}, 427, "tcp"},
-{"svrloc", {NULL}, 427, "udp"},
-{"ocs_cmu", {NULL}, 428, "tcp"},
-{"ocs_cmu", {NULL}, 428, "udp"},
-{"ocs_amu", {NULL}, 429, "tcp"},
-{"ocs_amu", {NULL}, 429, "udp"},
-{"utmpsd", {NULL}, 430, "tcp"},
-{"utmpsd", {NULL}, 430, "udp"},
-{"utmpcd", {NULL}, 431, "tcp"},
-{"utmpcd", {NULL}, 431, "udp"},
-{"iasd", {NULL}, 432, "tcp"},
-{"iasd", {NULL}, 432, "udp"},
-{"nnsp", {NULL}, 433, "tcp"},
-{"nnsp", {NULL}, 433, "udp"},
-{"mobileip-agent", {NULL}, 434, "tcp"},
-{"mobileip-agent", {NULL}, 434, "udp"},
-{"mobilip-mn", {NULL}, 435, "tcp"},
-{"mobilip-mn", {NULL}, 435, "udp"},
-{"dna-cml", {NULL}, 436, "tcp"},
-{"dna-cml", {NULL}, 436, "udp"},
-{"comscm", {NULL}, 437, "tcp"},
-{"comscm", {NULL}, 437, "udp"},
-{"dsfgw", {NULL}, 438, "tcp"},
-{"dsfgw", {NULL}, 438, "udp"},
-{"dasp", {NULL}, 439, "tcp"},
-{"dasp", {NULL}, 439, "udp"},
-{"sgcp", {NULL}, 440, "tcp"},
-{"sgcp", {NULL}, 440, "udp"},
-{"decvms-sysmgt", {NULL}, 441, "tcp"},
-{"decvms-sysmgt", {NULL}, 441, "udp"},
-{"cvc_hostd", {NULL}, 442, "tcp"},
-{"cvc_hostd", {NULL}, 442, "udp"},
-{"https", {NULL}, 443, "tcp"},
-{"https", {NULL}, 443, "udp"},
-{"https", {NULL}, 443, "sctp"},
-{"snpp", {NULL}, 444, "tcp"},
-{"snpp", {NULL}, 444, "udp"},
-{"microsoft-ds", {NULL}, 445, "tcp"},
-{"microsoft-ds", {NULL}, 445, "udp"},
-{"ddm-rdb", {NULL}, 446, "tcp"},
-{"ddm-rdb", {NULL}, 446, "udp"},
-{"ddm-dfm", {NULL}, 447, "tcp"},
-{"ddm-dfm", {NULL}, 447, "udp"},
-{"ddm-ssl", {NULL}, 448, "tcp"},
-{"ddm-ssl", {NULL}, 448, "udp"},
-{"as-servermap", {NULL}, 449, "tcp"},
-{"as-servermap", {NULL}, 449, "udp"},
-{"tserver", {NULL}, 450, "tcp"},
-{"tserver", {NULL}, 450, "udp"},
-{"sfs-smp-net", {NULL}, 451, "tcp"},
-{"sfs-smp-net", {NULL}, 451, "udp"},
-{"sfs-config", {NULL}, 452, "tcp"},
-{"sfs-config", {NULL}, 452, "udp"},
-{"creativeserver", {NULL}, 453, "tcp"},
-{"creativeserver", {NULL}, 453, "udp"},
-{"contentserver", {NULL}, 454, "tcp"},
-{"contentserver", {NULL}, 454, "udp"},
-{"creativepartnr", {NULL}, 455, "tcp"},
-{"creativepartnr", {NULL}, 455, "udp"},
-{"macon-tcp", {NULL}, 456, "tcp"},
-{"macon-udp", {NULL}, 456, "udp"},
-{"scohelp", {NULL}, 457, "tcp"},
-{"scohelp", {NULL}, 457, "udp"},
-{"appleqtc", {NULL}, 458, "tcp"},
-{"appleqtc", {NULL}, 458, "udp"},
-{"ampr-rcmd", {NULL}, 459, "tcp"},
-{"ampr-rcmd", {NULL}, 459, "udp"},
-{"skronk", {NULL}, 460, "tcp"},
-{"skronk", {NULL}, 460, "udp"},
-{"datasurfsrv", {NULL}, 461, "tcp"},
-{"datasurfsrv", {NULL}, 461, "udp"},
-{"datasurfsrvsec", {NULL}, 462, "tcp"},
-{"datasurfsrvsec", {NULL}, 462, "udp"},
-{"alpes", {NULL}, 463, "tcp"},
-{"alpes", {NULL}, 463, "udp"},
-{"kpasswd", {NULL}, 464, "tcp"},
-{"kpasswd", {NULL}, 464, "udp"},
-{"urd", {NULL}, 465, "tcp"},
-{"igmpv3lite", {NULL}, 465, "udp"},
-{"digital-vrc", {NULL}, 466, "tcp"},
-{"digital-vrc", {NULL}, 466, "udp"},
-{"mylex-mapd", {NULL}, 467, "tcp"},
-{"mylex-mapd", {NULL}, 467, "udp"},
-{"photuris", {NULL}, 468, "tcp"},
-{"photuris", {NULL}, 468, "udp"},
-{"rcp", {NULL}, 469, "tcp"},
-{"rcp", {NULL}, 469, "udp"},
-{"scx-proxy", {NULL}, 470, "tcp"},
-{"scx-proxy", {NULL}, 470, "udp"},
-{"mondex", {NULL}, 471, "tcp"},
-{"mondex", {NULL}, 471, "udp"},
-{"ljk-login", {NULL}, 472, "tcp"},
-{"ljk-login", {NULL}, 472, "udp"},
-{"hybrid-pop", {NULL}, 473, "tcp"},
-{"hybrid-pop", {NULL}, 473, "udp"},
-{"tn-tl-w1", {NULL}, 474, "tcp"},
-{"tn-tl-w2", {NULL}, 474, "udp"},
-{"tcpnethaspsrv", {NULL}, 475, "tcp"},
-{"tcpnethaspsrv", {NULL}, 475, "udp"},
-{"tn-tl-fd1", {NULL}, 476, "tcp"},
-{"tn-tl-fd1", {NULL}, 476, "udp"},
-{"ss7ns", {NULL}, 477, "tcp"},
-{"ss7ns", {NULL}, 477, "udp"},
-{"spsc", {NULL}, 478, "tcp"},
-{"spsc", {NULL}, 478, "udp"},
-{"iafserver", {NULL}, 479, "tcp"},
-{"iafserver", {NULL}, 479, "udp"},
-{"iafdbase", {NULL}, 480, "tcp"},
-{"iafdbase", {NULL}, 480, "udp"},
-{"ph", {NULL}, 481, "tcp"},
-{"ph", {NULL}, 481, "udp"},
-{"bgs-nsi", {NULL}, 482, "tcp"},
-{"bgs-nsi", {NULL}, 482, "udp"},
-{"ulpnet", {NULL}, 483, "tcp"},
-{"ulpnet", {NULL}, 483, "udp"},
-{"integra-sme", {NULL}, 484, "tcp"},
-{"integra-sme", {NULL}, 484, "udp"},
-{"powerburst", {NULL}, 485, "tcp"},
-{"powerburst", {NULL}, 485, "udp"},
-{"avian", {NULL}, 486, "tcp"},
-{"avian", {NULL}, 486, "udp"},
-{"saft", {NULL}, 487, "tcp"},
-{"saft", {NULL}, 487, "udp"},
-{"gss-http", {NULL}, 488, "tcp"},
-{"gss-http", {NULL}, 488, "udp"},
-{"nest-protocol", {NULL}, 489, "tcp"},
-{"nest-protocol", {NULL}, 489, "udp"},
-{"micom-pfs", {NULL}, 490, "tcp"},
-{"micom-pfs", {NULL}, 490, "udp"},
-{"go-login", {NULL}, 491, "tcp"},
-{"go-login", {NULL}, 491, "udp"},
-{"ticf-1", {NULL}, 492, "tcp"},
-{"ticf-1", {NULL}, 492, "udp"},
-{"ticf-2", {NULL}, 493, "tcp"},
-{"ticf-2", {NULL}, 493, "udp"},
-{"pov-ray", {NULL}, 494, "tcp"},
-{"pov-ray", {NULL}, 494, "udp"},
-{"intecourier", {NULL}, 495, "tcp"},
-{"intecourier", {NULL}, 495, "udp"},
-{"pim-rp-disc", {NULL}, 496, "tcp"},
-{"pim-rp-disc", {NULL}, 496, "udp"},
-{"dantz", {NULL}, 497, "tcp"},
-{"dantz", {NULL}, 497, "udp"},
-{"siam", {NULL}, 498, "tcp"},
-{"siam", {NULL}, 498, "udp"},
-{"iso-ill", {NULL}, 499, "tcp"},
-{"iso-ill", {NULL}, 499, "udp"},
-{"isakmp", {NULL}, 500, "tcp"},
-{"isakmp", {NULL}, 500, "udp"},
-{"stmf", {NULL}, 501, "tcp"},
-{"stmf", {NULL}, 501, "udp"},
-{"asa-appl-proto", {NULL}, 502, "tcp"},
-{"asa-appl-proto", {NULL}, 502, "udp"},
-{"intrinsa", {NULL}, 503, "tcp"},
-{"intrinsa", {NULL}, 503, "udp"},
-{"citadel", {NULL}, 504, "tcp"},
-{"citadel", {NULL}, 504, "udp"},
-{"mailbox-lm", {NULL}, 505, "tcp"},
-{"mailbox-lm", {NULL}, 505, "udp"},
-{"ohimsrv", {NULL}, 506, "tcp"},
-{"ohimsrv", {NULL}, 506, "udp"},
-{"crs", {NULL}, 507, "tcp"},
-{"crs", {NULL}, 507, "udp"},
-{"xvttp", {NULL}, 508, "tcp"},
-{"xvttp", {NULL}, 508, "udp"},
-{"snare", {NULL}, 509, "tcp"},
-{"snare", {NULL}, 509, "udp"},
-{"fcp", {NULL}, 510, "tcp"},
-{"fcp", {NULL}, 510, "udp"},
-{"passgo", {NULL}, 511, "tcp"},
-{"passgo", {NULL}, 511, "udp"},
-{"exec", {NULL}, 512, "tcp"},
-{"comsat", {NULL}, 512, "udp"},
-{"biff", {NULL}, 512, "udp"},
-{"login", {NULL}, 513, "tcp"},
-{"who", {NULL}, 513, "udp"},
-{"shell", {NULL}, 514, "tcp"},
-{"syslog", {NULL}, 514, "udp"},
-{"printer", {NULL}, 515, "tcp"},
-{"printer", {NULL}, 515, "udp"},
-{"videotex", {NULL}, 516, "tcp"},
-{"videotex", {NULL}, 516, "udp"},
-{"talk", {NULL}, 517, "tcp"},
-{"talk", {NULL}, 517, "udp"},
-{"ntalk", {NULL}, 518, "tcp"},
-{"ntalk", {NULL}, 518, "udp"},
-{"utime", {NULL}, 519, "tcp"},
-{"utime", {NULL}, 519, "udp"},
-{"efs", {NULL}, 520, "tcp"},
-{"router", {NULL}, 520, "udp"},
-{"ripng", {NULL}, 521, "tcp"},
-{"ripng", {NULL}, 521, "udp"},
-{"ulp", {NULL}, 522, "tcp"},
-{"ulp", {NULL}, 522, "udp"},
-{"ibm-db2", {NULL}, 523, "tcp"},
-{"ibm-db2", {NULL}, 523, "udp"},
-{"ncp", {NULL}, 524, "tcp"},
-{"ncp", {NULL}, 524, "udp"},
-{"timed", {NULL}, 525, "tcp"},
-{"timed", {NULL}, 525, "udp"},
-{"tempo", {NULL}, 526, "tcp"},
-{"tempo", {NULL}, 526, "udp"},
-{"stx", {NULL}, 527, "tcp"},
-{"stx", {NULL}, 527, "udp"},
-{"custix", {NULL}, 528, "tcp"},
-{"custix", {NULL}, 528, "udp"},
-{"irc-serv", {NULL}, 529, "tcp"},
-{"irc-serv", {NULL}, 529, "udp"},
-{"courier", {NULL}, 530, "tcp"},
-{"courier", {NULL}, 530, "udp"},
-{"conference", {NULL}, 531, "tcp"},
-{"conference", {NULL}, 531, "udp"},
-{"netnews", {NULL}, 532, "tcp"},
-{"netnews", {NULL}, 532, "udp"},
-{"netwall", {NULL}, 533, "tcp"},
-{"netwall", {NULL}, 533, "udp"},
-{"windream", {NULL}, 534, "tcp"},
-{"windream", {NULL}, 534, "udp"},
-{"iiop", {NULL}, 535, "tcp"},
-{"iiop", {NULL}, 535, "udp"},
-{"opalis-rdv", {NULL}, 536, "tcp"},
-{"opalis-rdv", {NULL}, 536, "udp"},
-{"nmsp", {NULL}, 537, "tcp"},
-{"nmsp", {NULL}, 537, "udp"},
-{"gdomap", {NULL}, 538, "tcp"},
-{"gdomap", {NULL}, 538, "udp"},
-{"apertus-ldp", {NULL}, 539, "tcp"},
-{"apertus-ldp", {NULL}, 539, "udp"},
-{"uucp", {NULL}, 540, "tcp"},
-{"uucp", {NULL}, 540, "udp"},
-{"uucp-rlogin", {NULL}, 541, "tcp"},
-{"uucp-rlogin", {NULL}, 541, "udp"},
-{"commerce", {NULL}, 542, "tcp"},
-{"commerce", {NULL}, 542, "udp"},
-{"klogin", {NULL}, 543, "tcp"},
-{"klogin", {NULL}, 543, "udp"},
-{"kshell", {NULL}, 544, "tcp"},
-{"kshell", {NULL}, 544, "udp"},
-{"appleqtcsrvr", {NULL}, 545, "tcp"},
-{"appleqtcsrvr", {NULL}, 545, "udp"},
-{"dhcpv6-client", {NULL}, 546, "tcp"},
-{"dhcpv6-client", {NULL}, 546, "udp"},
-{"dhcpv6-server", {NULL}, 547, "tcp"},
-{"dhcpv6-server", {NULL}, 547, "udp"},
-{"afpovertcp", {NULL}, 548, "tcp"},
-{"afpovertcp", {NULL}, 548, "udp"},
-{"idfp", {NULL}, 549, "tcp"},
-{"idfp", {NULL}, 549, "udp"},
-{"new-rwho", {NULL}, 550, "tcp"},
-{"new-rwho", {NULL}, 550, "udp"},
-{"cybercash", {NULL}, 551, "tcp"},
-{"cybercash", {NULL}, 551, "udp"},
-{"devshr-nts", {NULL}, 552, "tcp"},
-{"devshr-nts", {NULL}, 552, "udp"},
-{"pirp", {NULL}, 553, "tcp"},
-{"pirp", {NULL}, 553, "udp"},
-{"rtsp", {NULL}, 554, "tcp"},
-{"rtsp", {NULL}, 554, "udp"},
-{"dsf", {NULL}, 555, "tcp"},
-{"dsf", {NULL}, 555, "udp"},
-{"remotefs", {NULL}, 556, "tcp"},
-{"remotefs", {NULL}, 556, "udp"},
-{"openvms-sysipc", {NULL}, 557, "tcp"},
-{"openvms-sysipc", {NULL}, 557, "udp"},
-{"sdnskmp", {NULL}, 558, "tcp"},
-{"sdnskmp", {NULL}, 558, "udp"},
-{"teedtap", {NULL}, 559, "tcp"},
-{"teedtap", {NULL}, 559, "udp"},
-{"rmonitor", {NULL}, 560, "tcp"},
-{"rmonitor", {NULL}, 560, "udp"},
-{"monitor", {NULL}, 561, "tcp"},
-{"monitor", {NULL}, 561, "udp"},
-{"chshell", {NULL}, 562, "tcp"},
-{"chshell", {NULL}, 562, "udp"},
-{"nntps", {NULL}, 563, "tcp"},
-{"nntps", {NULL}, 563, "udp"},
-{"9pfs", {NULL}, 564, "tcp"},
-{"9pfs", {NULL}, 564, "udp"},
-{"whoami", {NULL}, 565, "tcp"},
-{"whoami", {NULL}, 565, "udp"},
-{"streettalk", {NULL}, 566, "tcp"},
-{"streettalk", {NULL}, 566, "udp"},
-{"banyan-rpc", {NULL}, 567, "tcp"},
-{"banyan-rpc", {NULL}, 567, "udp"},
-{"ms-shuttle", {NULL}, 568, "tcp"},
-{"ms-shuttle", {NULL}, 568, "udp"},
-{"ms-rome", {NULL}, 569, "tcp"},
-{"ms-rome", {NULL}, 569, "udp"},
-{"meter", {NULL}, 570, "tcp"},
-{"meter", {NULL}, 570, "udp"},
-{"meter", {NULL}, 571, "tcp"},
-{"meter", {NULL}, 571, "udp"},
-{"sonar", {NULL}, 572, "tcp"},
-{"sonar", {NULL}, 572, "udp"},
-{"banyan-vip", {NULL}, 573, "tcp"},
-{"banyan-vip", {NULL}, 573, "udp"},
-{"ftp-agent", {NULL}, 574, "tcp"},
-{"ftp-agent", {NULL}, 574, "udp"},
-{"vemmi", {NULL}, 575, "tcp"},
-{"vemmi", {NULL}, 575, "udp"},
-{"ipcd", {NULL}, 576, "tcp"},
-{"ipcd", {NULL}, 576, "udp"},
-{"vnas", {NULL}, 577, "tcp"},
-{"vnas", {NULL}, 577, "udp"},
-{"ipdd", {NULL}, 578, "tcp"},
-{"ipdd", {NULL}, 578, "udp"},
-{"decbsrv", {NULL}, 579, "tcp"},
-{"decbsrv", {NULL}, 579, "udp"},
-{"sntp-heartbeat", {NULL}, 580, "tcp"},
-{"sntp-heartbeat", {NULL}, 580, "udp"},
-{"bdp", {NULL}, 581, "tcp"},
-{"bdp", {NULL}, 581, "udp"},
-{"scc-security", {NULL}, 582, "tcp"},
-{"scc-security", {NULL}, 582, "udp"},
-{"philips-vc", {NULL}, 583, "tcp"},
-{"philips-vc", {NULL}, 583, "udp"},
-{"keyserver", {NULL}, 584, "tcp"},
-{"keyserver", {NULL}, 584, "udp"},
-{"password-chg", {NULL}, 586, "tcp"},
-{"password-chg", {NULL}, 586, "udp"},
-{"submission", {NULL}, 587, "tcp"},
-{"submission", {NULL}, 587, "udp"},
-{"cal", {NULL}, 588, "tcp"},
-{"cal", {NULL}, 588, "udp"},
-{"eyelink", {NULL}, 589, "tcp"},
-{"eyelink", {NULL}, 589, "udp"},
-{"tns-cml", {NULL}, 590, "tcp"},
-{"tns-cml", {NULL}, 590, "udp"},
-{"http-alt", {NULL}, 591, "tcp"},
-{"http-alt", {NULL}, 591, "udp"},
-{"eudora-set", {NULL}, 592, "tcp"},
-{"eudora-set", {NULL}, 592, "udp"},
-{"http-rpc-epmap", {NULL}, 593, "tcp"},
-{"http-rpc-epmap", {NULL}, 593, "udp"},
-{"tpip", {NULL}, 594, "tcp"},
-{"tpip", {NULL}, 594, "udp"},
-{"cab-protocol", {NULL}, 595, "tcp"},
-{"cab-protocol", {NULL}, 595, "udp"},
-{"smsd", {NULL}, 596, "tcp"},
-{"smsd", {NULL}, 596, "udp"},
-{"ptcnameservice", {NULL}, 597, "tcp"},
-{"ptcnameservice", {NULL}, 597, "udp"},
-{"sco-websrvrmg3", {NULL}, 598, "tcp"},
-{"sco-websrvrmg3", {NULL}, 598, "udp"},
-{"acp", {NULL}, 599, "tcp"},
-{"acp", {NULL}, 599, "udp"},
-{"ipcserver", {NULL}, 600, "tcp"},
-{"ipcserver", {NULL}, 600, "udp"},
-{"syslog-conn", {NULL}, 601, "tcp"},
-{"syslog-conn", {NULL}, 601, "udp"},
-{"xmlrpc-beep", {NULL}, 602, "tcp"},
-{"xmlrpc-beep", {NULL}, 602, "udp"},
-{"idxp", {NULL}, 603, "tcp"},
-{"idxp", {NULL}, 603, "udp"},
-{"tunnel", {NULL}, 604, "tcp"},
-{"tunnel", {NULL}, 604, "udp"},
-{"soap-beep", {NULL}, 605, "tcp"},
-{"soap-beep", {NULL}, 605, "udp"},
-{"urm", {NULL}, 606, "tcp"},
-{"urm", {NULL}, 606, "udp"},
-{"nqs", {NULL}, 607, "tcp"},
-{"nqs", {NULL}, 607, "udp"},
-{"sift-uft", {NULL}, 608, "tcp"},
-{"sift-uft", {NULL}, 608, "udp"},
-{"npmp-trap", {NULL}, 609, "tcp"},
-{"npmp-trap", {NULL}, 609, "udp"},
-{"npmp-local", {NULL}, 610, "tcp"},
-{"npmp-local", {NULL}, 610, "udp"},
-{"npmp-gui", {NULL}, 611, "tcp"},
-{"npmp-gui", {NULL}, 611, "udp"},
-{"hmmp-ind", {NULL}, 612, "tcp"},
-{"hmmp-ind", {NULL}, 612, "udp"},
-{"hmmp-op", {NULL}, 613, "tcp"},
-{"hmmp-op", {NULL}, 613, "udp"},
-{"sshell", {NULL}, 614, "tcp"},
-{"sshell", {NULL}, 614, "udp"},
-{"sco-inetmgr", {NULL}, 615, "tcp"},
-{"sco-inetmgr", {NULL}, 615, "udp"},
-{"sco-sysmgr", {NULL}, 616, "tcp"},
-{"sco-sysmgr", {NULL}, 616, "udp"},
-{"sco-dtmgr", {NULL}, 617, "tcp"},
-{"sco-dtmgr", {NULL}, 617, "udp"},
-{"dei-icda", {NULL}, 618, "tcp"},
-{"dei-icda", {NULL}, 618, "udp"},
-{"compaq-evm", {NULL}, 619, "tcp"},
-{"compaq-evm", {NULL}, 619, "udp"},
-{"sco-websrvrmgr", {NULL}, 620, "tcp"},
-{"sco-websrvrmgr", {NULL}, 620, "udp"},
-{"escp-ip", {NULL}, 621, "tcp"},
-{"escp-ip", {NULL}, 621, "udp"},
-{"collaborator", {NULL}, 622, "tcp"},
-{"collaborator", {NULL}, 622, "udp"},
-{"oob-ws-http", {NULL}, 623, "tcp"},
-{"asf-rmcp", {NULL}, 623, "udp"},
-{"cryptoadmin", {NULL}, 624, "tcp"},
-{"cryptoadmin", {NULL}, 624, "udp"},
-{"dec_dlm", {NULL}, 625, "tcp"},
-{"dec_dlm", {NULL}, 625, "udp"},
-{"asia", {NULL}, 626, "tcp"},
-{"asia", {NULL}, 626, "udp"},
-{"passgo-tivoli", {NULL}, 627, "tcp"},
-{"passgo-tivoli", {NULL}, 627, "udp"},
-{"qmqp", {NULL}, 628, "tcp"},
-{"qmqp", {NULL}, 628, "udp"},
-{"3com-amp3", {NULL}, 629, "tcp"},
-{"3com-amp3", {NULL}, 629, "udp"},
-{"rda", {NULL}, 630, "tcp"},
-{"rda", {NULL}, 630, "udp"},
-{"ipp", {NULL}, 631, "tcp"},
-{"ipp", {NULL}, 631, "udp"},
-{"bmpp", {NULL}, 632, "tcp"},
-{"bmpp", {NULL}, 632, "udp"},
-{"servstat", {NULL}, 633, "tcp"},
-{"servstat", {NULL}, 633, "udp"},
-{"ginad", {NULL}, 634, "tcp"},
-{"ginad", {NULL}, 634, "udp"},
-{"rlzdbase", {NULL}, 635, "tcp"},
-{"rlzdbase", {NULL}, 635, "udp"},
-{"ldaps", {NULL}, 636, "tcp"},
-{"ldaps", {NULL}, 636, "udp"},
-{"lanserver", {NULL}, 637, "tcp"},
-{"lanserver", {NULL}, 637, "udp"},
-{"mcns-sec", {NULL}, 638, "tcp"},
-{"mcns-sec", {NULL}, 638, "udp"},
-{"msdp", {NULL}, 639, "tcp"},
-{"msdp", {NULL}, 639, "udp"},
-{"entrust-sps", {NULL}, 640, "tcp"},
-{"entrust-sps", {NULL}, 640, "udp"},
-{"repcmd", {NULL}, 641, "tcp"},
-{"repcmd", {NULL}, 641, "udp"},
-{"esro-emsdp", {NULL}, 642, "tcp"},
-{"esro-emsdp", {NULL}, 642, "udp"},
-{"sanity", {NULL}, 643, "tcp"},
-{"sanity", {NULL}, 643, "udp"},
-{"dwr", {NULL}, 644, "tcp"},
-{"dwr", {NULL}, 644, "udp"},
-{"pssc", {NULL}, 645, "tcp"},
-{"pssc", {NULL}, 645, "udp"},
-{"ldp", {NULL}, 646, "tcp"},
-{"ldp", {NULL}, 646, "udp"},
-{"dhcp-failover", {NULL}, 647, "tcp"},
-{"dhcp-failover", {NULL}, 647, "udp"},
-{"rrp", {NULL}, 648, "tcp"},
-{"rrp", {NULL}, 648, "udp"},
-{"cadview-3d", {NULL}, 649, "tcp"},
-{"cadview-3d", {NULL}, 649, "udp"},
-{"obex", {NULL}, 650, "tcp"},
-{"obex", {NULL}, 650, "udp"},
-{"ieee-mms", {NULL}, 651, "tcp"},
-{"ieee-mms", {NULL}, 651, "udp"},
-{"hello-port", {NULL}, 652, "tcp"},
-{"hello-port", {NULL}, 652, "udp"},
-{"repscmd", {NULL}, 653, "tcp"},
-{"repscmd", {NULL}, 653, "udp"},
-{"aodv", {NULL}, 654, "tcp"},
-{"aodv", {NULL}, 654, "udp"},
-{"tinc", {NULL}, 655, "tcp"},
-{"tinc", {NULL}, 655, "udp"},
-{"spmp", {NULL}, 656, "tcp"},
-{"spmp", {NULL}, 656, "udp"},
-{"rmc", {NULL}, 657, "tcp"},
-{"rmc", {NULL}, 657, "udp"},
-{"tenfold", {NULL}, 658, "tcp"},
-{"tenfold", {NULL}, 658, "udp"},
-{"mac-srvr-admin", {NULL}, 660, "tcp"},
-{"mac-srvr-admin", {NULL}, 660, "udp"},
-{"hap", {NULL}, 661, "tcp"},
-{"hap", {NULL}, 661, "udp"},
-{"pftp", {NULL}, 662, "tcp"},
-{"pftp", {NULL}, 662, "udp"},
-{"purenoise", {NULL}, 663, "tcp"},
-{"purenoise", {NULL}, 663, "udp"},
-{"oob-ws-https", {NULL}, 664, "tcp"},
-{"asf-secure-rmcp", {NULL}, 664, "udp"},
-{"sun-dr", {NULL}, 665, "tcp"},
-{"sun-dr", {NULL}, 665, "udp"},
-{"mdqs", {NULL}, 666, "tcp"},
-{"mdqs", {NULL}, 666, "udp"},
-{"doom", {NULL}, 666, "tcp"},
-{"doom", {NULL}, 666, "udp"},
-{"disclose", {NULL}, 667, "tcp"},
-{"disclose", {NULL}, 667, "udp"},
-{"mecomm", {NULL}, 668, "tcp"},
-{"mecomm", {NULL}, 668, "udp"},
-{"meregister", {NULL}, 669, "tcp"},
-{"meregister", {NULL}, 669, "udp"},
-{"vacdsm-sws", {NULL}, 670, "tcp"},
-{"vacdsm-sws", {NULL}, 670, "udp"},
-{"vacdsm-app", {NULL}, 671, "tcp"},
-{"vacdsm-app", {NULL}, 671, "udp"},
-{"vpps-qua", {NULL}, 672, "tcp"},
-{"vpps-qua", {NULL}, 672, "udp"},
-{"cimplex", {NULL}, 673, "tcp"},
-{"cimplex", {NULL}, 673, "udp"},
-{"acap", {NULL}, 674, "tcp"},
-{"acap", {NULL}, 674, "udp"},
-{"dctp", {NULL}, 675, "tcp"},
-{"dctp", {NULL}, 675, "udp"},
-{"vpps-via", {NULL}, 676, "tcp"},
-{"vpps-via", {NULL}, 676, "udp"},
-{"vpp", {NULL}, 677, "tcp"},
-{"vpp", {NULL}, 677, "udp"},
-{"ggf-ncp", {NULL}, 678, "tcp"},
-{"ggf-ncp", {NULL}, 678, "udp"},
-{"mrm", {NULL}, 679, "tcp"},
-{"mrm", {NULL}, 679, "udp"},
-{"entrust-aaas", {NULL}, 680, "tcp"},
-{"entrust-aaas", {NULL}, 680, "udp"},
-{"entrust-aams", {NULL}, 681, "tcp"},
-{"entrust-aams", {NULL}, 681, "udp"},
-{"xfr", {NULL}, 682, "tcp"},
-{"xfr", {NULL}, 682, "udp"},
-{"corba-iiop", {NULL}, 683, "tcp"},
-{"corba-iiop", {NULL}, 683, "udp"},
-{"corba-iiop-ssl", {NULL}, 684, "tcp"},
-{"corba-iiop-ssl", {NULL}, 684, "udp"},
-{"mdc-portmapper", {NULL}, 685, "tcp"},
-{"mdc-portmapper", {NULL}, 685, "udp"},
-{"hcp-wismar", {NULL}, 686, "tcp"},
-{"hcp-wismar", {NULL}, 686, "udp"},
-{"asipregistry", {NULL}, 687, "tcp"},
-{"asipregistry", {NULL}, 687, "udp"},
-{"realm-rusd", {NULL}, 688, "tcp"},
-{"realm-rusd", {NULL}, 688, "udp"},
-{"nmap", {NULL}, 689, "tcp"},
-{"nmap", {NULL}, 689, "udp"},
-{"vatp", {NULL}, 690, "tcp"},
-{"vatp", {NULL}, 690, "udp"},
-{"msexch-routing", {NULL}, 691, "tcp"},
-{"msexch-routing", {NULL}, 691, "udp"},
-{"hyperwave-isp", {NULL}, 692, "tcp"},
-{"hyperwave-isp", {NULL}, 692, "udp"},
-{"connendp", {NULL}, 693, "tcp"},
-{"connendp", {NULL}, 693, "udp"},
-{"ha-cluster", {NULL}, 694, "tcp"},
-{"ha-cluster", {NULL}, 694, "udp"},
-{"ieee-mms-ssl", {NULL}, 695, "tcp"},
-{"ieee-mms-ssl", {NULL}, 695, "udp"},
-{"rushd", {NULL}, 696, "tcp"},
-{"rushd", {NULL}, 696, "udp"},
-{"uuidgen", {NULL}, 697, "tcp"},
-{"uuidgen", {NULL}, 697, "udp"},
-{"olsr", {NULL}, 698, "tcp"},
-{"olsr", {NULL}, 698, "udp"},
-{"accessnetwork", {NULL}, 699, "tcp"},
-{"accessnetwork", {NULL}, 699, "udp"},
-{"epp", {NULL}, 700, "tcp"},
-{"epp", {NULL}, 700, "udp"},
-{"lmp", {NULL}, 701, "tcp"},
-{"lmp", {NULL}, 701, "udp"},
-{"iris-beep", {NULL}, 702, "tcp"},
-{"iris-beep", {NULL}, 702, "udp"},
-{"elcsd", {NULL}, 704, "tcp"},
-{"elcsd", {NULL}, 704, "udp"},
-{"agentx", {NULL}, 705, "tcp"},
-{"agentx", {NULL}, 705, "udp"},
-{"silc", {NULL}, 706, "tcp"},
-{"silc", {NULL}, 706, "udp"},
-{"borland-dsj", {NULL}, 707, "tcp"},
-{"borland-dsj", {NULL}, 707, "udp"},
-{"entrust-kmsh", {NULL}, 709, "tcp"},
-{"entrust-kmsh", {NULL}, 709, "udp"},
-{"entrust-ash", {NULL}, 710, "tcp"},
-{"entrust-ash", {NULL}, 710, "udp"},
-{"cisco-tdp", {NULL}, 711, "tcp"},
-{"cisco-tdp", {NULL}, 711, "udp"},
-{"tbrpf", {NULL}, 712, "tcp"},
-{"tbrpf", {NULL}, 712, "udp"},
-{"iris-xpc", {NULL}, 713, "tcp"},
-{"iris-xpc", {NULL}, 713, "udp"},
-{"iris-xpcs", {NULL}, 714, "tcp"},
-{"iris-xpcs", {NULL}, 714, "udp"},
-{"iris-lwz", {NULL}, 715, "tcp"},
-{"iris-lwz", {NULL}, 715, "udp"},
-{"pana", {NULL}, 716, "udp"},
-{"netviewdm1", {NULL}, 729, "tcp"},
-{"netviewdm1", {NULL}, 729, "udp"},
-{"netviewdm2", {NULL}, 730, "tcp"},
-{"netviewdm2", {NULL}, 730, "udp"},
-{"netviewdm3", {NULL}, 731, "tcp"},
-{"netviewdm3", {NULL}, 731, "udp"},
-{"netgw", {NULL}, 741, "tcp"},
-{"netgw", {NULL}, 741, "udp"},
-{"netrcs", {NULL}, 742, "tcp"},
-{"netrcs", {NULL}, 742, "udp"},
-{"flexlm", {NULL}, 744, "tcp"},
-{"flexlm", {NULL}, 744, "udp"},
-{"fujitsu-dev", {NULL}, 747, "tcp"},
-{"fujitsu-dev", {NULL}, 747, "udp"},
-{"ris-cm", {NULL}, 748, "tcp"},
-{"ris-cm", {NULL}, 748, "udp"},
-{"kerberos-adm", {NULL}, 749, "tcp"},
-{"kerberos-adm", {NULL}, 749, "udp"},
-{"rfile", {NULL}, 750, "tcp"},
-{"loadav", {NULL}, 750, "udp"},
-{"kerberos-iv", {NULL}, 750, "udp"},
-{"pump", {NULL}, 751, "tcp"},
-{"pump", {NULL}, 751, "udp"},
-{"qrh", {NULL}, 752, "tcp"},
-{"qrh", {NULL}, 752, "udp"},
-{"rrh", {NULL}, 753, "tcp"},
-{"rrh", {NULL}, 753, "udp"},
-{"tell", {NULL}, 754, "tcp"},
-{"tell", {NULL}, 754, "udp"},
-{"nlogin", {NULL}, 758, "tcp"},
-{"nlogin", {NULL}, 758, "udp"},
-{"con", {NULL}, 759, "tcp"},
-{"con", {NULL}, 759, "udp"},
-{"ns", {NULL}, 760, "tcp"},
-{"ns", {NULL}, 760, "udp"},
-{"rxe", {NULL}, 761, "tcp"},
-{"rxe", {NULL}, 761, "udp"},
-{"quotad", {NULL}, 762, "tcp"},
-{"quotad", {NULL}, 762, "udp"},
-{"cycleserv", {NULL}, 763, "tcp"},
-{"cycleserv", {NULL}, 763, "udp"},
-{"omserv", {NULL}, 764, "tcp"},
-{"omserv", {NULL}, 764, "udp"},
-{"webster", {NULL}, 765, "tcp"},
-{"webster", {NULL}, 765, "udp"},
-{"phonebook", {NULL}, 767, "tcp"},
-{"phonebook", {NULL}, 767, "udp"},
-{"vid", {NULL}, 769, "tcp"},
-{"vid", {NULL}, 769, "udp"},
-{"cadlock", {NULL}, 770, "tcp"},
-{"cadlock", {NULL}, 770, "udp"},
-{"rtip", {NULL}, 771, "tcp"},
-{"rtip", {NULL}, 771, "udp"},
-{"cycleserv2", {NULL}, 772, "tcp"},
-{"cycleserv2", {NULL}, 772, "udp"},
-{"submit", {NULL}, 773, "tcp"},
-{"notify", {NULL}, 773, "udp"},
-{"rpasswd", {NULL}, 774, "tcp"},
-{"acmaint_dbd", {NULL}, 774, "udp"},
-{"entomb", {NULL}, 775, "tcp"},
-{"acmaint_transd", {NULL}, 775, "udp"},
-{"wpages", {NULL}, 776, "tcp"},
-{"wpages", {NULL}, 776, "udp"},
-{"multiling-http", {NULL}, 777, "tcp"},
-{"multiling-http", {NULL}, 777, "udp"},
-{"wpgs", {NULL}, 780, "tcp"},
-{"wpgs", {NULL}, 780, "udp"},
-{"mdbs_daemon", {NULL}, 800, "tcp"},
-{"mdbs_daemon", {NULL}, 800, "udp"},
-{"device", {NULL}, 801, "tcp"},
-{"device", {NULL}, 801, "udp"},
-{"fcp-udp", {NULL}, 810, "tcp"},
-{"fcp-udp", {NULL}, 810, "udp"},
-{"itm-mcell-s", {NULL}, 828, "tcp"},
-{"itm-mcell-s", {NULL}, 828, "udp"},
-{"pkix-3-ca-ra", {NULL}, 829, "tcp"},
-{"pkix-3-ca-ra", {NULL}, 829, "udp"},
-{"netconf-ssh", {NULL}, 830, "tcp"},
-{"netconf-ssh", {NULL}, 830, "udp"},
-{"netconf-beep", {NULL}, 831, "tcp"},
-{"netconf-beep", {NULL}, 831, "udp"},
-{"netconfsoaphttp", {NULL}, 832, "tcp"},
-{"netconfsoaphttp", {NULL}, 832, "udp"},
-{"netconfsoapbeep", {NULL}, 833, "tcp"},
-{"netconfsoapbeep", {NULL}, 833, "udp"},
-{"dhcp-failover2", {NULL}, 847, "tcp"},
-{"dhcp-failover2", {NULL}, 847, "udp"},
-{"gdoi", {NULL}, 848, "tcp"},
-{"gdoi", {NULL}, 848, "udp"},
-{"iscsi", {NULL}, 860, "tcp"},
-{"iscsi", {NULL}, 860, "udp"},
-{"owamp-control", {NULL}, 861, "tcp"},
-{"owamp-control", {NULL}, 861, "udp"},
-{"twamp-control", {NULL}, 862, "tcp"},
-{"twamp-control", {NULL}, 862, "udp"},
-{"rsync", {NULL}, 873, "tcp"},
-{"rsync", {NULL}, 873, "udp"},
-{"iclcnet-locate", {NULL}, 886, "tcp"},
-{"iclcnet-locate", {NULL}, 886, "udp"},
-{"iclcnet_svinfo", {NULL}, 887, "tcp"},
-{"iclcnet_svinfo", {NULL}, 887, "udp"},
-{"accessbuilder", {NULL}, 888, "tcp"},
-{"accessbuilder", {NULL}, 888, "udp"},
-{"cddbp", {NULL}, 888, "tcp"},
-{"omginitialrefs", {NULL}, 900, "tcp"},
-{"omginitialrefs", {NULL}, 900, "udp"},
-{"smpnameres", {NULL}, 901, "tcp"},
-{"smpnameres", {NULL}, 901, "udp"},
-{"ideafarm-door", {NULL}, 902, "tcp"},
-{"ideafarm-door", {NULL}, 902, "udp"},
-{"ideafarm-panic", {NULL}, 903, "tcp"},
-{"ideafarm-panic", {NULL}, 903, "udp"},
-{"kink", {NULL}, 910, "tcp"},
-{"kink", {NULL}, 910, "udp"},
-{"xact-backup", {NULL}, 911, "tcp"},
-{"xact-backup", {NULL}, 911, "udp"},
-{"apex-mesh", {NULL}, 912, "tcp"},
-{"apex-mesh", {NULL}, 912, "udp"},
-{"apex-edge", {NULL}, 913, "tcp"},
-{"apex-edge", {NULL}, 913, "udp"},
-{"ftps-data", {NULL}, 989, "tcp"},
-{"ftps-data", {NULL}, 989, "udp"},
-{"ftps", {NULL}, 990, "tcp"},
-{"ftps", {NULL}, 990, "udp"},
-{"nas", {NULL}, 991, "tcp"},
-{"nas", {NULL}, 991, "udp"},
-{"telnets", {NULL}, 992, "tcp"},
-{"telnets", {NULL}, 992, "udp"},
-{"imaps", {NULL}, 993, "tcp"},
-{"imaps", {NULL}, 993, "udp"},
-{"ircs", {NULL}, 994, "tcp"},
-{"ircs", {NULL}, 994, "udp"},
-{"pop3s", {NULL}, 995, "tcp"},
-{"pop3s", {NULL}, 995, "udp"},
-{"vsinet", {NULL}, 996, "tcp"},
-{"vsinet", {NULL}, 996, "udp"},
-{"maitrd", {NULL}, 997, "tcp"},
-{"maitrd", {NULL}, 997, "udp"},
-{"busboy", {NULL}, 998, "tcp"},
-{"puparp", {NULL}, 998, "udp"},
-{"garcon", {NULL}, 999, "tcp"},
-{"applix", {NULL}, 999, "udp"},
-{"puprouter", {NULL}, 999, "tcp"},
-{"puprouter", {NULL}, 999, "udp"},
-{"cadlock2", {NULL}, 1000, "tcp"},
-{"cadlock2", {NULL}, 1000, "udp"},
-{"surf", {NULL}, 1010, "tcp"},
-{"surf", {NULL}, 1010, "udp"},
-{"exp1", {NULL}, 1021, "tcp"},
-{"exp1", {NULL}, 1021, "udp"},
-{"exp2", {NULL}, 1022, "tcp"},
-{"exp2", {NULL}, 1022, "udp"},
-#endif /* USE_IANA_WELL_KNOWN_PORTS */
-#ifdef USE_IANA_REGISTERED_PORTS
-{"blackjack", {NULL}, 1025, "tcp"},
-{"blackjack", {NULL}, 1025, "udp"},
-{"cap", {NULL}, 1026, "tcp"},
-{"cap", {NULL}, 1026, "udp"},
-{"solid-mux", {NULL}, 1029, "tcp"},
-{"solid-mux", {NULL}, 1029, "udp"},
-{"iad1", {NULL}, 1030, "tcp"},
-{"iad1", {NULL}, 1030, "udp"},
-{"iad2", {NULL}, 1031, "tcp"},
-{"iad2", {NULL}, 1031, "udp"},
-{"iad3", {NULL}, 1032, "tcp"},
-{"iad3", {NULL}, 1032, "udp"},
-{"netinfo-local", {NULL}, 1033, "tcp"},
-{"netinfo-local", {NULL}, 1033, "udp"},
-{"activesync", {NULL}, 1034, "tcp"},
-{"activesync", {NULL}, 1034, "udp"},
-{"mxxrlogin", {NULL}, 1035, "tcp"},
-{"mxxrlogin", {NULL}, 1035, "udp"},
-{"nsstp", {NULL}, 1036, "tcp"},
-{"nsstp", {NULL}, 1036, "udp"},
-{"ams", {NULL}, 1037, "tcp"},
-{"ams", {NULL}, 1037, "udp"},
-{"mtqp", {NULL}, 1038, "tcp"},
-{"mtqp", {NULL}, 1038, "udp"},
-{"sbl", {NULL}, 1039, "tcp"},
-{"sbl", {NULL}, 1039, "udp"},
-{"netarx", {NULL}, 1040, "tcp"},
-{"netarx", {NULL}, 1040, "udp"},
-{"danf-ak2", {NULL}, 1041, "tcp"},
-{"danf-ak2", {NULL}, 1041, "udp"},
-{"afrog", {NULL}, 1042, "tcp"},
-{"afrog", {NULL}, 1042, "udp"},
-{"boinc-client", {NULL}, 1043, "tcp"},
-{"boinc-client", {NULL}, 1043, "udp"},
-{"dcutility", {NULL}, 1044, "tcp"},
-{"dcutility", {NULL}, 1044, "udp"},
-{"fpitp", {NULL}, 1045, "tcp"},
-{"fpitp", {NULL}, 1045, "udp"},
-{"wfremotertm", {NULL}, 1046, "tcp"},
-{"wfremotertm", {NULL}, 1046, "udp"},
-{"neod1", {NULL}, 1047, "tcp"},
-{"neod1", {NULL}, 1047, "udp"},
-{"neod2", {NULL}, 1048, "tcp"},
-{"neod2", {NULL}, 1048, "udp"},
-{"td-postman", {NULL}, 1049, "tcp"},
-{"td-postman", {NULL}, 1049, "udp"},
-{"cma", {NULL}, 1050, "tcp"},
-{"cma", {NULL}, 1050, "udp"},
-{"optima-vnet", {NULL}, 1051, "tcp"},
-{"optima-vnet", {NULL}, 1051, "udp"},
-{"ddt", {NULL}, 1052, "tcp"},
-{"ddt", {NULL}, 1052, "udp"},
-{"remote-as", {NULL}, 1053, "tcp"},
-{"remote-as", {NULL}, 1053, "udp"},
-{"brvread", {NULL}, 1054, "tcp"},
-{"brvread", {NULL}, 1054, "udp"},
-{"ansyslmd", {NULL}, 1055, "tcp"},
-{"ansyslmd", {NULL}, 1055, "udp"},
-{"vfo", {NULL}, 1056, "tcp"},
-{"vfo", {NULL}, 1056, "udp"},
-{"startron", {NULL}, 1057, "tcp"},
-{"startron", {NULL}, 1057, "udp"},
-{"nim", {NULL}, 1058, "tcp"},
-{"nim", {NULL}, 1058, "udp"},
-{"nimreg", {NULL}, 1059, "tcp"},
-{"nimreg", {NULL}, 1059, "udp"},
-{"polestar", {NULL}, 1060, "tcp"},
-{"polestar", {NULL}, 1060, "udp"},
-{"kiosk", {NULL}, 1061, "tcp"},
-{"kiosk", {NULL}, 1061, "udp"},
-{"veracity", {NULL}, 1062, "tcp"},
-{"veracity", {NULL}, 1062, "udp"},
-{"kyoceranetdev", {NULL}, 1063, "tcp"},
-{"kyoceranetdev", {NULL}, 1063, "udp"},
-{"jstel", {NULL}, 1064, "tcp"},
-{"jstel", {NULL}, 1064, "udp"},
-{"syscomlan", {NULL}, 1065, "tcp"},
-{"syscomlan", {NULL}, 1065, "udp"},
-{"fpo-fns", {NULL}, 1066, "tcp"},
-{"fpo-fns", {NULL}, 1066, "udp"},
-{"instl_boots", {NULL}, 1067, "tcp"},
-{"instl_boots", {NULL}, 1067, "udp"},
-{"instl_bootc", {NULL}, 1068, "tcp"},
-{"instl_bootc", {NULL}, 1068, "udp"},
-{"cognex-insight", {NULL}, 1069, "tcp"},
-{"cognex-insight", {NULL}, 1069, "udp"},
-{"gmrupdateserv", {NULL}, 1070, "tcp"},
-{"gmrupdateserv", {NULL}, 1070, "udp"},
-{"bsquare-voip", {NULL}, 1071, "tcp"},
-{"bsquare-voip", {NULL}, 1071, "udp"},
-{"cardax", {NULL}, 1072, "tcp"},
-{"cardax", {NULL}, 1072, "udp"},
-{"bridgecontrol", {NULL}, 1073, "tcp"},
-{"bridgecontrol", {NULL}, 1073, "udp"},
-{"warmspotMgmt", {NULL}, 1074, "tcp"},
-{"warmspotMgmt", {NULL}, 1074, "udp"},
-{"rdrmshc", {NULL}, 1075, "tcp"},
-{"rdrmshc", {NULL}, 1075, "udp"},
-{"dab-sti-c", {NULL}, 1076, "tcp"},
-{"dab-sti-c", {NULL}, 1076, "udp"},
-{"imgames", {NULL}, 1077, "tcp"},
-{"imgames", {NULL}, 1077, "udp"},
-{"avocent-proxy", {NULL}, 1078, "tcp"},
-{"avocent-proxy", {NULL}, 1078, "udp"},
-{"asprovatalk", {NULL}, 1079, "tcp"},
-{"asprovatalk", {NULL}, 1079, "udp"},
-{"socks", {NULL}, 1080, "tcp"},
-{"socks", {NULL}, 1080, "udp"},
-{"pvuniwien", {NULL}, 1081, "tcp"},
-{"pvuniwien", {NULL}, 1081, "udp"},
-{"amt-esd-prot", {NULL}, 1082, "tcp"},
-{"amt-esd-prot", {NULL}, 1082, "udp"},
-{"ansoft-lm-1", {NULL}, 1083, "tcp"},
-{"ansoft-lm-1", {NULL}, 1083, "udp"},
-{"ansoft-lm-2", {NULL}, 1084, "tcp"},
-{"ansoft-lm-2", {NULL}, 1084, "udp"},
-{"webobjects", {NULL}, 1085, "tcp"},
-{"webobjects", {NULL}, 1085, "udp"},
-{"cplscrambler-lg", {NULL}, 1086, "tcp"},
-{"cplscrambler-lg", {NULL}, 1086, "udp"},
-{"cplscrambler-in", {NULL}, 1087, "tcp"},
-{"cplscrambler-in", {NULL}, 1087, "udp"},
-{"cplscrambler-al", {NULL}, 1088, "tcp"},
-{"cplscrambler-al", {NULL}, 1088, "udp"},
-{"ff-annunc", {NULL}, 1089, "tcp"},
-{"ff-annunc", {NULL}, 1089, "udp"},
-{"ff-fms", {NULL}, 1090, "tcp"},
-{"ff-fms", {NULL}, 1090, "udp"},
-{"ff-sm", {NULL}, 1091, "tcp"},
-{"ff-sm", {NULL}, 1091, "udp"},
-{"obrpd", {NULL}, 1092, "tcp"},
-{"obrpd", {NULL}, 1092, "udp"},
-{"proofd", {NULL}, 1093, "tcp"},
-{"proofd", {NULL}, 1093, "udp"},
-{"rootd", {NULL}, 1094, "tcp"},
-{"rootd", {NULL}, 1094, "udp"},
-{"nicelink", {NULL}, 1095, "tcp"},
-{"nicelink", {NULL}, 1095, "udp"},
-{"cnrprotocol", {NULL}, 1096, "tcp"},
-{"cnrprotocol", {NULL}, 1096, "udp"},
-{"sunclustermgr", {NULL}, 1097, "tcp"},
-{"sunclustermgr", {NULL}, 1097, "udp"},
-{"rmiactivation", {NULL}, 1098, "tcp"},
-{"rmiactivation", {NULL}, 1098, "udp"},
-{"rmiregistry", {NULL}, 1099, "tcp"},
-{"rmiregistry", {NULL}, 1099, "udp"},
-{"mctp", {NULL}, 1100, "tcp"},
-{"mctp", {NULL}, 1100, "udp"},
-{"pt2-discover", {NULL}, 1101, "tcp"},
-{"pt2-discover", {NULL}, 1101, "udp"},
-{"adobeserver-1", {NULL}, 1102, "tcp"},
-{"adobeserver-1", {NULL}, 1102, "udp"},
-{"adobeserver-2", {NULL}, 1103, "tcp"},
-{"adobeserver-2", {NULL}, 1103, "udp"},
-{"xrl", {NULL}, 1104, "tcp"},
-{"xrl", {NULL}, 1104, "udp"},
-{"ftranhc", {NULL}, 1105, "tcp"},
-{"ftranhc", {NULL}, 1105, "udp"},
-{"isoipsigport-1", {NULL}, 1106, "tcp"},
-{"isoipsigport-1", {NULL}, 1106, "udp"},
-{"isoipsigport-2", {NULL}, 1107, "tcp"},
-{"isoipsigport-2", {NULL}, 1107, "udp"},
-{"ratio-adp", {NULL}, 1108, "tcp"},
-{"ratio-adp", {NULL}, 1108, "udp"},
-{"webadmstart", {NULL}, 1110, "tcp"},
-{"nfsd-keepalive", {NULL}, 1110, "udp"},
-{"lmsocialserver", {NULL}, 1111, "tcp"},
-{"lmsocialserver", {NULL}, 1111, "udp"},
-{"icp", {NULL}, 1112, "tcp"},
-{"icp", {NULL}, 1112, "udp"},
-{"ltp-deepspace", {NULL}, 1113, "tcp"},
-{"ltp-deepspace", {NULL}, 1113, "udp"},
-{"mini-sql", {NULL}, 1114, "tcp"},
-{"mini-sql", {NULL}, 1114, "udp"},
-{"ardus-trns", {NULL}, 1115, "tcp"},
-{"ardus-trns", {NULL}, 1115, "udp"},
-{"ardus-cntl", {NULL}, 1116, "tcp"},
-{"ardus-cntl", {NULL}, 1116, "udp"},
-{"ardus-mtrns", {NULL}, 1117, "tcp"},
-{"ardus-mtrns", {NULL}, 1117, "udp"},
-{"sacred", {NULL}, 1118, "tcp"},
-{"sacred", {NULL}, 1118, "udp"},
-{"bnetgame", {NULL}, 1119, "tcp"},
-{"bnetgame", {NULL}, 1119, "udp"},
-{"bnetfile", {NULL}, 1120, "tcp"},
-{"bnetfile", {NULL}, 1120, "udp"},
-{"rmpp", {NULL}, 1121, "tcp"},
-{"rmpp", {NULL}, 1121, "udp"},
-{"availant-mgr", {NULL}, 1122, "tcp"},
-{"availant-mgr", {NULL}, 1122, "udp"},
-{"murray", {NULL}, 1123, "tcp"},
-{"murray", {NULL}, 1123, "udp"},
-{"hpvmmcontrol", {NULL}, 1124, "tcp"},
-{"hpvmmcontrol", {NULL}, 1124, "udp"},
-{"hpvmmagent", {NULL}, 1125, "tcp"},
-{"hpvmmagent", {NULL}, 1125, "udp"},
-{"hpvmmdata", {NULL}, 1126, "tcp"},
-{"hpvmmdata", {NULL}, 1126, "udp"},
-{"kwdb-commn", {NULL}, 1127, "tcp"},
-{"kwdb-commn", {NULL}, 1127, "udp"},
-{"saphostctrl", {NULL}, 1128, "tcp"},
-{"saphostctrl", {NULL}, 1128, "udp"},
-{"saphostctrls", {NULL}, 1129, "tcp"},
-{"saphostctrls", {NULL}, 1129, "udp"},
-{"casp", {NULL}, 1130, "tcp"},
-{"casp", {NULL}, 1130, "udp"},
-{"caspssl", {NULL}, 1131, "tcp"},
-{"caspssl", {NULL}, 1131, "udp"},
-{"kvm-via-ip", {NULL}, 1132, "tcp"},
-{"kvm-via-ip", {NULL}, 1132, "udp"},
-{"dfn", {NULL}, 1133, "tcp"},
-{"dfn", {NULL}, 1133, "udp"},
-{"aplx", {NULL}, 1134, "tcp"},
-{"aplx", {NULL}, 1134, "udp"},
-{"omnivision", {NULL}, 1135, "tcp"},
-{"omnivision", {NULL}, 1135, "udp"},
-{"hhb-gateway", {NULL}, 1136, "tcp"},
-{"hhb-gateway", {NULL}, 1136, "udp"},
-{"trim", {NULL}, 1137, "tcp"},
-{"trim", {NULL}, 1137, "udp"},
-{"encrypted_admin", {NULL}, 1138, "tcp"},
-{"encrypted_admin", {NULL}, 1138, "udp"},
-{"evm", {NULL}, 1139, "tcp"},
-{"evm", {NULL}, 1139, "udp"},
-{"autonoc", {NULL}, 1140, "tcp"},
-{"autonoc", {NULL}, 1140, "udp"},
-{"mxomss", {NULL}, 1141, "tcp"},
-{"mxomss", {NULL}, 1141, "udp"},
-{"edtools", {NULL}, 1142, "tcp"},
-{"edtools", {NULL}, 1142, "udp"},
-{"imyx", {NULL}, 1143, "tcp"},
-{"imyx", {NULL}, 1143, "udp"},
-{"fuscript", {NULL}, 1144, "tcp"},
-{"fuscript", {NULL}, 1144, "udp"},
-{"x9-icue", {NULL}, 1145, "tcp"},
-{"x9-icue", {NULL}, 1145, "udp"},
-{"audit-transfer", {NULL}, 1146, "tcp"},
-{"audit-transfer", {NULL}, 1146, "udp"},
-{"capioverlan", {NULL}, 1147, "tcp"},
-{"capioverlan", {NULL}, 1147, "udp"},
-{"elfiq-repl", {NULL}, 1148, "tcp"},
-{"elfiq-repl", {NULL}, 1148, "udp"},
-{"bvtsonar", {NULL}, 1149, "tcp"},
-{"bvtsonar", {NULL}, 1149, "udp"},
-{"blaze", {NULL}, 1150, "tcp"},
-{"blaze", {NULL}, 1150, "udp"},
-{"unizensus", {NULL}, 1151, "tcp"},
-{"unizensus", {NULL}, 1151, "udp"},
-{"winpoplanmess", {NULL}, 1152, "tcp"},
-{"winpoplanmess", {NULL}, 1152, "udp"},
-{"c1222-acse", {NULL}, 1153, "tcp"},
-{"c1222-acse", {NULL}, 1153, "udp"},
-{"resacommunity", {NULL}, 1154, "tcp"},
-{"resacommunity", {NULL}, 1154, "udp"},
-{"nfa", {NULL}, 1155, "tcp"},
-{"nfa", {NULL}, 1155, "udp"},
-{"iascontrol-oms", {NULL}, 1156, "tcp"},
-{"iascontrol-oms", {NULL}, 1156, "udp"},
-{"iascontrol", {NULL}, 1157, "tcp"},
-{"iascontrol", {NULL}, 1157, "udp"},
-{"dbcontrol-oms", {NULL}, 1158, "tcp"},
-{"dbcontrol-oms", {NULL}, 1158, "udp"},
-{"oracle-oms", {NULL}, 1159, "tcp"},
-{"oracle-oms", {NULL}, 1159, "udp"},
-{"olsv", {NULL}, 1160, "tcp"},
-{"olsv", {NULL}, 1160, "udp"},
-{"health-polling", {NULL}, 1161, "tcp"},
-{"health-polling", {NULL}, 1161, "udp"},
-{"health-trap", {NULL}, 1162, "tcp"},
-{"health-trap", {NULL}, 1162, "udp"},
-{"sddp", {NULL}, 1163, "tcp"},
-{"sddp", {NULL}, 1163, "udp"},
-{"qsm-proxy", {NULL}, 1164, "tcp"},
-{"qsm-proxy", {NULL}, 1164, "udp"},
-{"qsm-gui", {NULL}, 1165, "tcp"},
-{"qsm-gui", {NULL}, 1165, "udp"},
-{"qsm-remote", {NULL}, 1166, "tcp"},
-{"qsm-remote", {NULL}, 1166, "udp"},
-{"cisco-ipsla", {NULL}, 1167, "tcp"},
-{"cisco-ipsla", {NULL}, 1167, "udp"},
-{"cisco-ipsla", {NULL}, 1167, "sctp"},
-{"vchat", {NULL}, 1168, "tcp"},
-{"vchat", {NULL}, 1168, "udp"},
-{"tripwire", {NULL}, 1169, "tcp"},
-{"tripwire", {NULL}, 1169, "udp"},
-{"atc-lm", {NULL}, 1170, "tcp"},
-{"atc-lm", {NULL}, 1170, "udp"},
-{"atc-appserver", {NULL}, 1171, "tcp"},
-{"atc-appserver", {NULL}, 1171, "udp"},
-{"dnap", {NULL}, 1172, "tcp"},
-{"dnap", {NULL}, 1172, "udp"},
-{"d-cinema-rrp", {NULL}, 1173, "tcp"},
-{"d-cinema-rrp", {NULL}, 1173, "udp"},
-{"fnet-remote-ui", {NULL}, 1174, "tcp"},
-{"fnet-remote-ui", {NULL}, 1174, "udp"},
-{"dossier", {NULL}, 1175, "tcp"},
-{"dossier", {NULL}, 1175, "udp"},
-{"indigo-server", {NULL}, 1176, "tcp"},
-{"indigo-server", {NULL}, 1176, "udp"},
-{"dkmessenger", {NULL}, 1177, "tcp"},
-{"dkmessenger", {NULL}, 1177, "udp"},
-{"sgi-storman", {NULL}, 1178, "tcp"},
-{"sgi-storman", {NULL}, 1178, "udp"},
-{"b2n", {NULL}, 1179, "tcp"},
-{"b2n", {NULL}, 1179, "udp"},
-{"mc-client", {NULL}, 1180, "tcp"},
-{"mc-client", {NULL}, 1180, "udp"},
-{"3comnetman", {NULL}, 1181, "tcp"},
-{"3comnetman", {NULL}, 1181, "udp"},
-{"accelenet", {NULL}, 1182, "tcp"},
-{"accelenet-data", {NULL}, 1182, "udp"},
-{"llsurfup-http", {NULL}, 1183, "tcp"},
-{"llsurfup-http", {NULL}, 1183, "udp"},
-{"llsurfup-https", {NULL}, 1184, "tcp"},
-{"llsurfup-https", {NULL}, 1184, "udp"},
-{"catchpole", {NULL}, 1185, "tcp"},
-{"catchpole", {NULL}, 1185, "udp"},
-{"mysql-cluster", {NULL}, 1186, "tcp"},
-{"mysql-cluster", {NULL}, 1186, "udp"},
-{"alias", {NULL}, 1187, "tcp"},
-{"alias", {NULL}, 1187, "udp"},
-{"hp-webadmin", {NULL}, 1188, "tcp"},
-{"hp-webadmin", {NULL}, 1188, "udp"},
-{"unet", {NULL}, 1189, "tcp"},
-{"unet", {NULL}, 1189, "udp"},
-{"commlinx-avl", {NULL}, 1190, "tcp"},
-{"commlinx-avl", {NULL}, 1190, "udp"},
-{"gpfs", {NULL}, 1191, "tcp"},
-{"gpfs", {NULL}, 1191, "udp"},
-{"caids-sensor", {NULL}, 1192, "tcp"},
-{"caids-sensor", {NULL}, 1192, "udp"},
-{"fiveacross", {NULL}, 1193, "tcp"},
-{"fiveacross", {NULL}, 1193, "udp"},
-{"openvpn", {NULL}, 1194, "tcp"},
-{"openvpn", {NULL}, 1194, "udp"},
-{"rsf-1", {NULL}, 1195, "tcp"},
-{"rsf-1", {NULL}, 1195, "udp"},
-{"netmagic", {NULL}, 1196, "tcp"},
-{"netmagic", {NULL}, 1196, "udp"},
-{"carrius-rshell", {NULL}, 1197, "tcp"},
-{"carrius-rshell", {NULL}, 1197, "udp"},
-{"cajo-discovery", {NULL}, 1198, "tcp"},
-{"cajo-discovery", {NULL}, 1198, "udp"},
-{"dmidi", {NULL}, 1199, "tcp"},
-{"dmidi", {NULL}, 1199, "udp"},
-{"scol", {NULL}, 1200, "tcp"},
-{"scol", {NULL}, 1200, "udp"},
-{"nucleus-sand", {NULL}, 1201, "tcp"},
-{"nucleus-sand", {NULL}, 1201, "udp"},
-{"caiccipc", {NULL}, 1202, "tcp"},
-{"caiccipc", {NULL}, 1202, "udp"},
-{"ssslic-mgr", {NULL}, 1203, "tcp"},
-{"ssslic-mgr", {NULL}, 1203, "udp"},
-{"ssslog-mgr", {NULL}, 1204, "tcp"},
-{"ssslog-mgr", {NULL}, 1204, "udp"},
-{"accord-mgc", {NULL}, 1205, "tcp"},
-{"accord-mgc", {NULL}, 1205, "udp"},
-{"anthony-data", {NULL}, 1206, "tcp"},
-{"anthony-data", {NULL}, 1206, "udp"},
-{"metasage", {NULL}, 1207, "tcp"},
-{"metasage", {NULL}, 1207, "udp"},
-{"seagull-ais", {NULL}, 1208, "tcp"},
-{"seagull-ais", {NULL}, 1208, "udp"},
-{"ipcd3", {NULL}, 1209, "tcp"},
-{"ipcd3", {NULL}, 1209, "udp"},
-{"eoss", {NULL}, 1210, "tcp"},
-{"eoss", {NULL}, 1210, "udp"},
-{"groove-dpp", {NULL}, 1211, "tcp"},
-{"groove-dpp", {NULL}, 1211, "udp"},
-{"lupa", {NULL}, 1212, "tcp"},
-{"lupa", {NULL}, 1212, "udp"},
-{"mpc-lifenet", {NULL}, 1213, "tcp"},
-{"mpc-lifenet", {NULL}, 1213, "udp"},
-{"kazaa", {NULL}, 1214, "tcp"},
-{"kazaa", {NULL}, 1214, "udp"},
-{"scanstat-1", {NULL}, 1215, "tcp"},
-{"scanstat-1", {NULL}, 1215, "udp"},
-{"etebac5", {NULL}, 1216, "tcp"},
-{"etebac5", {NULL}, 1216, "udp"},
-{"hpss-ndapi", {NULL}, 1217, "tcp"},
-{"hpss-ndapi", {NULL}, 1217, "udp"},
-{"aeroflight-ads", {NULL}, 1218, "tcp"},
-{"aeroflight-ads", {NULL}, 1218, "udp"},
-{"aeroflight-ret", {NULL}, 1219, "tcp"},
-{"aeroflight-ret", {NULL}, 1219, "udp"},
-{"qt-serveradmin", {NULL}, 1220, "tcp"},
-{"qt-serveradmin", {NULL}, 1220, "udp"},
-{"sweetware-apps", {NULL}, 1221, "tcp"},
-{"sweetware-apps", {NULL}, 1221, "udp"},
-{"nerv", {NULL}, 1222, "tcp"},
-{"nerv", {NULL}, 1222, "udp"},
-{"tgp", {NULL}, 1223, "tcp"},
-{"tgp", {NULL}, 1223, "udp"},
-{"vpnz", {NULL}, 1224, "tcp"},
-{"vpnz", {NULL}, 1224, "udp"},
-{"slinkysearch", {NULL}, 1225, "tcp"},
-{"slinkysearch", {NULL}, 1225, "udp"},
-{"stgxfws", {NULL}, 1226, "tcp"},
-{"stgxfws", {NULL}, 1226, "udp"},
-{"dns2go", {NULL}, 1227, "tcp"},
-{"dns2go", {NULL}, 1227, "udp"},
-{"florence", {NULL}, 1228, "tcp"},
-{"florence", {NULL}, 1228, "udp"},
-{"zented", {NULL}, 1229, "tcp"},
-{"zented", {NULL}, 1229, "udp"},
-{"periscope", {NULL}, 1230, "tcp"},
-{"periscope", {NULL}, 1230, "udp"},
-{"menandmice-lpm", {NULL}, 1231, "tcp"},
-{"menandmice-lpm", {NULL}, 1231, "udp"},
-{"univ-appserver", {NULL}, 1233, "tcp"},
-{"univ-appserver", {NULL}, 1233, "udp"},
-{"search-agent", {NULL}, 1234, "tcp"},
-{"search-agent", {NULL}, 1234, "udp"},
-{"mosaicsyssvc1", {NULL}, 1235, "tcp"},
-{"mosaicsyssvc1", {NULL}, 1235, "udp"},
-{"bvcontrol", {NULL}, 1236, "tcp"},
-{"bvcontrol", {NULL}, 1236, "udp"},
-{"tsdos390", {NULL}, 1237, "tcp"},
-{"tsdos390", {NULL}, 1237, "udp"},
-{"hacl-qs", {NULL}, 1238, "tcp"},
-{"hacl-qs", {NULL}, 1238, "udp"},
-{"nmsd", {NULL}, 1239, "tcp"},
-{"nmsd", {NULL}, 1239, "udp"},
-{"instantia", {NULL}, 1240, "tcp"},
-{"instantia", {NULL}, 1240, "udp"},
-{"nessus", {NULL}, 1241, "tcp"},
-{"nessus", {NULL}, 1241, "udp"},
-{"nmasoverip", {NULL}, 1242, "tcp"},
-{"nmasoverip", {NULL}, 1242, "udp"},
-{"serialgateway", {NULL}, 1243, "tcp"},
-{"serialgateway", {NULL}, 1243, "udp"},
-{"isbconference1", {NULL}, 1244, "tcp"},
-{"isbconference1", {NULL}, 1244, "udp"},
-{"isbconference2", {NULL}, 1245, "tcp"},
-{"isbconference2", {NULL}, 1245, "udp"},
-{"payrouter", {NULL}, 1246, "tcp"},
-{"payrouter", {NULL}, 1246, "udp"},
-{"visionpyramid", {NULL}, 1247, "tcp"},
-{"visionpyramid", {NULL}, 1247, "udp"},
-{"hermes", {NULL}, 1248, "tcp"},
-{"hermes", {NULL}, 1248, "udp"},
-{"mesavistaco", {NULL}, 1249, "tcp"},
-{"mesavistaco", {NULL}, 1249, "udp"},
-{"swldy-sias", {NULL}, 1250, "tcp"},
-{"swldy-sias", {NULL}, 1250, "udp"},
-{"servergraph", {NULL}, 1251, "tcp"},
-{"servergraph", {NULL}, 1251, "udp"},
-{"bspne-pcc", {NULL}, 1252, "tcp"},
-{"bspne-pcc", {NULL}, 1252, "udp"},
-{"q55-pcc", {NULL}, 1253, "tcp"},
-{"q55-pcc", {NULL}, 1253, "udp"},
-{"de-noc", {NULL}, 1254, "tcp"},
-{"de-noc", {NULL}, 1254, "udp"},
-{"de-cache-query", {NULL}, 1255, "tcp"},
-{"de-cache-query", {NULL}, 1255, "udp"},
-{"de-server", {NULL}, 1256, "tcp"},
-{"de-server", {NULL}, 1256, "udp"},
-{"shockwave2", {NULL}, 1257, "tcp"},
-{"shockwave2", {NULL}, 1257, "udp"},
-{"opennl", {NULL}, 1258, "tcp"},
-{"opennl", {NULL}, 1258, "udp"},
-{"opennl-voice", {NULL}, 1259, "tcp"},
-{"opennl-voice", {NULL}, 1259, "udp"},
-{"ibm-ssd", {NULL}, 1260, "tcp"},
-{"ibm-ssd", {NULL}, 1260, "udp"},
-{"mpshrsv", {NULL}, 1261, "tcp"},
-{"mpshrsv", {NULL}, 1261, "udp"},
-{"qnts-orb", {NULL}, 1262, "tcp"},
-{"qnts-orb", {NULL}, 1262, "udp"},
-{"dka", {NULL}, 1263, "tcp"},
-{"dka", {NULL}, 1263, "udp"},
-{"prat", {NULL}, 1264, "tcp"},
-{"prat", {NULL}, 1264, "udp"},
-{"dssiapi", {NULL}, 1265, "tcp"},
-{"dssiapi", {NULL}, 1265, "udp"},
-{"dellpwrappks", {NULL}, 1266, "tcp"},
-{"dellpwrappks", {NULL}, 1266, "udp"},
-{"epc", {NULL}, 1267, "tcp"},
-{"epc", {NULL}, 1267, "udp"},
-{"propel-msgsys", {NULL}, 1268, "tcp"},
-{"propel-msgsys", {NULL}, 1268, "udp"},
-{"watilapp", {NULL}, 1269, "tcp"},
-{"watilapp", {NULL}, 1269, "udp"},
-{"opsmgr", {NULL}, 1270, "tcp"},
-{"opsmgr", {NULL}, 1270, "udp"},
-{"excw", {NULL}, 1271, "tcp"},
-{"excw", {NULL}, 1271, "udp"},
-{"cspmlockmgr", {NULL}, 1272, "tcp"},
-{"cspmlockmgr", {NULL}, 1272, "udp"},
-{"emc-gateway", {NULL}, 1273, "tcp"},
-{"emc-gateway", {NULL}, 1273, "udp"},
-{"t1distproc", {NULL}, 1274, "tcp"},
-{"t1distproc", {NULL}, 1274, "udp"},
-{"ivcollector", {NULL}, 1275, "tcp"},
-{"ivcollector", {NULL}, 1275, "udp"},
-{"ivmanager", {NULL}, 1276, "tcp"},
-{"ivmanager", {NULL}, 1276, "udp"},
-{"miva-mqs", {NULL}, 1277, "tcp"},
-{"miva-mqs", {NULL}, 1277, "udp"},
-{"dellwebadmin-1", {NULL}, 1278, "tcp"},
-{"dellwebadmin-1", {NULL}, 1278, "udp"},
-{"dellwebadmin-2", {NULL}, 1279, "tcp"},
-{"dellwebadmin-2", {NULL}, 1279, "udp"},
-{"pictrography", {NULL}, 1280, "tcp"},
-{"pictrography", {NULL}, 1280, "udp"},
-{"healthd", {NULL}, 1281, "tcp"},
-{"healthd", {NULL}, 1281, "udp"},
-{"emperion", {NULL}, 1282, "tcp"},
-{"emperion", {NULL}, 1282, "udp"},
-{"productinfo", {NULL}, 1283, "tcp"},
-{"productinfo", {NULL}, 1283, "udp"},
-{"iee-qfx", {NULL}, 1284, "tcp"},
-{"iee-qfx", {NULL}, 1284, "udp"},
-{"neoiface", {NULL}, 1285, "tcp"},
-{"neoiface", {NULL}, 1285, "udp"},
-{"netuitive", {NULL}, 1286, "tcp"},
-{"netuitive", {NULL}, 1286, "udp"},
-{"routematch", {NULL}, 1287, "tcp"},
-{"routematch", {NULL}, 1287, "udp"},
-{"navbuddy", {NULL}, 1288, "tcp"},
-{"navbuddy", {NULL}, 1288, "udp"},
-{"jwalkserver", {NULL}, 1289, "tcp"},
-{"jwalkserver", {NULL}, 1289, "udp"},
-{"winjaserver", {NULL}, 1290, "tcp"},
-{"winjaserver", {NULL}, 1290, "udp"},
-{"seagulllms", {NULL}, 1291, "tcp"},
-{"seagulllms", {NULL}, 1291, "udp"},
-{"dsdn", {NULL}, 1292, "tcp"},
-{"dsdn", {NULL}, 1292, "udp"},
-{"pkt-krb-ipsec", {NULL}, 1293, "tcp"},
-{"pkt-krb-ipsec", {NULL}, 1293, "udp"},
-{"cmmdriver", {NULL}, 1294, "tcp"},
-{"cmmdriver", {NULL}, 1294, "udp"},
-{"ehtp", {NULL}, 1295, "tcp"},
-{"ehtp", {NULL}, 1295, "udp"},
-{"dproxy", {NULL}, 1296, "tcp"},
-{"dproxy", {NULL}, 1296, "udp"},
-{"sdproxy", {NULL}, 1297, "tcp"},
-{"sdproxy", {NULL}, 1297, "udp"},
-{"lpcp", {NULL}, 1298, "tcp"},
-{"lpcp", {NULL}, 1298, "udp"},
-{"hp-sci", {NULL}, 1299, "tcp"},
-{"hp-sci", {NULL}, 1299, "udp"},
-{"h323hostcallsc", {NULL}, 1300, "tcp"},
-{"h323hostcallsc", {NULL}, 1300, "udp"},
-{"ci3-software-1", {NULL}, 1301, "tcp"},
-{"ci3-software-1", {NULL}, 1301, "udp"},
-{"ci3-software-2", {NULL}, 1302, "tcp"},
-{"ci3-software-2", {NULL}, 1302, "udp"},
-{"sftsrv", {NULL}, 1303, "tcp"},
-{"sftsrv", {NULL}, 1303, "udp"},
-{"boomerang", {NULL}, 1304, "tcp"},
-{"boomerang", {NULL}, 1304, "udp"},
-{"pe-mike", {NULL}, 1305, "tcp"},
-{"pe-mike", {NULL}, 1305, "udp"},
-{"re-conn-proto", {NULL}, 1306, "tcp"},
-{"re-conn-proto", {NULL}, 1306, "udp"},
-{"pacmand", {NULL}, 1307, "tcp"},
-{"pacmand", {NULL}, 1307, "udp"},
-{"odsi", {NULL}, 1308, "tcp"},
-{"odsi", {NULL}, 1308, "udp"},
-{"jtag-server", {NULL}, 1309, "tcp"},
-{"jtag-server", {NULL}, 1309, "udp"},
-{"husky", {NULL}, 1310, "tcp"},
-{"husky", {NULL}, 1310, "udp"},
-{"rxmon", {NULL}, 1311, "tcp"},
-{"rxmon", {NULL}, 1311, "udp"},
-{"sti-envision", {NULL}, 1312, "tcp"},
-{"sti-envision", {NULL}, 1312, "udp"},
-{"bmc_patroldb", {NULL}, 1313, "tcp"},
-{"bmc_patroldb", {NULL}, 1313, "udp"},
-{"pdps", {NULL}, 1314, "tcp"},
-{"pdps", {NULL}, 1314, "udp"},
-{"els", {NULL}, 1315, "tcp"},
-{"els", {NULL}, 1315, "udp"},
-{"exbit-escp", {NULL}, 1316, "tcp"},
-{"exbit-escp", {NULL}, 1316, "udp"},
-{"vrts-ipcserver", {NULL}, 1317, "tcp"},
-{"vrts-ipcserver", {NULL}, 1317, "udp"},
-{"krb5gatekeeper", {NULL}, 1318, "tcp"},
-{"krb5gatekeeper", {NULL}, 1318, "udp"},
-{"amx-icsp", {NULL}, 1319, "tcp"},
-{"amx-icsp", {NULL}, 1319, "udp"},
-{"amx-axbnet", {NULL}, 1320, "tcp"},
-{"amx-axbnet", {NULL}, 1320, "udp"},
-{"pip", {NULL}, 1321, "tcp"},
-{"pip", {NULL}, 1321, "udp"},
-{"novation", {NULL}, 1322, "tcp"},
-{"novation", {NULL}, 1322, "udp"},
-{"brcd", {NULL}, 1323, "tcp"},
-{"brcd", {NULL}, 1323, "udp"},
-{"delta-mcp", {NULL}, 1324, "tcp"},
-{"delta-mcp", {NULL}, 1324, "udp"},
-{"dx-instrument", {NULL}, 1325, "tcp"},
-{"dx-instrument", {NULL}, 1325, "udp"},
-{"wimsic", {NULL}, 1326, "tcp"},
-{"wimsic", {NULL}, 1326, "udp"},
-{"ultrex", {NULL}, 1327, "tcp"},
-{"ultrex", {NULL}, 1327, "udp"},
-{"ewall", {NULL}, 1328, "tcp"},
-{"ewall", {NULL}, 1328, "udp"},
-{"netdb-export", {NULL}, 1329, "tcp"},
-{"netdb-export", {NULL}, 1329, "udp"},
-{"streetperfect", {NULL}, 1330, "tcp"},
-{"streetperfect", {NULL}, 1330, "udp"},
-{"intersan", {NULL}, 1331, "tcp"},
-{"intersan", {NULL}, 1331, "udp"},
-{"pcia-rxp-b", {NULL}, 1332, "tcp"},
-{"pcia-rxp-b", {NULL}, 1332, "udp"},
-{"passwrd-policy", {NULL}, 1333, "tcp"},
-{"passwrd-policy", {NULL}, 1333, "udp"},
-{"writesrv", {NULL}, 1334, "tcp"},
-{"writesrv", {NULL}, 1334, "udp"},
-{"digital-notary", {NULL}, 1335, "tcp"},
-{"digital-notary", {NULL}, 1335, "udp"},
-{"ischat", {NULL}, 1336, "tcp"},
-{"ischat", {NULL}, 1336, "udp"},
-{"menandmice-dns", {NULL}, 1337, "tcp"},
-{"menandmice-dns", {NULL}, 1337, "udp"},
-{"wmc-log-svc", {NULL}, 1338, "tcp"},
-{"wmc-log-svc", {NULL}, 1338, "udp"},
-{"kjtsiteserver", {NULL}, 1339, "tcp"},
-{"kjtsiteserver", {NULL}, 1339, "udp"},
-{"naap", {NULL}, 1340, "tcp"},
-{"naap", {NULL}, 1340, "udp"},
-{"qubes", {NULL}, 1341, "tcp"},
-{"qubes", {NULL}, 1341, "udp"},
-{"esbroker", {NULL}, 1342, "tcp"},
-{"esbroker", {NULL}, 1342, "udp"},
-{"re101", {NULL}, 1343, "tcp"},
-{"re101", {NULL}, 1343, "udp"},
-{"icap", {NULL}, 1344, "tcp"},
-{"icap", {NULL}, 1344, "udp"},
-{"vpjp", {NULL}, 1345, "tcp"},
-{"vpjp", {NULL}, 1345, "udp"},
-{"alta-ana-lm", {NULL}, 1346, "tcp"},
-{"alta-ana-lm", {NULL}, 1346, "udp"},
-{"bbn-mmc", {NULL}, 1347, "tcp"},
-{"bbn-mmc", {NULL}, 1347, "udp"},
-{"bbn-mmx", {NULL}, 1348, "tcp"},
-{"bbn-mmx", {NULL}, 1348, "udp"},
-{"sbook", {NULL}, 1349, "tcp"},
-{"sbook", {NULL}, 1349, "udp"},
-{"editbench", {NULL}, 1350, "tcp"},
-{"editbench", {NULL}, 1350, "udp"},
-{"equationbuilder", {NULL}, 1351, "tcp"},
-{"equationbuilder", {NULL}, 1351, "udp"},
-{"lotusnote", {NULL}, 1352, "tcp"},
-{"lotusnote", {NULL}, 1352, "udp"},
-{"relief", {NULL}, 1353, "tcp"},
-{"relief", {NULL}, 1353, "udp"},
-{"XSIP-network", {NULL}, 1354, "tcp"},
-{"XSIP-network", {NULL}, 1354, "udp"},
-{"intuitive-edge", {NULL}, 1355, "tcp"},
-{"intuitive-edge", {NULL}, 1355, "udp"},
-{"cuillamartin", {NULL}, 1356, "tcp"},
-{"cuillamartin", {NULL}, 1356, "udp"},
-{"pegboard", {NULL}, 1357, "tcp"},
-{"pegboard", {NULL}, 1357, "udp"},
-{"connlcli", {NULL}, 1358, "tcp"},
-{"connlcli", {NULL}, 1358, "udp"},
-{"ftsrv", {NULL}, 1359, "tcp"},
-{"ftsrv", {NULL}, 1359, "udp"},
-{"mimer", {NULL}, 1360, "tcp"},
-{"mimer", {NULL}, 1360, "udp"},
-{"linx", {NULL}, 1361, "tcp"},
-{"linx", {NULL}, 1361, "udp"},
-{"timeflies", {NULL}, 1362, "tcp"},
-{"timeflies", {NULL}, 1362, "udp"},
-{"ndm-requester", {NULL}, 1363, "tcp"},
-{"ndm-requester", {NULL}, 1363, "udp"},
-{"ndm-server", {NULL}, 1364, "tcp"},
-{"ndm-server", {NULL}, 1364, "udp"},
-{"adapt-sna", {NULL}, 1365, "tcp"},
-{"adapt-sna", {NULL}, 1365, "udp"},
-{"netware-csp", {NULL}, 1366, "tcp"},
-{"netware-csp", {NULL}, 1366, "udp"},
-{"dcs", {NULL}, 1367, "tcp"},
-{"dcs", {NULL}, 1367, "udp"},
-{"screencast", {NULL}, 1368, "tcp"},
-{"screencast", {NULL}, 1368, "udp"},
-{"gv-us", {NULL}, 1369, "tcp"},
-{"gv-us", {NULL}, 1369, "udp"},
-{"us-gv", {NULL}, 1370, "tcp"},
-{"us-gv", {NULL}, 1370, "udp"},
-{"fc-cli", {NULL}, 1371, "tcp"},
-{"fc-cli", {NULL}, 1371, "udp"},
-{"fc-ser", {NULL}, 1372, "tcp"},
-{"fc-ser", {NULL}, 1372, "udp"},
-{"chromagrafx", {NULL}, 1373, "tcp"},
-{"chromagrafx", {NULL}, 1373, "udp"},
-{"molly", {NULL}, 1374, "tcp"},
-{"molly", {NULL}, 1374, "udp"},
-{"bytex", {NULL}, 1375, "tcp"},
-{"bytex", {NULL}, 1375, "udp"},
-{"ibm-pps", {NULL}, 1376, "tcp"},
-{"ibm-pps", {NULL}, 1376, "udp"},
-{"cichlid", {NULL}, 1377, "tcp"},
-{"cichlid", {NULL}, 1377, "udp"},
-{"elan", {NULL}, 1378, "tcp"},
-{"elan", {NULL}, 1378, "udp"},
-{"dbreporter", {NULL}, 1379, "tcp"},
-{"dbreporter", {NULL}, 1379, "udp"},
-{"telesis-licman", {NULL}, 1380, "tcp"},
-{"telesis-licman", {NULL}, 1380, "udp"},
-{"apple-licman", {NULL}, 1381, "tcp"},
-{"apple-licman", {NULL}, 1381, "udp"},
-{"udt_os", {NULL}, 1382, "tcp"},
-{"udt_os", {NULL}, 1382, "udp"},
-{"gwha", {NULL}, 1383, "tcp"},
-{"gwha", {NULL}, 1383, "udp"},
-{"os-licman", {NULL}, 1384, "tcp"},
-{"os-licman", {NULL}, 1384, "udp"},
-{"atex_elmd", {NULL}, 1385, "tcp"},
-{"atex_elmd", {NULL}, 1385, "udp"},
-{"checksum", {NULL}, 1386, "tcp"},
-{"checksum", {NULL}, 1386, "udp"},
-{"cadsi-lm", {NULL}, 1387, "tcp"},
-{"cadsi-lm", {NULL}, 1387, "udp"},
-{"objective-dbc", {NULL}, 1388, "tcp"},
-{"objective-dbc", {NULL}, 1388, "udp"},
-{"iclpv-dm", {NULL}, 1389, "tcp"},
-{"iclpv-dm", {NULL}, 1389, "udp"},
-{"iclpv-sc", {NULL}, 1390, "tcp"},
-{"iclpv-sc", {NULL}, 1390, "udp"},
-{"iclpv-sas", {NULL}, 1391, "tcp"},
-{"iclpv-sas", {NULL}, 1391, "udp"},
-{"iclpv-pm", {NULL}, 1392, "tcp"},
-{"iclpv-pm", {NULL}, 1392, "udp"},
-{"iclpv-nls", {NULL}, 1393, "tcp"},
-{"iclpv-nls", {NULL}, 1393, "udp"},
-{"iclpv-nlc", {NULL}, 1394, "tcp"},
-{"iclpv-nlc", {NULL}, 1394, "udp"},
-{"iclpv-wsm", {NULL}, 1395, "tcp"},
-{"iclpv-wsm", {NULL}, 1395, "udp"},
-{"dvl-activemail", {NULL}, 1396, "tcp"},
-{"dvl-activemail", {NULL}, 1396, "udp"},
-{"audio-activmail", {NULL}, 1397, "tcp"},
-{"audio-activmail", {NULL}, 1397, "udp"},
-{"video-activmail", {NULL}, 1398, "tcp"},
-{"video-activmail", {NULL}, 1398, "udp"},
-{"cadkey-licman", {NULL}, 1399, "tcp"},
-{"cadkey-licman", {NULL}, 1399, "udp"},
-{"cadkey-tablet", {NULL}, 1400, "tcp"},
-{"cadkey-tablet", {NULL}, 1400, "udp"},
-{"goldleaf-licman", {NULL}, 1401, "tcp"},
-{"goldleaf-licman", {NULL}, 1401, "udp"},
-{"prm-sm-np", {NULL}, 1402, "tcp"},
-{"prm-sm-np", {NULL}, 1402, "udp"},
-{"prm-nm-np", {NULL}, 1403, "tcp"},
-{"prm-nm-np", {NULL}, 1403, "udp"},
-{"igi-lm", {NULL}, 1404, "tcp"},
-{"igi-lm", {NULL}, 1404, "udp"},
-{"ibm-res", {NULL}, 1405, "tcp"},
-{"ibm-res", {NULL}, 1405, "udp"},
-{"netlabs-lm", {NULL}, 1406, "tcp"},
-{"netlabs-lm", {NULL}, 1406, "udp"},
-{"dbsa-lm", {NULL}, 1407, "tcp"},
-{"dbsa-lm", {NULL}, 1407, "udp"},
-{"sophia-lm", {NULL}, 1408, "tcp"},
-{"sophia-lm", {NULL}, 1408, "udp"},
-{"here-lm", {NULL}, 1409, "tcp"},
-{"here-lm", {NULL}, 1409, "udp"},
-{"hiq", {NULL}, 1410, "tcp"},
-{"hiq", {NULL}, 1410, "udp"},
-{"af", {NULL}, 1411, "tcp"},
-{"af", {NULL}, 1411, "udp"},
-{"innosys", {NULL}, 1412, "tcp"},
-{"innosys", {NULL}, 1412, "udp"},
-{"innosys-acl", {NULL}, 1413, "tcp"},
-{"innosys-acl", {NULL}, 1413, "udp"},
-{"ibm-mqseries", {NULL}, 1414, "tcp"},
-{"ibm-mqseries", {NULL}, 1414, "udp"},
-{"dbstar", {NULL}, 1415, "tcp"},
-{"dbstar", {NULL}, 1415, "udp"},
-{"novell-lu6.2", {NULL}, 1416, "tcp"},
-{"novell-lu6.2", {NULL}, 1416, "udp"},
-{"timbuktu-srv1", {NULL}, 1417, "tcp"},
-{"timbuktu-srv1", {NULL}, 1417, "udp"},
-{"timbuktu-srv2", {NULL}, 1418, "tcp"},
-{"timbuktu-srv2", {NULL}, 1418, "udp"},
-{"timbuktu-srv3", {NULL}, 1419, "tcp"},
-{"timbuktu-srv3", {NULL}, 1419, "udp"},
-{"timbuktu-srv4", {NULL}, 1420, "tcp"},
-{"timbuktu-srv4", {NULL}, 1420, "udp"},
-{"gandalf-lm", {NULL}, 1421, "tcp"},
-{"gandalf-lm", {NULL}, 1421, "udp"},
-{"autodesk-lm", {NULL}, 1422, "tcp"},
-{"autodesk-lm", {NULL}, 1422, "udp"},
-{"essbase", {NULL}, 1423, "tcp"},
-{"essbase", {NULL}, 1423, "udp"},
-{"hybrid", {NULL}, 1424, "tcp"},
-{"hybrid", {NULL}, 1424, "udp"},
-{"zion-lm", {NULL}, 1425, "tcp"},
-{"zion-lm", {NULL}, 1425, "udp"},
-{"sais", {NULL}, 1426, "tcp"},
-{"sais", {NULL}, 1426, "udp"},
-{"mloadd", {NULL}, 1427, "tcp"},
-{"mloadd", {NULL}, 1427, "udp"},
-{"informatik-lm", {NULL}, 1428, "tcp"},
-{"informatik-lm", {NULL}, 1428, "udp"},
-{"nms", {NULL}, 1429, "tcp"},
-{"nms", {NULL}, 1429, "udp"},
-{"tpdu", {NULL}, 1430, "tcp"},
-{"tpdu", {NULL}, 1430, "udp"},
-{"rgtp", {NULL}, 1431, "tcp"},
-{"rgtp", {NULL}, 1431, "udp"},
-{"blueberry-lm", {NULL}, 1432, "tcp"},
-{"blueberry-lm", {NULL}, 1432, "udp"},
-{"ms-sql-s", {NULL}, 1433, "tcp"},
-{"ms-sql-s", {NULL}, 1433, "udp"},
-{"ms-sql-m", {NULL}, 1434, "tcp"},
-{"ms-sql-m", {NULL}, 1434, "udp"},
-{"ibm-cics", {NULL}, 1435, "tcp"},
-{"ibm-cics", {NULL}, 1435, "udp"},
-{"saism", {NULL}, 1436, "tcp"},
-{"saism", {NULL}, 1436, "udp"},
-{"tabula", {NULL}, 1437, "tcp"},
-{"tabula", {NULL}, 1437, "udp"},
-{"eicon-server", {NULL}, 1438, "tcp"},
-{"eicon-server", {NULL}, 1438, "udp"},
-{"eicon-x25", {NULL}, 1439, "tcp"},
-{"eicon-x25", {NULL}, 1439, "udp"},
-{"eicon-slp", {NULL}, 1440, "tcp"},
-{"eicon-slp", {NULL}, 1440, "udp"},
-{"cadis-1", {NULL}, 1441, "tcp"},
-{"cadis-1", {NULL}, 1441, "udp"},
-{"cadis-2", {NULL}, 1442, "tcp"},
-{"cadis-2", {NULL}, 1442, "udp"},
-{"ies-lm", {NULL}, 1443, "tcp"},
-{"ies-lm", {NULL}, 1443, "udp"},
-{"marcam-lm", {NULL}, 1444, "tcp"},
-{"marcam-lm", {NULL}, 1444, "udp"},
-{"proxima-lm", {NULL}, 1445, "tcp"},
-{"proxima-lm", {NULL}, 1445, "udp"},
-{"ora-lm", {NULL}, 1446, "tcp"},
-{"ora-lm", {NULL}, 1446, "udp"},
-{"apri-lm", {NULL}, 1447, "tcp"},
-{"apri-lm", {NULL}, 1447, "udp"},
-{"oc-lm", {NULL}, 1448, "tcp"},
-{"oc-lm", {NULL}, 1448, "udp"},
-{"peport", {NULL}, 1449, "tcp"},
-{"peport", {NULL}, 1449, "udp"},
-{"dwf", {NULL}, 1450, "tcp"},
-{"dwf", {NULL}, 1450, "udp"},
-{"infoman", {NULL}, 1451, "tcp"},
-{"infoman", {NULL}, 1451, "udp"},
-{"gtegsc-lm", {NULL}, 1452, "tcp"},
-{"gtegsc-lm", {NULL}, 1452, "udp"},
-{"genie-lm", {NULL}, 1453, "tcp"},
-{"genie-lm", {NULL}, 1453, "udp"},
-{"interhdl_elmd", {NULL}, 1454, "tcp"},
-{"interhdl_elmd", {NULL}, 1454, "udp"},
-{"esl-lm", {NULL}, 1455, "tcp"},
-{"esl-lm", {NULL}, 1455, "udp"},
-{"dca", {NULL}, 1456, "tcp"},
-{"dca", {NULL}, 1456, "udp"},
-{"valisys-lm", {NULL}, 1457, "tcp"},
-{"valisys-lm", {NULL}, 1457, "udp"},
-{"nrcabq-lm", {NULL}, 1458, "tcp"},
-{"nrcabq-lm", {NULL}, 1458, "udp"},
-{"proshare1", {NULL}, 1459, "tcp"},
-{"proshare1", {NULL}, 1459, "udp"},
-{"proshare2", {NULL}, 1460, "tcp"},
-{"proshare2", {NULL}, 1460, "udp"},
-{"ibm_wrless_lan", {NULL}, 1461, "tcp"},
-{"ibm_wrless_lan", {NULL}, 1461, "udp"},
-{"world-lm", {NULL}, 1462, "tcp"},
-{"world-lm", {NULL}, 1462, "udp"},
-{"nucleus", {NULL}, 1463, "tcp"},
-{"nucleus", {NULL}, 1463, "udp"},
-{"msl_lmd", {NULL}, 1464, "tcp"},
-{"msl_lmd", {NULL}, 1464, "udp"},
-{"pipes", {NULL}, 1465, "tcp"},
-{"pipes", {NULL}, 1465, "udp"},
-{"oceansoft-lm", {NULL}, 1466, "tcp"},
-{"oceansoft-lm", {NULL}, 1466, "udp"},
-{"csdmbase", {NULL}, 1467, "tcp"},
-{"csdmbase", {NULL}, 1467, "udp"},
-{"csdm", {NULL}, 1468, "tcp"},
-{"csdm", {NULL}, 1468, "udp"},
-{"aal-lm", {NULL}, 1469, "tcp"},
-{"aal-lm", {NULL}, 1469, "udp"},
-{"uaiact", {NULL}, 1470, "tcp"},
-{"uaiact", {NULL}, 1470, "udp"},
-{"csdmbase", {NULL}, 1471, "tcp"},
-{"csdmbase", {NULL}, 1471, "udp"},
-{"csdm", {NULL}, 1472, "tcp"},
-{"csdm", {NULL}, 1472, "udp"},
-{"openmath", {NULL}, 1473, "tcp"},
-{"openmath", {NULL}, 1473, "udp"},
-{"telefinder", {NULL}, 1474, "tcp"},
-{"telefinder", {NULL}, 1474, "udp"},
-{"taligent-lm", {NULL}, 1475, "tcp"},
-{"taligent-lm", {NULL}, 1475, "udp"},
-{"clvm-cfg", {NULL}, 1476, "tcp"},
-{"clvm-cfg", {NULL}, 1476, "udp"},
-{"ms-sna-server", {NULL}, 1477, "tcp"},
-{"ms-sna-server", {NULL}, 1477, "udp"},
-{"ms-sna-base", {NULL}, 1478, "tcp"},
-{"ms-sna-base", {NULL}, 1478, "udp"},
-{"dberegister", {NULL}, 1479, "tcp"},
-{"dberegister", {NULL}, 1479, "udp"},
-{"pacerforum", {NULL}, 1480, "tcp"},
-{"pacerforum", {NULL}, 1480, "udp"},
-{"airs", {NULL}, 1481, "tcp"},
-{"airs", {NULL}, 1481, "udp"},
-{"miteksys-lm", {NULL}, 1482, "tcp"},
-{"miteksys-lm", {NULL}, 1482, "udp"},
-{"afs", {NULL}, 1483, "tcp"},
-{"afs", {NULL}, 1483, "udp"},
-{"confluent", {NULL}, 1484, "tcp"},
-{"confluent", {NULL}, 1484, "udp"},
-{"lansource", {NULL}, 1485, "tcp"},
-{"lansource", {NULL}, 1485, "udp"},
-{"nms_topo_serv", {NULL}, 1486, "tcp"},
-{"nms_topo_serv", {NULL}, 1486, "udp"},
-{"localinfosrvr", {NULL}, 1487, "tcp"},
-{"localinfosrvr", {NULL}, 1487, "udp"},
-{"docstor", {NULL}, 1488, "tcp"},
-{"docstor", {NULL}, 1488, "udp"},
-{"dmdocbroker", {NULL}, 1489, "tcp"},
-{"dmdocbroker", {NULL}, 1489, "udp"},
-{"insitu-conf", {NULL}, 1490, "tcp"},
-{"insitu-conf", {NULL}, 1490, "udp"},
-{"stone-design-1", {NULL}, 1492, "tcp"},
-{"stone-design-1", {NULL}, 1492, "udp"},
-{"netmap_lm", {NULL}, 1493, "tcp"},
-{"netmap_lm", {NULL}, 1493, "udp"},
-{"ica", {NULL}, 1494, "tcp"},
-{"ica", {NULL}, 1494, "udp"},
-{"cvc", {NULL}, 1495, "tcp"},
-{"cvc", {NULL}, 1495, "udp"},
-{"liberty-lm", {NULL}, 1496, "tcp"},
-{"liberty-lm", {NULL}, 1496, "udp"},
-{"rfx-lm", {NULL}, 1497, "tcp"},
-{"rfx-lm", {NULL}, 1497, "udp"},
-{"sybase-sqlany", {NULL}, 1498, "tcp"},
-{"sybase-sqlany", {NULL}, 1498, "udp"},
-{"fhc", {NULL}, 1499, "tcp"},
-{"fhc", {NULL}, 1499, "udp"},
-{"vlsi-lm", {NULL}, 1500, "tcp"},
-{"vlsi-lm", {NULL}, 1500, "udp"},
-{"saiscm", {NULL}, 1501, "tcp"},
-{"saiscm", {NULL}, 1501, "udp"},
-{"shivadiscovery", {NULL}, 1502, "tcp"},
-{"shivadiscovery", {NULL}, 1502, "udp"},
-{"imtc-mcs", {NULL}, 1503, "tcp"},
-{"imtc-mcs", {NULL}, 1503, "udp"},
-{"evb-elm", {NULL}, 1504, "tcp"},
-{"evb-elm", {NULL}, 1504, "udp"},
-{"funkproxy", {NULL}, 1505, "tcp"},
-{"funkproxy", {NULL}, 1505, "udp"},
-{"utcd", {NULL}, 1506, "tcp"},
-{"utcd", {NULL}, 1506, "udp"},
-{"symplex", {NULL}, 1507, "tcp"},
-{"symplex", {NULL}, 1507, "udp"},
-{"diagmond", {NULL}, 1508, "tcp"},
-{"diagmond", {NULL}, 1508, "udp"},
-{"robcad-lm", {NULL}, 1509, "tcp"},
-{"robcad-lm", {NULL}, 1509, "udp"},
-{"mvx-lm", {NULL}, 1510, "tcp"},
-{"mvx-lm", {NULL}, 1510, "udp"},
-{"3l-l1", {NULL}, 1511, "tcp"},
-{"3l-l1", {NULL}, 1511, "udp"},
-{"wins", {NULL}, 1512, "tcp"},
-{"wins", {NULL}, 1512, "udp"},
-{"fujitsu-dtc", {NULL}, 1513, "tcp"},
-{"fujitsu-dtc", {NULL}, 1513, "udp"},
-{"fujitsu-dtcns", {NULL}, 1514, "tcp"},
-{"fujitsu-dtcns", {NULL}, 1514, "udp"},
-{"ifor-protocol", {NULL}, 1515, "tcp"},
-{"ifor-protocol", {NULL}, 1515, "udp"},
-{"vpad", {NULL}, 1516, "tcp"},
-{"vpad", {NULL}, 1516, "udp"},
-{"vpac", {NULL}, 1517, "tcp"},
-{"vpac", {NULL}, 1517, "udp"},
-{"vpvd", {NULL}, 1518, "tcp"},
-{"vpvd", {NULL}, 1518, "udp"},
-{"vpvc", {NULL}, 1519, "tcp"},
-{"vpvc", {NULL}, 1519, "udp"},
-{"atm-zip-office", {NULL}, 1520, "tcp"},
-{"atm-zip-office", {NULL}, 1520, "udp"},
-{"ncube-lm", {NULL}, 1521, "tcp"},
-{"ncube-lm", {NULL}, 1521, "udp"},
-{"ricardo-lm", {NULL}, 1522, "tcp"},
-{"ricardo-lm", {NULL}, 1522, "udp"},
-{"cichild-lm", {NULL}, 1523, "tcp"},
-{"cichild-lm", {NULL}, 1523, "udp"},
-{"ingreslock", {NULL}, 1524, "tcp"},
-{"ingreslock", {NULL}, 1524, "udp"},
-{"orasrv", {NULL}, 1525, "tcp"},
-{"orasrv", {NULL}, 1525, "udp"},
-{"prospero-np", {NULL}, 1525, "tcp"},
-{"prospero-np", {NULL}, 1525, "udp"},
-{"pdap-np", {NULL}, 1526, "tcp"},
-{"pdap-np", {NULL}, 1526, "udp"},
-{"tlisrv", {NULL}, 1527, "tcp"},
-{"tlisrv", {NULL}, 1527, "udp"},
-{"coauthor", {NULL}, 1529, "tcp"},
-{"coauthor", {NULL}, 1529, "udp"},
-{"rap-service", {NULL}, 1530, "tcp"},
-{"rap-service", {NULL}, 1530, "udp"},
-{"rap-listen", {NULL}, 1531, "tcp"},
-{"rap-listen", {NULL}, 1531, "udp"},
-{"miroconnect", {NULL}, 1532, "tcp"},
-{"miroconnect", {NULL}, 1532, "udp"},
-{"virtual-places", {NULL}, 1533, "tcp"},
-{"virtual-places", {NULL}, 1533, "udp"},
-{"micromuse-lm", {NULL}, 1534, "tcp"},
-{"micromuse-lm", {NULL}, 1534, "udp"},
-{"ampr-info", {NULL}, 1535, "tcp"},
-{"ampr-info", {NULL}, 1535, "udp"},
-{"ampr-inter", {NULL}, 1536, "tcp"},
-{"ampr-inter", {NULL}, 1536, "udp"},
-{"sdsc-lm", {NULL}, 1537, "tcp"},
-{"sdsc-lm", {NULL}, 1537, "udp"},
-{"3ds-lm", {NULL}, 1538, "tcp"},
-{"3ds-lm", {NULL}, 1538, "udp"},
-{"intellistor-lm", {NULL}, 1539, "tcp"},
-{"intellistor-lm", {NULL}, 1539, "udp"},
-{"rds", {NULL}, 1540, "tcp"},
-{"rds", {NULL}, 1540, "udp"},
-{"rds2", {NULL}, 1541, "tcp"},
-{"rds2", {NULL}, 1541, "udp"},
-{"gridgen-elmd", {NULL}, 1542, "tcp"},
-{"gridgen-elmd", {NULL}, 1542, "udp"},
-{"simba-cs", {NULL}, 1543, "tcp"},
-{"simba-cs", {NULL}, 1543, "udp"},
-{"aspeclmd", {NULL}, 1544, "tcp"},
-{"aspeclmd", {NULL}, 1544, "udp"},
-{"vistium-share", {NULL}, 1545, "tcp"},
-{"vistium-share", {NULL}, 1545, "udp"},
-{"abbaccuray", {NULL}, 1546, "tcp"},
-{"abbaccuray", {NULL}, 1546, "udp"},
-{"laplink", {NULL}, 1547, "tcp"},
-{"laplink", {NULL}, 1547, "udp"},
-{"axon-lm", {NULL}, 1548, "tcp"},
-{"axon-lm", {NULL}, 1548, "udp"},
-{"shivahose", {NULL}, 1549, "tcp"},
-{"shivasound", {NULL}, 1549, "udp"},
-{"3m-image-lm", {NULL}, 1550, "tcp"},
-{"3m-image-lm", {NULL}, 1550, "udp"},
-{"hecmtl-db", {NULL}, 1551, "tcp"},
-{"hecmtl-db", {NULL}, 1551, "udp"},
-{"pciarray", {NULL}, 1552, "tcp"},
-{"pciarray", {NULL}, 1552, "udp"},
-{"sna-cs", {NULL}, 1553, "tcp"},
-{"sna-cs", {NULL}, 1553, "udp"},
-{"caci-lm", {NULL}, 1554, "tcp"},
-{"caci-lm", {NULL}, 1554, "udp"},
-{"livelan", {NULL}, 1555, "tcp"},
-{"livelan", {NULL}, 1555, "udp"},
-{"veritas_pbx", {NULL}, 1556, "tcp"},
-{"veritas_pbx", {NULL}, 1556, "udp"},
-{"arbortext-lm", {NULL}, 1557, "tcp"},
-{"arbortext-lm", {NULL}, 1557, "udp"},
-{"xingmpeg", {NULL}, 1558, "tcp"},
-{"xingmpeg", {NULL}, 1558, "udp"},
-{"web2host", {NULL}, 1559, "tcp"},
-{"web2host", {NULL}, 1559, "udp"},
-{"asci-val", {NULL}, 1560, "tcp"},
-{"asci-val", {NULL}, 1560, "udp"},
-{"facilityview", {NULL}, 1561, "tcp"},
-{"facilityview", {NULL}, 1561, "udp"},
-{"pconnectmgr", {NULL}, 1562, "tcp"},
-{"pconnectmgr", {NULL}, 1562, "udp"},
-{"cadabra-lm", {NULL}, 1563, "tcp"},
-{"cadabra-lm", {NULL}, 1563, "udp"},
-{"pay-per-view", {NULL}, 1564, "tcp"},
-{"pay-per-view", {NULL}, 1564, "udp"},
-{"winddlb", {NULL}, 1565, "tcp"},
-{"winddlb", {NULL}, 1565, "udp"},
-{"corelvideo", {NULL}, 1566, "tcp"},
-{"corelvideo", {NULL}, 1566, "udp"},
-{"jlicelmd", {NULL}, 1567, "tcp"},
-{"jlicelmd", {NULL}, 1567, "udp"},
-{"tsspmap", {NULL}, 1568, "tcp"},
-{"tsspmap", {NULL}, 1568, "udp"},
-{"ets", {NULL}, 1569, "tcp"},
-{"ets", {NULL}, 1569, "udp"},
-{"orbixd", {NULL}, 1570, "tcp"},
-{"orbixd", {NULL}, 1570, "udp"},
-{"rdb-dbs-disp", {NULL}, 1571, "tcp"},
-{"rdb-dbs-disp", {NULL}, 1571, "udp"},
-{"chip-lm", {NULL}, 1572, "tcp"},
-{"chip-lm", {NULL}, 1572, "udp"},
-{"itscomm-ns", {NULL}, 1573, "tcp"},
-{"itscomm-ns", {NULL}, 1573, "udp"},
-{"mvel-lm", {NULL}, 1574, "tcp"},
-{"mvel-lm", {NULL}, 1574, "udp"},
-{"oraclenames", {NULL}, 1575, "tcp"},
-{"oraclenames", {NULL}, 1575, "udp"},
-{"moldflow-lm", {NULL}, 1576, "tcp"},
-{"moldflow-lm", {NULL}, 1576, "udp"},
-{"hypercube-lm", {NULL}, 1577, "tcp"},
-{"hypercube-lm", {NULL}, 1577, "udp"},
-{"jacobus-lm", {NULL}, 1578, "tcp"},
-{"jacobus-lm", {NULL}, 1578, "udp"},
-{"ioc-sea-lm", {NULL}, 1579, "tcp"},
-{"ioc-sea-lm", {NULL}, 1579, "udp"},
-{"tn-tl-r1", {NULL}, 1580, "tcp"},
-{"tn-tl-r2", {NULL}, 1580, "udp"},
-{"mil-2045-47001", {NULL}, 1581, "tcp"},
-{"mil-2045-47001", {NULL}, 1581, "udp"},
-{"msims", {NULL}, 1582, "tcp"},
-{"msims", {NULL}, 1582, "udp"},
-{"simbaexpress", {NULL}, 1583, "tcp"},
-{"simbaexpress", {NULL}, 1583, "udp"},
-{"tn-tl-fd2", {NULL}, 1584, "tcp"},
-{"tn-tl-fd2", {NULL}, 1584, "udp"},
-{"intv", {NULL}, 1585, "tcp"},
-{"intv", {NULL}, 1585, "udp"},
-{"ibm-abtact", {NULL}, 1586, "tcp"},
-{"ibm-abtact", {NULL}, 1586, "udp"},
-{"pra_elmd", {NULL}, 1587, "tcp"},
-{"pra_elmd", {NULL}, 1587, "udp"},
-{"triquest-lm", {NULL}, 1588, "tcp"},
-{"triquest-lm", {NULL}, 1588, "udp"},
-{"vqp", {NULL}, 1589, "tcp"},
-{"vqp", {NULL}, 1589, "udp"},
-{"gemini-lm", {NULL}, 1590, "tcp"},
-{"gemini-lm", {NULL}, 1590, "udp"},
-{"ncpm-pm", {NULL}, 1591, "tcp"},
-{"ncpm-pm", {NULL}, 1591, "udp"},
-{"commonspace", {NULL}, 1592, "tcp"},
-{"commonspace", {NULL}, 1592, "udp"},
-{"mainsoft-lm", {NULL}, 1593, "tcp"},
-{"mainsoft-lm", {NULL}, 1593, "udp"},
-{"sixtrak", {NULL}, 1594, "tcp"},
-{"sixtrak", {NULL}, 1594, "udp"},
-{"radio", {NULL}, 1595, "tcp"},
-{"radio", {NULL}, 1595, "udp"},
-{"radio-sm", {NULL}, 1596, "tcp"},
-{"radio-bc", {NULL}, 1596, "udp"},
-{"orbplus-iiop", {NULL}, 1597, "tcp"},
-{"orbplus-iiop", {NULL}, 1597, "udp"},
-{"picknfs", {NULL}, 1598, "tcp"},
-{"picknfs", {NULL}, 1598, "udp"},
-{"simbaservices", {NULL}, 1599, "tcp"},
-{"simbaservices", {NULL}, 1599, "udp"},
-{"issd", {NULL}, 1600, "tcp"},
-{"issd", {NULL}, 1600, "udp"},
-{"aas", {NULL}, 1601, "tcp"},
-{"aas", {NULL}, 1601, "udp"},
-{"inspect", {NULL}, 1602, "tcp"},
-{"inspect", {NULL}, 1602, "udp"},
-{"picodbc", {NULL}, 1603, "tcp"},
-{"picodbc", {NULL}, 1603, "udp"},
-{"icabrowser", {NULL}, 1604, "tcp"},
-{"icabrowser", {NULL}, 1604, "udp"},
-{"slp", {NULL}, 1605, "tcp"},
-{"slp", {NULL}, 1605, "udp"},
-{"slm-api", {NULL}, 1606, "tcp"},
-{"slm-api", {NULL}, 1606, "udp"},
-{"stt", {NULL}, 1607, "tcp"},
-{"stt", {NULL}, 1607, "udp"},
-{"smart-lm", {NULL}, 1608, "tcp"},
-{"smart-lm", {NULL}, 1608, "udp"},
-{"isysg-lm", {NULL}, 1609, "tcp"},
-{"isysg-lm", {NULL}, 1609, "udp"},
-{"taurus-wh", {NULL}, 1610, "tcp"},
-{"taurus-wh", {NULL}, 1610, "udp"},
-{"ill", {NULL}, 1611, "tcp"},
-{"ill", {NULL}, 1611, "udp"},
-{"netbill-trans", {NULL}, 1612, "tcp"},
-{"netbill-trans", {NULL}, 1612, "udp"},
-{"netbill-keyrep", {NULL}, 1613, "tcp"},
-{"netbill-keyrep", {NULL}, 1613, "udp"},
-{"netbill-cred", {NULL}, 1614, "tcp"},
-{"netbill-cred", {NULL}, 1614, "udp"},
-{"netbill-auth", {NULL}, 1615, "tcp"},
-{"netbill-auth", {NULL}, 1615, "udp"},
-{"netbill-prod", {NULL}, 1616, "tcp"},
-{"netbill-prod", {NULL}, 1616, "udp"},
-{"nimrod-agent", {NULL}, 1617, "tcp"},
-{"nimrod-agent", {NULL}, 1617, "udp"},
-{"skytelnet", {NULL}, 1618, "tcp"},
-{"skytelnet", {NULL}, 1618, "udp"},
-{"xs-openstorage", {NULL}, 1619, "tcp"},
-{"xs-openstorage", {NULL}, 1619, "udp"},
-{"faxportwinport", {NULL}, 1620, "tcp"},
-{"faxportwinport", {NULL}, 1620, "udp"},
-{"softdataphone", {NULL}, 1621, "tcp"},
-{"softdataphone", {NULL}, 1621, "udp"},
-{"ontime", {NULL}, 1622, "tcp"},
-{"ontime", {NULL}, 1622, "udp"},
-{"jaleosnd", {NULL}, 1623, "tcp"},
-{"jaleosnd", {NULL}, 1623, "udp"},
-{"udp-sr-port", {NULL}, 1624, "tcp"},
-{"udp-sr-port", {NULL}, 1624, "udp"},
-{"svs-omagent", {NULL}, 1625, "tcp"},
-{"svs-omagent", {NULL}, 1625, "udp"},
-{"shockwave", {NULL}, 1626, "tcp"},
-{"shockwave", {NULL}, 1626, "udp"},
-{"t128-gateway", {NULL}, 1627, "tcp"},
-{"t128-gateway", {NULL}, 1627, "udp"},
-{"lontalk-norm", {NULL}, 1628, "tcp"},
-{"lontalk-norm", {NULL}, 1628, "udp"},
-{"lontalk-urgnt", {NULL}, 1629, "tcp"},
-{"lontalk-urgnt", {NULL}, 1629, "udp"},
-{"oraclenet8cman", {NULL}, 1630, "tcp"},
-{"oraclenet8cman", {NULL}, 1630, "udp"},
-{"visitview", {NULL}, 1631, "tcp"},
-{"visitview", {NULL}, 1631, "udp"},
-{"pammratc", {NULL}, 1632, "tcp"},
-{"pammratc", {NULL}, 1632, "udp"},
-{"pammrpc", {NULL}, 1633, "tcp"},
-{"pammrpc", {NULL}, 1633, "udp"},
-{"loaprobe", {NULL}, 1634, "tcp"},
-{"loaprobe", {NULL}, 1634, "udp"},
-{"edb-server1", {NULL}, 1635, "tcp"},
-{"edb-server1", {NULL}, 1635, "udp"},
-{"isdc", {NULL}, 1636, "tcp"},
-{"isdc", {NULL}, 1636, "udp"},
-{"islc", {NULL}, 1637, "tcp"},
-{"islc", {NULL}, 1637, "udp"},
-{"ismc", {NULL}, 1638, "tcp"},
-{"ismc", {NULL}, 1638, "udp"},
-{"cert-initiator", {NULL}, 1639, "tcp"},
-{"cert-initiator", {NULL}, 1639, "udp"},
-{"cert-responder", {NULL}, 1640, "tcp"},
-{"cert-responder", {NULL}, 1640, "udp"},
-{"invision", {NULL}, 1641, "tcp"},
-{"invision", {NULL}, 1641, "udp"},
-{"isis-am", {NULL}, 1642, "tcp"},
-{"isis-am", {NULL}, 1642, "udp"},
-{"isis-ambc", {NULL}, 1643, "tcp"},
-{"isis-ambc", {NULL}, 1643, "udp"},
-{"saiseh", {NULL}, 1644, "tcp"},
-{"sightline", {NULL}, 1645, "tcp"},
-{"sightline", {NULL}, 1645, "udp"},
-{"sa-msg-port", {NULL}, 1646, "tcp"},
-{"sa-msg-port", {NULL}, 1646, "udp"},
-{"rsap", {NULL}, 1647, "tcp"},
-{"rsap", {NULL}, 1647, "udp"},
-{"concurrent-lm", {NULL}, 1648, "tcp"},
-{"concurrent-lm", {NULL}, 1648, "udp"},
-{"kermit", {NULL}, 1649, "tcp"},
-{"kermit", {NULL}, 1649, "udp"},
-{"nkd", {NULL}, 1650, "tcp"},
-{"nkd", {NULL}, 1650, "udp"},
-{"shiva_confsrvr", {NULL}, 1651, "tcp"},
-{"shiva_confsrvr", {NULL}, 1651, "udp"},
-{"xnmp", {NULL}, 1652, "tcp"},
-{"xnmp", {NULL}, 1652, "udp"},
-{"alphatech-lm", {NULL}, 1653, "tcp"},
-{"alphatech-lm", {NULL}, 1653, "udp"},
-{"stargatealerts", {NULL}, 1654, "tcp"},
-{"stargatealerts", {NULL}, 1654, "udp"},
-{"dec-mbadmin", {NULL}, 1655, "tcp"},
-{"dec-mbadmin", {NULL}, 1655, "udp"},
-{"dec-mbadmin-h", {NULL}, 1656, "tcp"},
-{"dec-mbadmin-h", {NULL}, 1656, "udp"},
-{"fujitsu-mmpdc", {NULL}, 1657, "tcp"},
-{"fujitsu-mmpdc", {NULL}, 1657, "udp"},
-{"sixnetudr", {NULL}, 1658, "tcp"},
-{"sixnetudr", {NULL}, 1658, "udp"},
-{"sg-lm", {NULL}, 1659, "tcp"},
-{"sg-lm", {NULL}, 1659, "udp"},
-{"skip-mc-gikreq", {NULL}, 1660, "tcp"},
-{"skip-mc-gikreq", {NULL}, 1660, "udp"},
-{"netview-aix-1", {NULL}, 1661, "tcp"},
-{"netview-aix-1", {NULL}, 1661, "udp"},
-{"netview-aix-2", {NULL}, 1662, "tcp"},
-{"netview-aix-2", {NULL}, 1662, "udp"},
-{"netview-aix-3", {NULL}, 1663, "tcp"},
-{"netview-aix-3", {NULL}, 1663, "udp"},
-{"netview-aix-4", {NULL}, 1664, "tcp"},
-{"netview-aix-4", {NULL}, 1664, "udp"},
-{"netview-aix-5", {NULL}, 1665, "tcp"},
-{"netview-aix-5", {NULL}, 1665, "udp"},
-{"netview-aix-6", {NULL}, 1666, "tcp"},
-{"netview-aix-6", {NULL}, 1666, "udp"},
-{"netview-aix-7", {NULL}, 1667, "tcp"},
-{"netview-aix-7", {NULL}, 1667, "udp"},
-{"netview-aix-8", {NULL}, 1668, "tcp"},
-{"netview-aix-8", {NULL}, 1668, "udp"},
-{"netview-aix-9", {NULL}, 1669, "tcp"},
-{"netview-aix-9", {NULL}, 1669, "udp"},
-{"netview-aix-10", {NULL}, 1670, "tcp"},
-{"netview-aix-10", {NULL}, 1670, "udp"},
-{"netview-aix-11", {NULL}, 1671, "tcp"},
-{"netview-aix-11", {NULL}, 1671, "udp"},
-{"netview-aix-12", {NULL}, 1672, "tcp"},
-{"netview-aix-12", {NULL}, 1672, "udp"},
-{"proshare-mc-1", {NULL}, 1673, "tcp"},
-{"proshare-mc-1", {NULL}, 1673, "udp"},
-{"proshare-mc-2", {NULL}, 1674, "tcp"},
-{"proshare-mc-2", {NULL}, 1674, "udp"},
-{"pdp", {NULL}, 1675, "tcp"},
-{"pdp", {NULL}, 1675, "udp"},
-{"netcomm1", {NULL}, 1676, "tcp"},
-{"netcomm2", {NULL}, 1676, "udp"},
-{"groupwise", {NULL}, 1677, "tcp"},
-{"groupwise", {NULL}, 1677, "udp"},
-{"prolink", {NULL}, 1678, "tcp"},
-{"prolink", {NULL}, 1678, "udp"},
-{"darcorp-lm", {NULL}, 1679, "tcp"},
-{"darcorp-lm", {NULL}, 1679, "udp"},
-{"microcom-sbp", {NULL}, 1680, "tcp"},
-{"microcom-sbp", {NULL}, 1680, "udp"},
-{"sd-elmd", {NULL}, 1681, "tcp"},
-{"sd-elmd", {NULL}, 1681, "udp"},
-{"lanyon-lantern", {NULL}, 1682, "tcp"},
-{"lanyon-lantern", {NULL}, 1682, "udp"},
-{"ncpm-hip", {NULL}, 1683, "tcp"},
-{"ncpm-hip", {NULL}, 1683, "udp"},
-{"snaresecure", {NULL}, 1684, "tcp"},
-{"snaresecure", {NULL}, 1684, "udp"},
-{"n2nremote", {NULL}, 1685, "tcp"},
-{"n2nremote", {NULL}, 1685, "udp"},
-{"cvmon", {NULL}, 1686, "tcp"},
-{"cvmon", {NULL}, 1686, "udp"},
-{"nsjtp-ctrl", {NULL}, 1687, "tcp"},
-{"nsjtp-ctrl", {NULL}, 1687, "udp"},
-{"nsjtp-data", {NULL}, 1688, "tcp"},
-{"nsjtp-data", {NULL}, 1688, "udp"},
-{"firefox", {NULL}, 1689, "tcp"},
-{"firefox", {NULL}, 1689, "udp"},
-{"ng-umds", {NULL}, 1690, "tcp"},
-{"ng-umds", {NULL}, 1690, "udp"},
-{"empire-empuma", {NULL}, 1691, "tcp"},
-{"empire-empuma", {NULL}, 1691, "udp"},
-{"sstsys-lm", {NULL}, 1692, "tcp"},
-{"sstsys-lm", {NULL}, 1692, "udp"},
-{"rrirtr", {NULL}, 1693, "tcp"},
-{"rrirtr", {NULL}, 1693, "udp"},
-{"rrimwm", {NULL}, 1694, "tcp"},
-{"rrimwm", {NULL}, 1694, "udp"},
-{"rrilwm", {NULL}, 1695, "tcp"},
-{"rrilwm", {NULL}, 1695, "udp"},
-{"rrifmm", {NULL}, 1696, "tcp"},
-{"rrifmm", {NULL}, 1696, "udp"},
-{"rrisat", {NULL}, 1697, "tcp"},
-{"rrisat", {NULL}, 1697, "udp"},
-{"rsvp-encap-1", {NULL}, 1698, "tcp"},
-{"rsvp-encap-1", {NULL}, 1698, "udp"},
-{"rsvp-encap-2", {NULL}, 1699, "tcp"},
-{"rsvp-encap-2", {NULL}, 1699, "udp"},
-{"mps-raft", {NULL}, 1700, "tcp"},
-{"mps-raft", {NULL}, 1700, "udp"},
-{"l2f", {NULL}, 1701, "tcp"},
-{"l2f", {NULL}, 1701, "udp"},
-{"l2tp", {NULL}, 1701, "tcp"},
-{"l2tp", {NULL}, 1701, "udp"},
-{"deskshare", {NULL}, 1702, "tcp"},
-{"deskshare", {NULL}, 1702, "udp"},
-{"hb-engine", {NULL}, 1703, "tcp"},
-{"hb-engine", {NULL}, 1703, "udp"},
-{"bcs-broker", {NULL}, 1704, "tcp"},
-{"bcs-broker", {NULL}, 1704, "udp"},
-{"slingshot", {NULL}, 1705, "tcp"},
-{"slingshot", {NULL}, 1705, "udp"},
-{"jetform", {NULL}, 1706, "tcp"},
-{"jetform", {NULL}, 1706, "udp"},
-{"vdmplay", {NULL}, 1707, "tcp"},
-{"vdmplay", {NULL}, 1707, "udp"},
-{"gat-lmd", {NULL}, 1708, "tcp"},
-{"gat-lmd", {NULL}, 1708, "udp"},
-{"centra", {NULL}, 1709, "tcp"},
-{"centra", {NULL}, 1709, "udp"},
-{"impera", {NULL}, 1710, "tcp"},
-{"impera", {NULL}, 1710, "udp"},
-{"pptconference", {NULL}, 1711, "tcp"},
-{"pptconference", {NULL}, 1711, "udp"},
-{"registrar", {NULL}, 1712, "tcp"},
-{"registrar", {NULL}, 1712, "udp"},
-{"conferencetalk", {NULL}, 1713, "tcp"},
-{"conferencetalk", {NULL}, 1713, "udp"},
-{"sesi-lm", {NULL}, 1714, "tcp"},
-{"sesi-lm", {NULL}, 1714, "udp"},
-{"houdini-lm", {NULL}, 1715, "tcp"},
-{"houdini-lm", {NULL}, 1715, "udp"},
-{"xmsg", {NULL}, 1716, "tcp"},
-{"xmsg", {NULL}, 1716, "udp"},
-{"fj-hdnet", {NULL}, 1717, "tcp"},
-{"fj-hdnet", {NULL}, 1717, "udp"},
-{"h323gatedisc", {NULL}, 1718, "tcp"},
-{"h323gatedisc", {NULL}, 1718, "udp"},
-{"h323gatestat", {NULL}, 1719, "tcp"},
-{"h323gatestat", {NULL}, 1719, "udp"},
-{"h323hostcall", {NULL}, 1720, "tcp"},
-{"h323hostcall", {NULL}, 1720, "udp"},
-{"caicci", {NULL}, 1721, "tcp"},
-{"caicci", {NULL}, 1721, "udp"},
-{"hks-lm", {NULL}, 1722, "tcp"},
-{"hks-lm", {NULL}, 1722, "udp"},
-{"pptp", {NULL}, 1723, "tcp"},
-{"pptp", {NULL}, 1723, "udp"},
-{"csbphonemaster", {NULL}, 1724, "tcp"},
-{"csbphonemaster", {NULL}, 1724, "udp"},
-{"iden-ralp", {NULL}, 1725, "tcp"},
-{"iden-ralp", {NULL}, 1725, "udp"},
-{"iberiagames", {NULL}, 1726, "tcp"},
-{"iberiagames", {NULL}, 1726, "udp"},
-{"winddx", {NULL}, 1727, "tcp"},
-{"winddx", {NULL}, 1727, "udp"},
-{"telindus", {NULL}, 1728, "tcp"},
-{"telindus", {NULL}, 1728, "udp"},
-{"citynl", {NULL}, 1729, "tcp"},
-{"citynl", {NULL}, 1729, "udp"},
-{"roketz", {NULL}, 1730, "tcp"},
-{"roketz", {NULL}, 1730, "udp"},
-{"msiccp", {NULL}, 1731, "tcp"},
-{"msiccp", {NULL}, 1731, "udp"},
-{"proxim", {NULL}, 1732, "tcp"},
-{"proxim", {NULL}, 1732, "udp"},
-{"siipat", {NULL}, 1733, "tcp"},
-{"siipat", {NULL}, 1733, "udp"},
-{"cambertx-lm", {NULL}, 1734, "tcp"},
-{"cambertx-lm", {NULL}, 1734, "udp"},
-{"privatechat", {NULL}, 1735, "tcp"},
-{"privatechat", {NULL}, 1735, "udp"},
-{"street-stream", {NULL}, 1736, "tcp"},
-{"street-stream", {NULL}, 1736, "udp"},
-{"ultimad", {NULL}, 1737, "tcp"},
-{"ultimad", {NULL}, 1737, "udp"},
-{"gamegen1", {NULL}, 1738, "tcp"},
-{"gamegen1", {NULL}, 1738, "udp"},
-{"webaccess", {NULL}, 1739, "tcp"},
-{"webaccess", {NULL}, 1739, "udp"},
-{"encore", {NULL}, 1740, "tcp"},
-{"encore", {NULL}, 1740, "udp"},
-{"cisco-net-mgmt", {NULL}, 1741, "tcp"},
-{"cisco-net-mgmt", {NULL}, 1741, "udp"},
-{"3Com-nsd", {NULL}, 1742, "tcp"},
-{"3Com-nsd", {NULL}, 1742, "udp"},
-{"cinegrfx-lm", {NULL}, 1743, "tcp"},
-{"cinegrfx-lm", {NULL}, 1743, "udp"},
-{"ncpm-ft", {NULL}, 1744, "tcp"},
-{"ncpm-ft", {NULL}, 1744, "udp"},
-{"remote-winsock", {NULL}, 1745, "tcp"},
-{"remote-winsock", {NULL}, 1745, "udp"},
-{"ftrapid-1", {NULL}, 1746, "tcp"},
-{"ftrapid-1", {NULL}, 1746, "udp"},
-{"ftrapid-2", {NULL}, 1747, "tcp"},
-{"ftrapid-2", {NULL}, 1747, "udp"},
-{"oracle-em1", {NULL}, 1748, "tcp"},
-{"oracle-em1", {NULL}, 1748, "udp"},
-{"aspen-services", {NULL}, 1749, "tcp"},
-{"aspen-services", {NULL}, 1749, "udp"},
-{"sslp", {NULL}, 1750, "tcp"},
-{"sslp", {NULL}, 1750, "udp"},
-{"swiftnet", {NULL}, 1751, "tcp"},
-{"swiftnet", {NULL}, 1751, "udp"},
-{"lofr-lm", {NULL}, 1752, "tcp"},
-{"lofr-lm", {NULL}, 1752, "udp"},
-{"oracle-em2", {NULL}, 1754, "tcp"},
-{"oracle-em2", {NULL}, 1754, "udp"},
-{"ms-streaming", {NULL}, 1755, "tcp"},
-{"ms-streaming", {NULL}, 1755, "udp"},
-{"capfast-lmd", {NULL}, 1756, "tcp"},
-{"capfast-lmd", {NULL}, 1756, "udp"},
-{"cnhrp", {NULL}, 1757, "tcp"},
-{"cnhrp", {NULL}, 1757, "udp"},
-{"tftp-mcast", {NULL}, 1758, "tcp"},
-{"tftp-mcast", {NULL}, 1758, "udp"},
-{"spss-lm", {NULL}, 1759, "tcp"},
-{"spss-lm", {NULL}, 1759, "udp"},
-{"www-ldap-gw", {NULL}, 1760, "tcp"},
-{"www-ldap-gw", {NULL}, 1760, "udp"},
-{"cft-0", {NULL}, 1761, "tcp"},
-{"cft-0", {NULL}, 1761, "udp"},
-{"cft-1", {NULL}, 1762, "tcp"},
-{"cft-1", {NULL}, 1762, "udp"},
-{"cft-2", {NULL}, 1763, "tcp"},
-{"cft-2", {NULL}, 1763, "udp"},
-{"cft-3", {NULL}, 1764, "tcp"},
-{"cft-3", {NULL}, 1764, "udp"},
-{"cft-4", {NULL}, 1765, "tcp"},
-{"cft-4", {NULL}, 1765, "udp"},
-{"cft-5", {NULL}, 1766, "tcp"},
-{"cft-5", {NULL}, 1766, "udp"},
-{"cft-6", {NULL}, 1767, "tcp"},
-{"cft-6", {NULL}, 1767, "udp"},
-{"cft-7", {NULL}, 1768, "tcp"},
-{"cft-7", {NULL}, 1768, "udp"},
-{"bmc-net-adm", {NULL}, 1769, "tcp"},
-{"bmc-net-adm", {NULL}, 1769, "udp"},
-{"bmc-net-svc", {NULL}, 1770, "tcp"},
-{"bmc-net-svc", {NULL}, 1770, "udp"},
-{"vaultbase", {NULL}, 1771, "tcp"},
-{"vaultbase", {NULL}, 1771, "udp"},
-{"essweb-gw", {NULL}, 1772, "tcp"},
-{"essweb-gw", {NULL}, 1772, "udp"},
-{"kmscontrol", {NULL}, 1773, "tcp"},
-{"kmscontrol", {NULL}, 1773, "udp"},
-{"global-dtserv", {NULL}, 1774, "tcp"},
-{"global-dtserv", {NULL}, 1774, "udp"},
-{"femis", {NULL}, 1776, "tcp"},
-{"femis", {NULL}, 1776, "udp"},
-{"powerguardian", {NULL}, 1777, "tcp"},
-{"powerguardian", {NULL}, 1777, "udp"},
-{"prodigy-intrnet", {NULL}, 1778, "tcp"},
-{"prodigy-intrnet", {NULL}, 1778, "udp"},
-{"pharmasoft", {NULL}, 1779, "tcp"},
-{"pharmasoft", {NULL}, 1779, "udp"},
-{"dpkeyserv", {NULL}, 1780, "tcp"},
-{"dpkeyserv", {NULL}, 1780, "udp"},
-{"answersoft-lm", {NULL}, 1781, "tcp"},
-{"answersoft-lm", {NULL}, 1781, "udp"},
-{"hp-hcip", {NULL}, 1782, "tcp"},
-{"hp-hcip", {NULL}, 1782, "udp"},
-{"finle-lm", {NULL}, 1784, "tcp"},
-{"finle-lm", {NULL}, 1784, "udp"},
-{"windlm", {NULL}, 1785, "tcp"},
-{"windlm", {NULL}, 1785, "udp"},
-{"funk-logger", {NULL}, 1786, "tcp"},
-{"funk-logger", {NULL}, 1786, "udp"},
-{"funk-license", {NULL}, 1787, "tcp"},
-{"funk-license", {NULL}, 1787, "udp"},
-{"psmond", {NULL}, 1788, "tcp"},
-{"psmond", {NULL}, 1788, "udp"},
-{"hello", {NULL}, 1789, "tcp"},
-{"hello", {NULL}, 1789, "udp"},
-{"nmsp", {NULL}, 1790, "tcp"},
-{"nmsp", {NULL}, 1790, "udp"},
-{"ea1", {NULL}, 1791, "tcp"},
-{"ea1", {NULL}, 1791, "udp"},
-{"ibm-dt-2", {NULL}, 1792, "tcp"},
-{"ibm-dt-2", {NULL}, 1792, "udp"},
-{"rsc-robot", {NULL}, 1793, "tcp"},
-{"rsc-robot", {NULL}, 1793, "udp"},
-{"cera-bcm", {NULL}, 1794, "tcp"},
-{"cera-bcm", {NULL}, 1794, "udp"},
-{"dpi-proxy", {NULL}, 1795, "tcp"},
-{"dpi-proxy", {NULL}, 1795, "udp"},
-{"vocaltec-admin", {NULL}, 1796, "tcp"},
-{"vocaltec-admin", {NULL}, 1796, "udp"},
-{"uma", {NULL}, 1797, "tcp"},
-{"uma", {NULL}, 1797, "udp"},
-{"etp", {NULL}, 1798, "tcp"},
-{"etp", {NULL}, 1798, "udp"},
-{"netrisk", {NULL}, 1799, "tcp"},
-{"netrisk", {NULL}, 1799, "udp"},
-{"ansys-lm", {NULL}, 1800, "tcp"},
-{"ansys-lm", {NULL}, 1800, "udp"},
-{"msmq", {NULL}, 1801, "tcp"},
-{"msmq", {NULL}, 1801, "udp"},
-{"concomp1", {NULL}, 1802, "tcp"},
-{"concomp1", {NULL}, 1802, "udp"},
-{"hp-hcip-gwy", {NULL}, 1803, "tcp"},
-{"hp-hcip-gwy", {NULL}, 1803, "udp"},
-{"enl", {NULL}, 1804, "tcp"},
-{"enl", {NULL}, 1804, "udp"},
-{"enl-name", {NULL}, 1805, "tcp"},
-{"enl-name", {NULL}, 1805, "udp"},
-{"musiconline", {NULL}, 1806, "tcp"},
-{"musiconline", {NULL}, 1806, "udp"},
-{"fhsp", {NULL}, 1807, "tcp"},
-{"fhsp", {NULL}, 1807, "udp"},
-{"oracle-vp2", {NULL}, 1808, "tcp"},
-{"oracle-vp2", {NULL}, 1808, "udp"},
-{"oracle-vp1", {NULL}, 1809, "tcp"},
-{"oracle-vp1", {NULL}, 1809, "udp"},
-{"jerand-lm", {NULL}, 1810, "tcp"},
-{"jerand-lm", {NULL}, 1810, "udp"},
-{"scientia-sdb", {NULL}, 1811, "tcp"},
-{"scientia-sdb", {NULL}, 1811, "udp"},
-{"radius", {NULL}, 1812, "tcp"},
-{"radius", {NULL}, 1812, "udp"},
-{"radius-acct", {NULL}, 1813, "tcp"},
-{"radius-acct", {NULL}, 1813, "udp"},
-{"tdp-suite", {NULL}, 1814, "tcp"},
-{"tdp-suite", {NULL}, 1814, "udp"},
-{"mmpft", {NULL}, 1815, "tcp"},
-{"mmpft", {NULL}, 1815, "udp"},
-{"harp", {NULL}, 1816, "tcp"},
-{"harp", {NULL}, 1816, "udp"},
-{"rkb-oscs", {NULL}, 1817, "tcp"},
-{"rkb-oscs", {NULL}, 1817, "udp"},
-{"etftp", {NULL}, 1818, "tcp"},
-{"etftp", {NULL}, 1818, "udp"},
-{"plato-lm", {NULL}, 1819, "tcp"},
-{"plato-lm", {NULL}, 1819, "udp"},
-{"mcagent", {NULL}, 1820, "tcp"},
-{"mcagent", {NULL}, 1820, "udp"},
-{"donnyworld", {NULL}, 1821, "tcp"},
-{"donnyworld", {NULL}, 1821, "udp"},
-{"es-elmd", {NULL}, 1822, "tcp"},
-{"es-elmd", {NULL}, 1822, "udp"},
-{"unisys-lm", {NULL}, 1823, "tcp"},
-{"unisys-lm", {NULL}, 1823, "udp"},
-{"metrics-pas", {NULL}, 1824, "tcp"},
-{"metrics-pas", {NULL}, 1824, "udp"},
-{"direcpc-video", {NULL}, 1825, "tcp"},
-{"direcpc-video", {NULL}, 1825, "udp"},
-{"ardt", {NULL}, 1826, "tcp"},
-{"ardt", {NULL}, 1826, "udp"},
-{"asi", {NULL}, 1827, "tcp"},
-{"asi", {NULL}, 1827, "udp"},
-{"itm-mcell-u", {NULL}, 1828, "tcp"},
-{"itm-mcell-u", {NULL}, 1828, "udp"},
-{"optika-emedia", {NULL}, 1829, "tcp"},
-{"optika-emedia", {NULL}, 1829, "udp"},
-{"net8-cman", {NULL}, 1830, "tcp"},
-{"net8-cman", {NULL}, 1830, "udp"},
-{"myrtle", {NULL}, 1831, "tcp"},
-{"myrtle", {NULL}, 1831, "udp"},
-{"tht-treasure", {NULL}, 1832, "tcp"},
-{"tht-treasure", {NULL}, 1832, "udp"},
-{"udpradio", {NULL}, 1833, "tcp"},
-{"udpradio", {NULL}, 1833, "udp"},
-{"ardusuni", {NULL}, 1834, "tcp"},
-{"ardusuni", {NULL}, 1834, "udp"},
-{"ardusmul", {NULL}, 1835, "tcp"},
-{"ardusmul", {NULL}, 1835, "udp"},
-{"ste-smsc", {NULL}, 1836, "tcp"},
-{"ste-smsc", {NULL}, 1836, "udp"},
-{"csoft1", {NULL}, 1837, "tcp"},
-{"csoft1", {NULL}, 1837, "udp"},
-{"talnet", {NULL}, 1838, "tcp"},
-{"talnet", {NULL}, 1838, "udp"},
-{"netopia-vo1", {NULL}, 1839, "tcp"},
-{"netopia-vo1", {NULL}, 1839, "udp"},
-{"netopia-vo2", {NULL}, 1840, "tcp"},
-{"netopia-vo2", {NULL}, 1840, "udp"},
-{"netopia-vo3", {NULL}, 1841, "tcp"},
-{"netopia-vo3", {NULL}, 1841, "udp"},
-{"netopia-vo4", {NULL}, 1842, "tcp"},
-{"netopia-vo4", {NULL}, 1842, "udp"},
-{"netopia-vo5", {NULL}, 1843, "tcp"},
-{"netopia-vo5", {NULL}, 1843, "udp"},
-{"direcpc-dll", {NULL}, 1844, "tcp"},
-{"direcpc-dll", {NULL}, 1844, "udp"},
-{"altalink", {NULL}, 1845, "tcp"},
-{"altalink", {NULL}, 1845, "udp"},
-{"tunstall-pnc", {NULL}, 1846, "tcp"},
-{"tunstall-pnc", {NULL}, 1846, "udp"},
-{"slp-notify", {NULL}, 1847, "tcp"},
-{"slp-notify", {NULL}, 1847, "udp"},
-{"fjdocdist", {NULL}, 1848, "tcp"},
-{"fjdocdist", {NULL}, 1848, "udp"},
-{"alpha-sms", {NULL}, 1849, "tcp"},
-{"alpha-sms", {NULL}, 1849, "udp"},
-{"gsi", {NULL}, 1850, "tcp"},
-{"gsi", {NULL}, 1850, "udp"},
-{"ctcd", {NULL}, 1851, "tcp"},
-{"ctcd", {NULL}, 1851, "udp"},
-{"virtual-time", {NULL}, 1852, "tcp"},
-{"virtual-time", {NULL}, 1852, "udp"},
-{"vids-avtp", {NULL}, 1853, "tcp"},
-{"vids-avtp", {NULL}, 1853, "udp"},
-{"buddy-draw", {NULL}, 1854, "tcp"},
-{"buddy-draw", {NULL}, 1854, "udp"},
-{"fiorano-rtrsvc", {NULL}, 1855, "tcp"},
-{"fiorano-rtrsvc", {NULL}, 1855, "udp"},
-{"fiorano-msgsvc", {NULL}, 1856, "tcp"},
-{"fiorano-msgsvc", {NULL}, 1856, "udp"},
-{"datacaptor", {NULL}, 1857, "tcp"},
-{"datacaptor", {NULL}, 1857, "udp"},
-{"privateark", {NULL}, 1858, "tcp"},
-{"privateark", {NULL}, 1858, "udp"},
-{"gammafetchsvr", {NULL}, 1859, "tcp"},
-{"gammafetchsvr", {NULL}, 1859, "udp"},
-{"sunscalar-svc", {NULL}, 1860, "tcp"},
-{"sunscalar-svc", {NULL}, 1860, "udp"},
-{"lecroy-vicp", {NULL}, 1861, "tcp"},
-{"lecroy-vicp", {NULL}, 1861, "udp"},
-{"mysql-cm-agent", {NULL}, 1862, "tcp"},
-{"mysql-cm-agent", {NULL}, 1862, "udp"},
-{"msnp", {NULL}, 1863, "tcp"},
-{"msnp", {NULL}, 1863, "udp"},
-{"paradym-31port", {NULL}, 1864, "tcp"},
-{"paradym-31port", {NULL}, 1864, "udp"},
-{"entp", {NULL}, 1865, "tcp"},
-{"entp", {NULL}, 1865, "udp"},
-{"swrmi", {NULL}, 1866, "tcp"},
-{"swrmi", {NULL}, 1866, "udp"},
-{"udrive", {NULL}, 1867, "tcp"},
-{"udrive", {NULL}, 1867, "udp"},
-{"viziblebrowser", {NULL}, 1868, "tcp"},
-{"viziblebrowser", {NULL}, 1868, "udp"},
-{"transact", {NULL}, 1869, "tcp"},
-{"transact", {NULL}, 1869, "udp"},
-{"sunscalar-dns", {NULL}, 1870, "tcp"},
-{"sunscalar-dns", {NULL}, 1870, "udp"},
-{"canocentral0", {NULL}, 1871, "tcp"},
-{"canocentral0", {NULL}, 1871, "udp"},
-{"canocentral1", {NULL}, 1872, "tcp"},
-{"canocentral1", {NULL}, 1872, "udp"},
-{"fjmpjps", {NULL}, 1873, "tcp"},
-{"fjmpjps", {NULL}, 1873, "udp"},
-{"fjswapsnp", {NULL}, 1874, "tcp"},
-{"fjswapsnp", {NULL}, 1874, "udp"},
-{"westell-stats", {NULL}, 1875, "tcp"},
-{"westell-stats", {NULL}, 1875, "udp"},
-{"ewcappsrv", {NULL}, 1876, "tcp"},
-{"ewcappsrv", {NULL}, 1876, "udp"},
-{"hp-webqosdb", {NULL}, 1877, "tcp"},
-{"hp-webqosdb", {NULL}, 1877, "udp"},
-{"drmsmc", {NULL}, 1878, "tcp"},
-{"drmsmc", {NULL}, 1878, "udp"},
-{"nettgain-nms", {NULL}, 1879, "tcp"},
-{"nettgain-nms", {NULL}, 1879, "udp"},
-{"vsat-control", {NULL}, 1880, "tcp"},
-{"vsat-control", {NULL}, 1880, "udp"},
-{"ibm-mqseries2", {NULL}, 1881, "tcp"},
-{"ibm-mqseries2", {NULL}, 1881, "udp"},
-{"ecsqdmn", {NULL}, 1882, "tcp"},
-{"ecsqdmn", {NULL}, 1882, "udp"},
-{"ibm-mqisdp", {NULL}, 1883, "tcp"},
-{"ibm-mqisdp", {NULL}, 1883, "udp"},
-{"idmaps", {NULL}, 1884, "tcp"},
-{"idmaps", {NULL}, 1884, "udp"},
-{"vrtstrapserver", {NULL}, 1885, "tcp"},
-{"vrtstrapserver", {NULL}, 1885, "udp"},
-{"leoip", {NULL}, 1886, "tcp"},
-{"leoip", {NULL}, 1886, "udp"},
-{"filex-lport", {NULL}, 1887, "tcp"},
-{"filex-lport", {NULL}, 1887, "udp"},
-{"ncconfig", {NULL}, 1888, "tcp"},
-{"ncconfig", {NULL}, 1888, "udp"},
-{"unify-adapter", {NULL}, 1889, "tcp"},
-{"unify-adapter", {NULL}, 1889, "udp"},
-{"wilkenlistener", {NULL}, 1890, "tcp"},
-{"wilkenlistener", {NULL}, 1890, "udp"},
-{"childkey-notif", {NULL}, 1891, "tcp"},
-{"childkey-notif", {NULL}, 1891, "udp"},
-{"childkey-ctrl", {NULL}, 1892, "tcp"},
-{"childkey-ctrl", {NULL}, 1892, "udp"},
-{"elad", {NULL}, 1893, "tcp"},
-{"elad", {NULL}, 1893, "udp"},
-{"o2server-port", {NULL}, 1894, "tcp"},
-{"o2server-port", {NULL}, 1894, "udp"},
-{"b-novative-ls", {NULL}, 1896, "tcp"},
-{"b-novative-ls", {NULL}, 1896, "udp"},
-{"metaagent", {NULL}, 1897, "tcp"},
-{"metaagent", {NULL}, 1897, "udp"},
-{"cymtec-port", {NULL}, 1898, "tcp"},
-{"cymtec-port", {NULL}, 1898, "udp"},
-{"mc2studios", {NULL}, 1899, "tcp"},
-{"mc2studios", {NULL}, 1899, "udp"},
-{"ssdp", {NULL}, 1900, "tcp"},
-{"ssdp", {NULL}, 1900, "udp"},
-{"fjicl-tep-a", {NULL}, 1901, "tcp"},
-{"fjicl-tep-a", {NULL}, 1901, "udp"},
-{"fjicl-tep-b", {NULL}, 1902, "tcp"},
-{"fjicl-tep-b", {NULL}, 1902, "udp"},
-{"linkname", {NULL}, 1903, "tcp"},
-{"linkname", {NULL}, 1903, "udp"},
-{"fjicl-tep-c", {NULL}, 1904, "tcp"},
-{"fjicl-tep-c", {NULL}, 1904, "udp"},
-{"sugp", {NULL}, 1905, "tcp"},
-{"sugp", {NULL}, 1905, "udp"},
-{"tpmd", {NULL}, 1906, "tcp"},
-{"tpmd", {NULL}, 1906, "udp"},
-{"intrastar", {NULL}, 1907, "tcp"},
-{"intrastar", {NULL}, 1907, "udp"},
-{"dawn", {NULL}, 1908, "tcp"},
-{"dawn", {NULL}, 1908, "udp"},
-{"global-wlink", {NULL}, 1909, "tcp"},
-{"global-wlink", {NULL}, 1909, "udp"},
-{"ultrabac", {NULL}, 1910, "tcp"},
-{"ultrabac", {NULL}, 1910, "udp"},
-{"mtp", {NULL}, 1911, "tcp"},
-{"mtp", {NULL}, 1911, "udp"},
-{"rhp-iibp", {NULL}, 1912, "tcp"},
-{"rhp-iibp", {NULL}, 1912, "udp"},
-{"armadp", {NULL}, 1913, "tcp"},
-{"armadp", {NULL}, 1913, "udp"},
-{"elm-momentum", {NULL}, 1914, "tcp"},
-{"elm-momentum", {NULL}, 1914, "udp"},
-{"facelink", {NULL}, 1915, "tcp"},
-{"facelink", {NULL}, 1915, "udp"},
-{"persona", {NULL}, 1916, "tcp"},
-{"persona", {NULL}, 1916, "udp"},
-{"noagent", {NULL}, 1917, "tcp"},
-{"noagent", {NULL}, 1917, "udp"},
-{"can-nds", {NULL}, 1918, "tcp"},
-{"can-nds", {NULL}, 1918, "udp"},
-{"can-dch", {NULL}, 1919, "tcp"},
-{"can-dch", {NULL}, 1919, "udp"},
-{"can-ferret", {NULL}, 1920, "tcp"},
-{"can-ferret", {NULL}, 1920, "udp"},
-{"noadmin", {NULL}, 1921, "tcp"},
-{"noadmin", {NULL}, 1921, "udp"},
-{"tapestry", {NULL}, 1922, "tcp"},
-{"tapestry", {NULL}, 1922, "udp"},
-{"spice", {NULL}, 1923, "tcp"},
-{"spice", {NULL}, 1923, "udp"},
-{"xiip", {NULL}, 1924, "tcp"},
-{"xiip", {NULL}, 1924, "udp"},
-{"discovery-port", {NULL}, 1925, "tcp"},
-{"discovery-port", {NULL}, 1925, "udp"},
-{"egs", {NULL}, 1926, "tcp"},
-{"egs", {NULL}, 1926, "udp"},
-{"videte-cipc", {NULL}, 1927, "tcp"},
-{"videte-cipc", {NULL}, 1927, "udp"},
-{"emsd-port", {NULL}, 1928, "tcp"},
-{"emsd-port", {NULL}, 1928, "udp"},
-{"bandwiz-system", {NULL}, 1929, "tcp"},
-{"bandwiz-system", {NULL}, 1929, "udp"},
-{"driveappserver", {NULL}, 1930, "tcp"},
-{"driveappserver", {NULL}, 1930, "udp"},
-{"amdsched", {NULL}, 1931, "tcp"},
-{"amdsched", {NULL}, 1931, "udp"},
-{"ctt-broker", {NULL}, 1932, "tcp"},
-{"ctt-broker", {NULL}, 1932, "udp"},
-{"xmapi", {NULL}, 1933, "tcp"},
-{"xmapi", {NULL}, 1933, "udp"},
-{"xaapi", {NULL}, 1934, "tcp"},
-{"xaapi", {NULL}, 1934, "udp"},
-{"macromedia-fcs", {NULL}, 1935, "tcp"},
-{"macromedia-fcs", {NULL}, 1935, "udp"},
-{"jetcmeserver", {NULL}, 1936, "tcp"},
-{"jetcmeserver", {NULL}, 1936, "udp"},
-{"jwserver", {NULL}, 1937, "tcp"},
-{"jwserver", {NULL}, 1937, "udp"},
-{"jwclient", {NULL}, 1938, "tcp"},
-{"jwclient", {NULL}, 1938, "udp"},
-{"jvserver", {NULL}, 1939, "tcp"},
-{"jvserver", {NULL}, 1939, "udp"},
-{"jvclient", {NULL}, 1940, "tcp"},
-{"jvclient", {NULL}, 1940, "udp"},
-{"dic-aida", {NULL}, 1941, "tcp"},
-{"dic-aida", {NULL}, 1941, "udp"},
-{"res", {NULL}, 1942, "tcp"},
-{"res", {NULL}, 1942, "udp"},
-{"beeyond-media", {NULL}, 1943, "tcp"},
-{"beeyond-media", {NULL}, 1943, "udp"},
-{"close-combat", {NULL}, 1944, "tcp"},
-{"close-combat", {NULL}, 1944, "udp"},
-{"dialogic-elmd", {NULL}, 1945, "tcp"},
-{"dialogic-elmd", {NULL}, 1945, "udp"},
-{"tekpls", {NULL}, 1946, "tcp"},
-{"tekpls", {NULL}, 1946, "udp"},
-{"sentinelsrm", {NULL}, 1947, "tcp"},
-{"sentinelsrm", {NULL}, 1947, "udp"},
-{"eye2eye", {NULL}, 1948, "tcp"},
-{"eye2eye", {NULL}, 1948, "udp"},
-{"ismaeasdaqlive", {NULL}, 1949, "tcp"},
-{"ismaeasdaqlive", {NULL}, 1949, "udp"},
-{"ismaeasdaqtest", {NULL}, 1950, "tcp"},
-{"ismaeasdaqtest", {NULL}, 1950, "udp"},
-{"bcs-lmserver", {NULL}, 1951, "tcp"},
-{"bcs-lmserver", {NULL}, 1951, "udp"},
-{"mpnjsc", {NULL}, 1952, "tcp"},
-{"mpnjsc", {NULL}, 1952, "udp"},
-{"rapidbase", {NULL}, 1953, "tcp"},
-{"rapidbase", {NULL}, 1953, "udp"},
-{"abr-api", {NULL}, 1954, "tcp"},
-{"abr-api", {NULL}, 1954, "udp"},
-{"abr-secure", {NULL}, 1955, "tcp"},
-{"abr-secure", {NULL}, 1955, "udp"},
-{"vrtl-vmf-ds", {NULL}, 1956, "tcp"},
-{"vrtl-vmf-ds", {NULL}, 1956, "udp"},
-{"unix-status", {NULL}, 1957, "tcp"},
-{"unix-status", {NULL}, 1957, "udp"},
-{"dxadmind", {NULL}, 1958, "tcp"},
-{"dxadmind", {NULL}, 1958, "udp"},
-{"simp-all", {NULL}, 1959, "tcp"},
-{"simp-all", {NULL}, 1959, "udp"},
-{"nasmanager", {NULL}, 1960, "tcp"},
-{"nasmanager", {NULL}, 1960, "udp"},
-{"bts-appserver", {NULL}, 1961, "tcp"},
-{"bts-appserver", {NULL}, 1961, "udp"},
-{"biap-mp", {NULL}, 1962, "tcp"},
-{"biap-mp", {NULL}, 1962, "udp"},
-{"webmachine", {NULL}, 1963, "tcp"},
-{"webmachine", {NULL}, 1963, "udp"},
-{"solid-e-engine", {NULL}, 1964, "tcp"},
-{"solid-e-engine", {NULL}, 1964, "udp"},
-{"tivoli-npm", {NULL}, 1965, "tcp"},
-{"tivoli-npm", {NULL}, 1965, "udp"},
-{"slush", {NULL}, 1966, "tcp"},
-{"slush", {NULL}, 1966, "udp"},
-{"sns-quote", {NULL}, 1967, "tcp"},
-{"sns-quote", {NULL}, 1967, "udp"},
-{"lipsinc", {NULL}, 1968, "tcp"},
-{"lipsinc", {NULL}, 1968, "udp"},
-{"lipsinc1", {NULL}, 1969, "tcp"},
-{"lipsinc1", {NULL}, 1969, "udp"},
-{"netop-rc", {NULL}, 1970, "tcp"},
-{"netop-rc", {NULL}, 1970, "udp"},
-{"netop-school", {NULL}, 1971, "tcp"},
-{"netop-school", {NULL}, 1971, "udp"},
-{"intersys-cache", {NULL}, 1972, "tcp"},
-{"intersys-cache", {NULL}, 1972, "udp"},
-{"dlsrap", {NULL}, 1973, "tcp"},
-{"dlsrap", {NULL}, 1973, "udp"},
-{"drp", {NULL}, 1974, "tcp"},
-{"drp", {NULL}, 1974, "udp"},
-{"tcoflashagent", {NULL}, 1975, "tcp"},
-{"tcoflashagent", {NULL}, 1975, "udp"},
-{"tcoregagent", {NULL}, 1976, "tcp"},
-{"tcoregagent", {NULL}, 1976, "udp"},
-{"tcoaddressbook", {NULL}, 1977, "tcp"},
-{"tcoaddressbook", {NULL}, 1977, "udp"},
-{"unisql", {NULL}, 1978, "tcp"},
-{"unisql", {NULL}, 1978, "udp"},
-{"unisql-java", {NULL}, 1979, "tcp"},
-{"unisql-java", {NULL}, 1979, "udp"},
-{"pearldoc-xact", {NULL}, 1980, "tcp"},
-{"pearldoc-xact", {NULL}, 1980, "udp"},
-{"p2pq", {NULL}, 1981, "tcp"},
-{"p2pq", {NULL}, 1981, "udp"},
-{"estamp", {NULL}, 1982, "tcp"},
-{"estamp", {NULL}, 1982, "udp"},
-{"lhtp", {NULL}, 1983, "tcp"},
-{"lhtp", {NULL}, 1983, "udp"},
-{"bb", {NULL}, 1984, "tcp"},
-{"bb", {NULL}, 1984, "udp"},
-{"hsrp", {NULL}, 1985, "tcp"},
-{"hsrp", {NULL}, 1985, "udp"},
-{"licensedaemon", {NULL}, 1986, "tcp"},
-{"licensedaemon", {NULL}, 1986, "udp"},
-{"tr-rsrb-p1", {NULL}, 1987, "tcp"},
-{"tr-rsrb-p1", {NULL}, 1987, "udp"},
-{"tr-rsrb-p2", {NULL}, 1988, "tcp"},
-{"tr-rsrb-p2", {NULL}, 1988, "udp"},
-{"tr-rsrb-p3", {NULL}, 1989, "tcp"},
-{"tr-rsrb-p3", {NULL}, 1989, "udp"},
-{"mshnet", {NULL}, 1989, "tcp"},
-{"mshnet", {NULL}, 1989, "udp"},
-{"stun-p1", {NULL}, 1990, "tcp"},
-{"stun-p1", {NULL}, 1990, "udp"},
-{"stun-p2", {NULL}, 1991, "tcp"},
-{"stun-p2", {NULL}, 1991, "udp"},
-{"stun-p3", {NULL}, 1992, "tcp"},
-{"stun-p3", {NULL}, 1992, "udp"},
-{"ipsendmsg", {NULL}, 1992, "tcp"},
-{"ipsendmsg", {NULL}, 1992, "udp"},
-{"snmp-tcp-port", {NULL}, 1993, "tcp"},
-{"snmp-tcp-port", {NULL}, 1993, "udp"},
-{"stun-port", {NULL}, 1994, "tcp"},
-{"stun-port", {NULL}, 1994, "udp"},
-{"perf-port", {NULL}, 1995, "tcp"},
-{"perf-port", {NULL}, 1995, "udp"},
-{"tr-rsrb-port", {NULL}, 1996, "tcp"},
-{"tr-rsrb-port", {NULL}, 1996, "udp"},
-{"gdp-port", {NULL}, 1997, "tcp"},
-{"gdp-port", {NULL}, 1997, "udp"},
-{"x25-svc-port", {NULL}, 1998, "tcp"},
-{"x25-svc-port", {NULL}, 1998, "udp"},
-{"tcp-id-port", {NULL}, 1999, "tcp"},
-{"tcp-id-port", {NULL}, 1999, "udp"},
-{"cisco-sccp", {NULL}, 2000, "tcp"},
-{"cisco-sccp", {NULL}, 2000, "udp"},
-{"dc", {NULL}, 2001, "tcp"},
-{"wizard", {NULL}, 2001, "udp"},
-{"globe", {NULL}, 2002, "tcp"},
-{"globe", {NULL}, 2002, "udp"},
-{"brutus", {NULL}, 2003, "tcp"},
-{"brutus", {NULL}, 2003, "udp"},
-{"mailbox", {NULL}, 2004, "tcp"},
-{"emce", {NULL}, 2004, "udp"},
-{"berknet", {NULL}, 2005, "tcp"},
-{"oracle", {NULL}, 2005, "udp"},
-{"invokator", {NULL}, 2006, "tcp"},
-{"raid-cd", {NULL}, 2006, "udp"},
-{"dectalk", {NULL}, 2007, "tcp"},
-{"raid-am", {NULL}, 2007, "udp"},
-{"conf", {NULL}, 2008, "tcp"},
-{"terminaldb", {NULL}, 2008, "udp"},
-{"news", {NULL}, 2009, "tcp"},
-{"whosockami", {NULL}, 2009, "udp"},
-{"search", {NULL}, 2010, "tcp"},
-{"pipe_server", {NULL}, 2010, "udp"},
-{"raid-cc", {NULL}, 2011, "tcp"},
-{"servserv", {NULL}, 2011, "udp"},
-{"ttyinfo", {NULL}, 2012, "tcp"},
-{"raid-ac", {NULL}, 2012, "udp"},
-{"raid-am", {NULL}, 2013, "tcp"},
-{"raid-cd", {NULL}, 2013, "udp"},
-{"troff", {NULL}, 2014, "tcp"},
-{"raid-sf", {NULL}, 2014, "udp"},
-{"cypress", {NULL}, 2015, "tcp"},
-{"raid-cs", {NULL}, 2015, "udp"},
-{"bootserver", {NULL}, 2016, "tcp"},
-{"bootserver", {NULL}, 2016, "udp"},
-{"cypress-stat", {NULL}, 2017, "tcp"},
-{"bootclient", {NULL}, 2017, "udp"},
-{"terminaldb", {NULL}, 2018, "tcp"},
-{"rellpack", {NULL}, 2018, "udp"},
-{"whosockami", {NULL}, 2019, "tcp"},
-{"about", {NULL}, 2019, "udp"},
-{"xinupageserver", {NULL}, 2020, "tcp"},
-{"xinupageserver", {NULL}, 2020, "udp"},
-{"servexec", {NULL}, 2021, "tcp"},
-{"xinuexpansion1", {NULL}, 2021, "udp"},
-{"down", {NULL}, 2022, "tcp"},
-{"xinuexpansion2", {NULL}, 2022, "udp"},
-{"xinuexpansion3", {NULL}, 2023, "tcp"},
-{"xinuexpansion3", {NULL}, 2023, "udp"},
-{"xinuexpansion4", {NULL}, 2024, "tcp"},
-{"xinuexpansion4", {NULL}, 2024, "udp"},
-{"ellpack", {NULL}, 2025, "tcp"},
-{"xribs", {NULL}, 2025, "udp"},
-{"scrabble", {NULL}, 2026, "tcp"},
-{"scrabble", {NULL}, 2026, "udp"},
-{"shadowserver", {NULL}, 2027, "tcp"},
-{"shadowserver", {NULL}, 2027, "udp"},
-{"submitserver", {NULL}, 2028, "tcp"},
-{"submitserver", {NULL}, 2028, "udp"},
-{"hsrpv6", {NULL}, 2029, "tcp"},
-{"hsrpv6", {NULL}, 2029, "udp"},
-{"device2", {NULL}, 2030, "tcp"},
-{"device2", {NULL}, 2030, "udp"},
-{"mobrien-chat", {NULL}, 2031, "tcp"},
-{"mobrien-chat", {NULL}, 2031, "udp"},
-{"blackboard", {NULL}, 2032, "tcp"},
-{"blackboard", {NULL}, 2032, "udp"},
-{"glogger", {NULL}, 2033, "tcp"},
-{"glogger", {NULL}, 2033, "udp"},
-{"scoremgr", {NULL}, 2034, "tcp"},
-{"scoremgr", {NULL}, 2034, "udp"},
-{"imsldoc", {NULL}, 2035, "tcp"},
-{"imsldoc", {NULL}, 2035, "udp"},
-{"e-dpnet", {NULL}, 2036, "tcp"},
-{"e-dpnet", {NULL}, 2036, "udp"},
-{"applus", {NULL}, 2037, "tcp"},
-{"applus", {NULL}, 2037, "udp"},
-{"objectmanager", {NULL}, 2038, "tcp"},
-{"objectmanager", {NULL}, 2038, "udp"},
-{"prizma", {NULL}, 2039, "tcp"},
-{"prizma", {NULL}, 2039, "udp"},
-{"lam", {NULL}, 2040, "tcp"},
-{"lam", {NULL}, 2040, "udp"},
-{"interbase", {NULL}, 2041, "tcp"},
-{"interbase", {NULL}, 2041, "udp"},
-{"isis", {NULL}, 2042, "tcp"},
-{"isis", {NULL}, 2042, "udp"},
-{"isis-bcast", {NULL}, 2043, "tcp"},
-{"isis-bcast", {NULL}, 2043, "udp"},
-{"rimsl", {NULL}, 2044, "tcp"},
-{"rimsl", {NULL}, 2044, "udp"},
-{"cdfunc", {NULL}, 2045, "tcp"},
-{"cdfunc", {NULL}, 2045, "udp"},
-{"sdfunc", {NULL}, 2046, "tcp"},
-{"sdfunc", {NULL}, 2046, "udp"},
-{"dls", {NULL}, 2047, "tcp"},
-{"dls", {NULL}, 2047, "udp"},
-{"dls-monitor", {NULL}, 2048, "tcp"},
-{"dls-monitor", {NULL}, 2048, "udp"},
-{"shilp", {NULL}, 2049, "tcp"},
-{"shilp", {NULL}, 2049, "udp"},
-{"nfs", {NULL}, 2049, "tcp"},
-{"nfs", {NULL}, 2049, "udp"},
-{"nfs", {NULL}, 2049, "sctp"},
-{"av-emb-config", {NULL}, 2050, "tcp"},
-{"av-emb-config", {NULL}, 2050, "udp"},
-{"epnsdp", {NULL}, 2051, "tcp"},
-{"epnsdp", {NULL}, 2051, "udp"},
-{"clearvisn", {NULL}, 2052, "tcp"},
-{"clearvisn", {NULL}, 2052, "udp"},
-{"lot105-ds-upd", {NULL}, 2053, "tcp"},
-{"lot105-ds-upd", {NULL}, 2053, "udp"},
-{"weblogin", {NULL}, 2054, "tcp"},
-{"weblogin", {NULL}, 2054, "udp"},
-{"iop", {NULL}, 2055, "tcp"},
-{"iop", {NULL}, 2055, "udp"},
-{"omnisky", {NULL}, 2056, "tcp"},
-{"omnisky", {NULL}, 2056, "udp"},
-{"rich-cp", {NULL}, 2057, "tcp"},
-{"rich-cp", {NULL}, 2057, "udp"},
-{"newwavesearch", {NULL}, 2058, "tcp"},
-{"newwavesearch", {NULL}, 2058, "udp"},
-{"bmc-messaging", {NULL}, 2059, "tcp"},
-{"bmc-messaging", {NULL}, 2059, "udp"},
-{"teleniumdaemon", {NULL}, 2060, "tcp"},
-{"teleniumdaemon", {NULL}, 2060, "udp"},
-{"netmount", {NULL}, 2061, "tcp"},
-{"netmount", {NULL}, 2061, "udp"},
-{"icg-swp", {NULL}, 2062, "tcp"},
-{"icg-swp", {NULL}, 2062, "udp"},
-{"icg-bridge", {NULL}, 2063, "tcp"},
-{"icg-bridge", {NULL}, 2063, "udp"},
-{"icg-iprelay", {NULL}, 2064, "tcp"},
-{"icg-iprelay", {NULL}, 2064, "udp"},
-{"dlsrpn", {NULL}, 2065, "tcp"},
-{"dlsrpn", {NULL}, 2065, "udp"},
-{"aura", {NULL}, 2066, "tcp"},
-{"aura", {NULL}, 2066, "udp"},
-{"dlswpn", {NULL}, 2067, "tcp"},
-{"dlswpn", {NULL}, 2067, "udp"},
-{"avauthsrvprtcl", {NULL}, 2068, "tcp"},
-{"avauthsrvprtcl", {NULL}, 2068, "udp"},
-{"event-port", {NULL}, 2069, "tcp"},
-{"event-port", {NULL}, 2069, "udp"},
-{"ah-esp-encap", {NULL}, 2070, "tcp"},
-{"ah-esp-encap", {NULL}, 2070, "udp"},
-{"acp-port", {NULL}, 2071, "tcp"},
-{"acp-port", {NULL}, 2071, "udp"},
-{"msync", {NULL}, 2072, "tcp"},
-{"msync", {NULL}, 2072, "udp"},
-{"gxs-data-port", {NULL}, 2073, "tcp"},
-{"gxs-data-port", {NULL}, 2073, "udp"},
-{"vrtl-vmf-sa", {NULL}, 2074, "tcp"},
-{"vrtl-vmf-sa", {NULL}, 2074, "udp"},
-{"newlixengine", {NULL}, 2075, "tcp"},
-{"newlixengine", {NULL}, 2075, "udp"},
-{"newlixconfig", {NULL}, 2076, "tcp"},
-{"newlixconfig", {NULL}, 2076, "udp"},
-{"tsrmagt", {NULL}, 2077, "tcp"},
-{"tsrmagt", {NULL}, 2077, "udp"},
-{"tpcsrvr", {NULL}, 2078, "tcp"},
-{"tpcsrvr", {NULL}, 2078, "udp"},
-{"idware-router", {NULL}, 2079, "tcp"},
-{"idware-router", {NULL}, 2079, "udp"},
-{"autodesk-nlm", {NULL}, 2080, "tcp"},
-{"autodesk-nlm", {NULL}, 2080, "udp"},
-{"kme-trap-port", {NULL}, 2081, "tcp"},
-{"kme-trap-port", {NULL}, 2081, "udp"},
-{"infowave", {NULL}, 2082, "tcp"},
-{"infowave", {NULL}, 2082, "udp"},
-{"radsec", {NULL}, 2083, "tcp"},
-{"radsec", {NULL}, 2083, "udp"},
-{"sunclustergeo", {NULL}, 2084, "tcp"},
-{"sunclustergeo", {NULL}, 2084, "udp"},
-{"ada-cip", {NULL}, 2085, "tcp"},
-{"ada-cip", {NULL}, 2085, "udp"},
-{"gnunet", {NULL}, 2086, "tcp"},
-{"gnunet", {NULL}, 2086, "udp"},
-{"eli", {NULL}, 2087, "tcp"},
-{"eli", {NULL}, 2087, "udp"},
-{"ip-blf", {NULL}, 2088, "tcp"},
-{"ip-blf", {NULL}, 2088, "udp"},
-{"sep", {NULL}, 2089, "tcp"},
-{"sep", {NULL}, 2089, "udp"},
-{"lrp", {NULL}, 2090, "tcp"},
-{"lrp", {NULL}, 2090, "udp"},
-{"prp", {NULL}, 2091, "tcp"},
-{"prp", {NULL}, 2091, "udp"},
-{"descent3", {NULL}, 2092, "tcp"},
-{"descent3", {NULL}, 2092, "udp"},
-{"nbx-cc", {NULL}, 2093, "tcp"},
-{"nbx-cc", {NULL}, 2093, "udp"},
-{"nbx-au", {NULL}, 2094, "tcp"},
-{"nbx-au", {NULL}, 2094, "udp"},
-{"nbx-ser", {NULL}, 2095, "tcp"},
-{"nbx-ser", {NULL}, 2095, "udp"},
-{"nbx-dir", {NULL}, 2096, "tcp"},
-{"nbx-dir", {NULL}, 2096, "udp"},
-{"jetformpreview", {NULL}, 2097, "tcp"},
-{"jetformpreview", {NULL}, 2097, "udp"},
-{"dialog-port", {NULL}, 2098, "tcp"},
-{"dialog-port", {NULL}, 2098, "udp"},
-{"h2250-annex-g", {NULL}, 2099, "tcp"},
-{"h2250-annex-g", {NULL}, 2099, "udp"},
-{"amiganetfs", {NULL}, 2100, "tcp"},
-{"amiganetfs", {NULL}, 2100, "udp"},
-{"rtcm-sc104", {NULL}, 2101, "tcp"},
-{"rtcm-sc104", {NULL}, 2101, "udp"},
-{"zephyr-srv", {NULL}, 2102, "tcp"},
-{"zephyr-srv", {NULL}, 2102, "udp"},
-{"zephyr-clt", {NULL}, 2103, "tcp"},
-{"zephyr-clt", {NULL}, 2103, "udp"},
-{"zephyr-hm", {NULL}, 2104, "tcp"},
-{"zephyr-hm", {NULL}, 2104, "udp"},
-{"minipay", {NULL}, 2105, "tcp"},
-{"minipay", {NULL}, 2105, "udp"},
-{"mzap", {NULL}, 2106, "tcp"},
-{"mzap", {NULL}, 2106, "udp"},
-{"bintec-admin", {NULL}, 2107, "tcp"},
-{"bintec-admin", {NULL}, 2107, "udp"},
-{"comcam", {NULL}, 2108, "tcp"},
-{"comcam", {NULL}, 2108, "udp"},
-{"ergolight", {NULL}, 2109, "tcp"},
-{"ergolight", {NULL}, 2109, "udp"},
-{"umsp", {NULL}, 2110, "tcp"},
-{"umsp", {NULL}, 2110, "udp"},
-{"dsatp", {NULL}, 2111, "tcp"},
-{"dsatp", {NULL}, 2111, "udp"},
-{"idonix-metanet", {NULL}, 2112, "tcp"},
-{"idonix-metanet", {NULL}, 2112, "udp"},
-{"hsl-storm", {NULL}, 2113, "tcp"},
-{"hsl-storm", {NULL}, 2113, "udp"},
-{"newheights", {NULL}, 2114, "tcp"},
-{"newheights", {NULL}, 2114, "udp"},
-{"kdm", {NULL}, 2115, "tcp"},
-{"kdm", {NULL}, 2115, "udp"},
-{"ccowcmr", {NULL}, 2116, "tcp"},
-{"ccowcmr", {NULL}, 2116, "udp"},
-{"mentaclient", {NULL}, 2117, "tcp"},
-{"mentaclient", {NULL}, 2117, "udp"},
-{"mentaserver", {NULL}, 2118, "tcp"},
-{"mentaserver", {NULL}, 2118, "udp"},
-{"gsigatekeeper", {NULL}, 2119, "tcp"},
-{"gsigatekeeper", {NULL}, 2119, "udp"},
-{"qencp", {NULL}, 2120, "tcp"},
-{"qencp", {NULL}, 2120, "udp"},
-{"scientia-ssdb", {NULL}, 2121, "tcp"},
-{"scientia-ssdb", {NULL}, 2121, "udp"},
-{"caupc-remote", {NULL}, 2122, "tcp"},
-{"caupc-remote", {NULL}, 2122, "udp"},
-{"gtp-control", {NULL}, 2123, "tcp"},
-{"gtp-control", {NULL}, 2123, "udp"},
-{"elatelink", {NULL}, 2124, "tcp"},
-{"elatelink", {NULL}, 2124, "udp"},
-{"lockstep", {NULL}, 2125, "tcp"},
-{"lockstep", {NULL}, 2125, "udp"},
-{"pktcable-cops", {NULL}, 2126, "tcp"},
-{"pktcable-cops", {NULL}, 2126, "udp"},
-{"index-pc-wb", {NULL}, 2127, "tcp"},
-{"index-pc-wb", {NULL}, 2127, "udp"},
-{"net-steward", {NULL}, 2128, "tcp"},
-{"net-steward", {NULL}, 2128, "udp"},
-{"cs-live", {NULL}, 2129, "tcp"},
-{"cs-live", {NULL}, 2129, "udp"},
-{"xds", {NULL}, 2130, "tcp"},
-{"xds", {NULL}, 2130, "udp"},
-{"avantageb2b", {NULL}, 2131, "tcp"},
-{"avantageb2b", {NULL}, 2131, "udp"},
-{"solera-epmap", {NULL}, 2132, "tcp"},
-{"solera-epmap", {NULL}, 2132, "udp"},
-{"zymed-zpp", {NULL}, 2133, "tcp"},
-{"zymed-zpp", {NULL}, 2133, "udp"},
-{"avenue", {NULL}, 2134, "tcp"},
-{"avenue", {NULL}, 2134, "udp"},
-{"gris", {NULL}, 2135, "tcp"},
-{"gris", {NULL}, 2135, "udp"},
-{"appworxsrv", {NULL}, 2136, "tcp"},
-{"appworxsrv", {NULL}, 2136, "udp"},
-{"connect", {NULL}, 2137, "tcp"},
-{"connect", {NULL}, 2137, "udp"},
-{"unbind-cluster", {NULL}, 2138, "tcp"},
-{"unbind-cluster", {NULL}, 2138, "udp"},
-{"ias-auth", {NULL}, 2139, "tcp"},
-{"ias-auth", {NULL}, 2139, "udp"},
-{"ias-reg", {NULL}, 2140, "tcp"},
-{"ias-reg", {NULL}, 2140, "udp"},
-{"ias-admind", {NULL}, 2141, "tcp"},
-{"ias-admind", {NULL}, 2141, "udp"},
-{"tdmoip", {NULL}, 2142, "tcp"},
-{"tdmoip", {NULL}, 2142, "udp"},
-{"lv-jc", {NULL}, 2143, "tcp"},
-{"lv-jc", {NULL}, 2143, "udp"},
-{"lv-ffx", {NULL}, 2144, "tcp"},
-{"lv-ffx", {NULL}, 2144, "udp"},
-{"lv-pici", {NULL}, 2145, "tcp"},
-{"lv-pici", {NULL}, 2145, "udp"},
-{"lv-not", {NULL}, 2146, "tcp"},
-{"lv-not", {NULL}, 2146, "udp"},
-{"lv-auth", {NULL}, 2147, "tcp"},
-{"lv-auth", {NULL}, 2147, "udp"},
-{"veritas-ucl", {NULL}, 2148, "tcp"},
-{"veritas-ucl", {NULL}, 2148, "udp"},
-{"acptsys", {NULL}, 2149, "tcp"},
-{"acptsys", {NULL}, 2149, "udp"},
-{"dynamic3d", {NULL}, 2150, "tcp"},
-{"dynamic3d", {NULL}, 2150, "udp"},
-{"docent", {NULL}, 2151, "tcp"},
-{"docent", {NULL}, 2151, "udp"},
-{"gtp-user", {NULL}, 2152, "tcp"},
-{"gtp-user", {NULL}, 2152, "udp"},
-{"ctlptc", {NULL}, 2153, "tcp"},
-{"ctlptc", {NULL}, 2153, "udp"},
-{"stdptc", {NULL}, 2154, "tcp"},
-{"stdptc", {NULL}, 2154, "udp"},
-{"brdptc", {NULL}, 2155, "tcp"},
-{"brdptc", {NULL}, 2155, "udp"},
-{"trp", {NULL}, 2156, "tcp"},
-{"trp", {NULL}, 2156, "udp"},
-{"xnds", {NULL}, 2157, "tcp"},
-{"xnds", {NULL}, 2157, "udp"},
-{"touchnetplus", {NULL}, 2158, "tcp"},
-{"touchnetplus", {NULL}, 2158, "udp"},
-{"gdbremote", {NULL}, 2159, "tcp"},
-{"gdbremote", {NULL}, 2159, "udp"},
-{"apc-2160", {NULL}, 2160, "tcp"},
-{"apc-2160", {NULL}, 2160, "udp"},
-{"apc-2161", {NULL}, 2161, "tcp"},
-{"apc-2161", {NULL}, 2161, "udp"},
-{"navisphere", {NULL}, 2162, "tcp"},
-{"navisphere", {NULL}, 2162, "udp"},
-{"navisphere-sec", {NULL}, 2163, "tcp"},
-{"navisphere-sec", {NULL}, 2163, "udp"},
-{"ddns-v3", {NULL}, 2164, "tcp"},
-{"ddns-v3", {NULL}, 2164, "udp"},
-{"x-bone-api", {NULL}, 2165, "tcp"},
-{"x-bone-api", {NULL}, 2165, "udp"},
-{"iwserver", {NULL}, 2166, "tcp"},
-{"iwserver", {NULL}, 2166, "udp"},
-{"raw-serial", {NULL}, 2167, "tcp"},
-{"raw-serial", {NULL}, 2167, "udp"},
-{"easy-soft-mux", {NULL}, 2168, "tcp"},
-{"easy-soft-mux", {NULL}, 2168, "udp"},
-{"brain", {NULL}, 2169, "tcp"},
-{"brain", {NULL}, 2169, "udp"},
-{"eyetv", {NULL}, 2170, "tcp"},
-{"eyetv", {NULL}, 2170, "udp"},
-{"msfw-storage", {NULL}, 2171, "tcp"},
-{"msfw-storage", {NULL}, 2171, "udp"},
-{"msfw-s-storage", {NULL}, 2172, "tcp"},
-{"msfw-s-storage", {NULL}, 2172, "udp"},
-{"msfw-replica", {NULL}, 2173, "tcp"},
-{"msfw-replica", {NULL}, 2173, "udp"},
-{"msfw-array", {NULL}, 2174, "tcp"},
-{"msfw-array", {NULL}, 2174, "udp"},
-{"airsync", {NULL}, 2175, "tcp"},
-{"airsync", {NULL}, 2175, "udp"},
-{"rapi", {NULL}, 2176, "tcp"},
-{"rapi", {NULL}, 2176, "udp"},
-{"qwave", {NULL}, 2177, "tcp"},
-{"qwave", {NULL}, 2177, "udp"},
-{"bitspeer", {NULL}, 2178, "tcp"},
-{"bitspeer", {NULL}, 2178, "udp"},
-{"vmrdp", {NULL}, 2179, "tcp"},
-{"vmrdp", {NULL}, 2179, "udp"},
-{"mc-gt-srv", {NULL}, 2180, "tcp"},
-{"mc-gt-srv", {NULL}, 2180, "udp"},
-{"eforward", {NULL}, 2181, "tcp"},
-{"eforward", {NULL}, 2181, "udp"},
-{"cgn-stat", {NULL}, 2182, "tcp"},
-{"cgn-stat", {NULL}, 2182, "udp"},
-{"cgn-config", {NULL}, 2183, "tcp"},
-{"cgn-config", {NULL}, 2183, "udp"},
-{"nvd", {NULL}, 2184, "tcp"},
-{"nvd", {NULL}, 2184, "udp"},
-{"onbase-dds", {NULL}, 2185, "tcp"},
-{"onbase-dds", {NULL}, 2185, "udp"},
-{"gtaua", {NULL}, 2186, "tcp"},
-{"gtaua", {NULL}, 2186, "udp"},
-{"ssmc", {NULL}, 2187, "tcp"},
-{"ssmd", {NULL}, 2187, "udp"},
-{"tivoconnect", {NULL}, 2190, "tcp"},
-{"tivoconnect", {NULL}, 2190, "udp"},
-{"tvbus", {NULL}, 2191, "tcp"},
-{"tvbus", {NULL}, 2191, "udp"},
-{"asdis", {NULL}, 2192, "tcp"},
-{"asdis", {NULL}, 2192, "udp"},
-{"drwcs", {NULL}, 2193, "tcp"},
-{"drwcs", {NULL}, 2193, "udp"},
-{"mnp-exchange", {NULL}, 2197, "tcp"},
-{"mnp-exchange", {NULL}, 2197, "udp"},
-{"onehome-remote", {NULL}, 2198, "tcp"},
-{"onehome-remote", {NULL}, 2198, "udp"},
-{"onehome-help", {NULL}, 2199, "tcp"},
-{"onehome-help", {NULL}, 2199, "udp"},
-{"ici", {NULL}, 2200, "tcp"},
-{"ici", {NULL}, 2200, "udp"},
-{"ats", {NULL}, 2201, "tcp"},
-{"ats", {NULL}, 2201, "udp"},
-{"imtc-map", {NULL}, 2202, "tcp"},
-{"imtc-map", {NULL}, 2202, "udp"},
-{"b2-runtime", {NULL}, 2203, "tcp"},
-{"b2-runtime", {NULL}, 2203, "udp"},
-{"b2-license", {NULL}, 2204, "tcp"},
-{"b2-license", {NULL}, 2204, "udp"},
-{"jps", {NULL}, 2205, "tcp"},
-{"jps", {NULL}, 2205, "udp"},
-{"hpocbus", {NULL}, 2206, "tcp"},
-{"hpocbus", {NULL}, 2206, "udp"},
-{"hpssd", {NULL}, 2207, "tcp"},
-{"hpssd", {NULL}, 2207, "udp"},
-{"hpiod", {NULL}, 2208, "tcp"},
-{"hpiod", {NULL}, 2208, "udp"},
-{"rimf-ps", {NULL}, 2209, "tcp"},
-{"rimf-ps", {NULL}, 2209, "udp"},
-{"noaaport", {NULL}, 2210, "tcp"},
-{"noaaport", {NULL}, 2210, "udp"},
-{"emwin", {NULL}, 2211, "tcp"},
-{"emwin", {NULL}, 2211, "udp"},
-{"leecoposserver", {NULL}, 2212, "tcp"},
-{"leecoposserver", {NULL}, 2212, "udp"},
-{"kali", {NULL}, 2213, "tcp"},
-{"kali", {NULL}, 2213, "udp"},
-{"rpi", {NULL}, 2214, "tcp"},
-{"rpi", {NULL}, 2214, "udp"},
-{"ipcore", {NULL}, 2215, "tcp"},
-{"ipcore", {NULL}, 2215, "udp"},
-{"vtu-comms", {NULL}, 2216, "tcp"},
-{"vtu-comms", {NULL}, 2216, "udp"},
-{"gotodevice", {NULL}, 2217, "tcp"},
-{"gotodevice", {NULL}, 2217, "udp"},
-{"bounzza", {NULL}, 2218, "tcp"},
-{"bounzza", {NULL}, 2218, "udp"},
-{"netiq-ncap", {NULL}, 2219, "tcp"},
-{"netiq-ncap", {NULL}, 2219, "udp"},
-{"netiq", {NULL}, 2220, "tcp"},
-{"netiq", {NULL}, 2220, "udp"},
-{"rockwell-csp1", {NULL}, 2221, "tcp"},
-{"rockwell-csp1", {NULL}, 2221, "udp"},
-{"EtherNet/IP-1", {NULL}, 2222, "tcp"},
-{"EtherNet/IP-1", {NULL}, 2222, "udp"},
-{"rockwell-csp2", {NULL}, 2223, "tcp"},
-{"rockwell-csp2", {NULL}, 2223, "udp"},
-{"efi-mg", {NULL}, 2224, "tcp"},
-{"efi-mg", {NULL}, 2224, "udp"},
-{"rcip-itu", {NULL}, 2225, "tcp"},
-{"rcip-itu", {NULL}, 2225, "sctp"},
-{"di-drm", {NULL}, 2226, "tcp"},
-{"di-drm", {NULL}, 2226, "udp"},
-{"di-msg", {NULL}, 2227, "tcp"},
-{"di-msg", {NULL}, 2227, "udp"},
-{"ehome-ms", {NULL}, 2228, "tcp"},
-{"ehome-ms", {NULL}, 2228, "udp"},
-{"datalens", {NULL}, 2229, "tcp"},
-{"datalens", {NULL}, 2229, "udp"},
-{"queueadm", {NULL}, 2230, "tcp"},
-{"queueadm", {NULL}, 2230, "udp"},
-{"wimaxasncp", {NULL}, 2231, "tcp"},
-{"wimaxasncp", {NULL}, 2231, "udp"},
-{"ivs-video", {NULL}, 2232, "tcp"},
-{"ivs-video", {NULL}, 2232, "udp"},
-{"infocrypt", {NULL}, 2233, "tcp"},
-{"infocrypt", {NULL}, 2233, "udp"},
-{"directplay", {NULL}, 2234, "tcp"},
-{"directplay", {NULL}, 2234, "udp"},
-{"sercomm-wlink", {NULL}, 2235, "tcp"},
-{"sercomm-wlink", {NULL}, 2235, "udp"},
-{"nani", {NULL}, 2236, "tcp"},
-{"nani", {NULL}, 2236, "udp"},
-{"optech-port1-lm", {NULL}, 2237, "tcp"},
-{"optech-port1-lm", {NULL}, 2237, "udp"},
-{"aviva-sna", {NULL}, 2238, "tcp"},
-{"aviva-sna", {NULL}, 2238, "udp"},
-{"imagequery", {NULL}, 2239, "tcp"},
-{"imagequery", {NULL}, 2239, "udp"},
-{"recipe", {NULL}, 2240, "tcp"},
-{"recipe", {NULL}, 2240, "udp"},
-{"ivsd", {NULL}, 2241, "tcp"},
-{"ivsd", {NULL}, 2241, "udp"},
-{"foliocorp", {NULL}, 2242, "tcp"},
-{"foliocorp", {NULL}, 2242, "udp"},
-{"magicom", {NULL}, 2243, "tcp"},
-{"magicom", {NULL}, 2243, "udp"},
-{"nmsserver", {NULL}, 2244, "tcp"},
-{"nmsserver", {NULL}, 2244, "udp"},
-{"hao", {NULL}, 2245, "tcp"},
-{"hao", {NULL}, 2245, "udp"},
-{"pc-mta-addrmap", {NULL}, 2246, "tcp"},
-{"pc-mta-addrmap", {NULL}, 2246, "udp"},
-{"antidotemgrsvr", {NULL}, 2247, "tcp"},
-{"antidotemgrsvr", {NULL}, 2247, "udp"},
-{"ums", {NULL}, 2248, "tcp"},
-{"ums", {NULL}, 2248, "udp"},
-{"rfmp", {NULL}, 2249, "tcp"},
-{"rfmp", {NULL}, 2249, "udp"},
-{"remote-collab", {NULL}, 2250, "tcp"},
-{"remote-collab", {NULL}, 2250, "udp"},
-{"dif-port", {NULL}, 2251, "tcp"},
-{"dif-port", {NULL}, 2251, "udp"},
-{"njenet-ssl", {NULL}, 2252, "tcp"},
-{"njenet-ssl", {NULL}, 2252, "udp"},
-{"dtv-chan-req", {NULL}, 2253, "tcp"},
-{"dtv-chan-req", {NULL}, 2253, "udp"},
-{"seispoc", {NULL}, 2254, "tcp"},
-{"seispoc", {NULL}, 2254, "udp"},
-{"vrtp", {NULL}, 2255, "tcp"},
-{"vrtp", {NULL}, 2255, "udp"},
-{"pcc-mfp", {NULL}, 2256, "tcp"},
-{"pcc-mfp", {NULL}, 2256, "udp"},
-{"simple-tx-rx", {NULL}, 2257, "tcp"},
-{"simple-tx-rx", {NULL}, 2257, "udp"},
-{"rcts", {NULL}, 2258, "tcp"},
-{"rcts", {NULL}, 2258, "udp"},
-{"acd-pm", {NULL}, 2259, "tcp"},
-{"acd-pm", {NULL}, 2259, "udp"},
-{"apc-2260", {NULL}, 2260, "tcp"},
-{"apc-2260", {NULL}, 2260, "udp"},
-{"comotionmaster", {NULL}, 2261, "tcp"},
-{"comotionmaster", {NULL}, 2261, "udp"},
-{"comotionback", {NULL}, 2262, "tcp"},
-{"comotionback", {NULL}, 2262, "udp"},
-{"ecwcfg", {NULL}, 2263, "tcp"},
-{"ecwcfg", {NULL}, 2263, "udp"},
-{"apx500api-1", {NULL}, 2264, "tcp"},
-{"apx500api-1", {NULL}, 2264, "udp"},
-{"apx500api-2", {NULL}, 2265, "tcp"},
-{"apx500api-2", {NULL}, 2265, "udp"},
-{"mfserver", {NULL}, 2266, "tcp"},
-{"mfserver", {NULL}, 2266, "udp"},
-{"ontobroker", {NULL}, 2267, "tcp"},
-{"ontobroker", {NULL}, 2267, "udp"},
-{"amt", {NULL}, 2268, "tcp"},
-{"amt", {NULL}, 2268, "udp"},
-{"mikey", {NULL}, 2269, "tcp"},
-{"mikey", {NULL}, 2269, "udp"},
-{"starschool", {NULL}, 2270, "tcp"},
-{"starschool", {NULL}, 2270, "udp"},
-{"mmcals", {NULL}, 2271, "tcp"},
-{"mmcals", {NULL}, 2271, "udp"},
-{"mmcal", {NULL}, 2272, "tcp"},
-{"mmcal", {NULL}, 2272, "udp"},
-{"mysql-im", {NULL}, 2273, "tcp"},
-{"mysql-im", {NULL}, 2273, "udp"},
-{"pcttunnell", {NULL}, 2274, "tcp"},
-{"pcttunnell", {NULL}, 2274, "udp"},
-{"ibridge-data", {NULL}, 2275, "tcp"},
-{"ibridge-data", {NULL}, 2275, "udp"},
-{"ibridge-mgmt", {NULL}, 2276, "tcp"},
-{"ibridge-mgmt", {NULL}, 2276, "udp"},
-{"bluectrlproxy", {NULL}, 2277, "tcp"},
-{"bluectrlproxy", {NULL}, 2277, "udp"},
-{"s3db", {NULL}, 2278, "tcp"},
-{"s3db", {NULL}, 2278, "udp"},
-{"xmquery", {NULL}, 2279, "tcp"},
-{"xmquery", {NULL}, 2279, "udp"},
-{"lnvpoller", {NULL}, 2280, "tcp"},
-{"lnvpoller", {NULL}, 2280, "udp"},
-{"lnvconsole", {NULL}, 2281, "tcp"},
-{"lnvconsole", {NULL}, 2281, "udp"},
-{"lnvalarm", {NULL}, 2282, "tcp"},
-{"lnvalarm", {NULL}, 2282, "udp"},
-{"lnvstatus", {NULL}, 2283, "tcp"},
-{"lnvstatus", {NULL}, 2283, "udp"},
-{"lnvmaps", {NULL}, 2284, "tcp"},
-{"lnvmaps", {NULL}, 2284, "udp"},
-{"lnvmailmon", {NULL}, 2285, "tcp"},
-{"lnvmailmon", {NULL}, 2285, "udp"},
-{"nas-metering", {NULL}, 2286, "tcp"},
-{"nas-metering", {NULL}, 2286, "udp"},
-{"dna", {NULL}, 2287, "tcp"},
-{"dna", {NULL}, 2287, "udp"},
-{"netml", {NULL}, 2288, "tcp"},
-{"netml", {NULL}, 2288, "udp"},
-{"dict-lookup", {NULL}, 2289, "tcp"},
-{"dict-lookup", {NULL}, 2289, "udp"},
-{"sonus-logging", {NULL}, 2290, "tcp"},
-{"sonus-logging", {NULL}, 2290, "udp"},
-{"eapsp", {NULL}, 2291, "tcp"},
-{"eapsp", {NULL}, 2291, "udp"},
-{"mib-streaming", {NULL}, 2292, "tcp"},
-{"mib-streaming", {NULL}, 2292, "udp"},
-{"npdbgmngr", {NULL}, 2293, "tcp"},
-{"npdbgmngr", {NULL}, 2293, "udp"},
-{"konshus-lm", {NULL}, 2294, "tcp"},
-{"konshus-lm", {NULL}, 2294, "udp"},
-{"advant-lm", {NULL}, 2295, "tcp"},
-{"advant-lm", {NULL}, 2295, "udp"},
-{"theta-lm", {NULL}, 2296, "tcp"},
-{"theta-lm", {NULL}, 2296, "udp"},
-{"d2k-datamover1", {NULL}, 2297, "tcp"},
-{"d2k-datamover1", {NULL}, 2297, "udp"},
-{"d2k-datamover2", {NULL}, 2298, "tcp"},
-{"d2k-datamover2", {NULL}, 2298, "udp"},
-{"pc-telecommute", {NULL}, 2299, "tcp"},
-{"pc-telecommute", {NULL}, 2299, "udp"},
-{"cvmmon", {NULL}, 2300, "tcp"},
-{"cvmmon", {NULL}, 2300, "udp"},
-{"cpq-wbem", {NULL}, 2301, "tcp"},
-{"cpq-wbem", {NULL}, 2301, "udp"},
-{"binderysupport", {NULL}, 2302, "tcp"},
-{"binderysupport", {NULL}, 2302, "udp"},
-{"proxy-gateway", {NULL}, 2303, "tcp"},
-{"proxy-gateway", {NULL}, 2303, "udp"},
-{"attachmate-uts", {NULL}, 2304, "tcp"},
-{"attachmate-uts", {NULL}, 2304, "udp"},
-{"mt-scaleserver", {NULL}, 2305, "tcp"},
-{"mt-scaleserver", {NULL}, 2305, "udp"},
-{"tappi-boxnet", {NULL}, 2306, "tcp"},
-{"tappi-boxnet", {NULL}, 2306, "udp"},
-{"pehelp", {NULL}, 2307, "tcp"},
-{"pehelp", {NULL}, 2307, "udp"},
-{"sdhelp", {NULL}, 2308, "tcp"},
-{"sdhelp", {NULL}, 2308, "udp"},
-{"sdserver", {NULL}, 2309, "tcp"},
-{"sdserver", {NULL}, 2309, "udp"},
-{"sdclient", {NULL}, 2310, "tcp"},
-{"sdclient", {NULL}, 2310, "udp"},
-{"messageservice", {NULL}, 2311, "tcp"},
-{"messageservice", {NULL}, 2311, "udp"},
-{"wanscaler", {NULL}, 2312, "tcp"},
-{"wanscaler", {NULL}, 2312, "udp"},
-{"iapp", {NULL}, 2313, "tcp"},
-{"iapp", {NULL}, 2313, "udp"},
-{"cr-websystems", {NULL}, 2314, "tcp"},
-{"cr-websystems", {NULL}, 2314, "udp"},
-{"precise-sft", {NULL}, 2315, "tcp"},
-{"precise-sft", {NULL}, 2315, "udp"},
-{"sent-lm", {NULL}, 2316, "tcp"},
-{"sent-lm", {NULL}, 2316, "udp"},
-{"attachmate-g32", {NULL}, 2317, "tcp"},
-{"attachmate-g32", {NULL}, 2317, "udp"},
-{"cadencecontrol", {NULL}, 2318, "tcp"},
-{"cadencecontrol", {NULL}, 2318, "udp"},
-{"infolibria", {NULL}, 2319, "tcp"},
-{"infolibria", {NULL}, 2319, "udp"},
-{"siebel-ns", {NULL}, 2320, "tcp"},
-{"siebel-ns", {NULL}, 2320, "udp"},
-{"rdlap", {NULL}, 2321, "tcp"},
-{"rdlap", {NULL}, 2321, "udp"},
-{"ofsd", {NULL}, 2322, "tcp"},
-{"ofsd", {NULL}, 2322, "udp"},
-{"3d-nfsd", {NULL}, 2323, "tcp"},
-{"3d-nfsd", {NULL}, 2323, "udp"},
-{"cosmocall", {NULL}, 2324, "tcp"},
-{"cosmocall", {NULL}, 2324, "udp"},
-{"ansysli", {NULL}, 2325, "tcp"},
-{"ansysli", {NULL}, 2325, "udp"},
-{"idcp", {NULL}, 2326, "tcp"},
-{"idcp", {NULL}, 2326, "udp"},
-{"xingcsm", {NULL}, 2327, "tcp"},
-{"xingcsm", {NULL}, 2327, "udp"},
-{"netrix-sftm", {NULL}, 2328, "tcp"},
-{"netrix-sftm", {NULL}, 2328, "udp"},
-{"nvd", {NULL}, 2329, "tcp"},
-{"nvd", {NULL}, 2329, "udp"},
-{"tscchat", {NULL}, 2330, "tcp"},
-{"tscchat", {NULL}, 2330, "udp"},
-{"agentview", {NULL}, 2331, "tcp"},
-{"agentview", {NULL}, 2331, "udp"},
-{"rcc-host", {NULL}, 2332, "tcp"},
-{"rcc-host", {NULL}, 2332, "udp"},
-{"snapp", {NULL}, 2333, "tcp"},
-{"snapp", {NULL}, 2333, "udp"},
-{"ace-client", {NULL}, 2334, "tcp"},
-{"ace-client", {NULL}, 2334, "udp"},
-{"ace-proxy", {NULL}, 2335, "tcp"},
-{"ace-proxy", {NULL}, 2335, "udp"},
-{"appleugcontrol", {NULL}, 2336, "tcp"},
-{"appleugcontrol", {NULL}, 2336, "udp"},
-{"ideesrv", {NULL}, 2337, "tcp"},
-{"ideesrv", {NULL}, 2337, "udp"},
-{"norton-lambert", {NULL}, 2338, "tcp"},
-{"norton-lambert", {NULL}, 2338, "udp"},
-{"3com-webview", {NULL}, 2339, "tcp"},
-{"3com-webview", {NULL}, 2339, "udp"},
-{"wrs_registry", {NULL}, 2340, "tcp"},
-{"wrs_registry", {NULL}, 2340, "udp"},
-{"xiostatus", {NULL}, 2341, "tcp"},
-{"xiostatus", {NULL}, 2341, "udp"},
-{"manage-exec", {NULL}, 2342, "tcp"},
-{"manage-exec", {NULL}, 2342, "udp"},
-{"nati-logos", {NULL}, 2343, "tcp"},
-{"nati-logos", {NULL}, 2343, "udp"},
-{"fcmsys", {NULL}, 2344, "tcp"},
-{"fcmsys", {NULL}, 2344, "udp"},
-{"dbm", {NULL}, 2345, "tcp"},
-{"dbm", {NULL}, 2345, "udp"},
-{"redstorm_join", {NULL}, 2346, "tcp"},
-{"redstorm_join", {NULL}, 2346, "udp"},
-{"redstorm_find", {NULL}, 2347, "tcp"},
-{"redstorm_find", {NULL}, 2347, "udp"},
-{"redstorm_info", {NULL}, 2348, "tcp"},
-{"redstorm_info", {NULL}, 2348, "udp"},
-{"redstorm_diag", {NULL}, 2349, "tcp"},
-{"redstorm_diag", {NULL}, 2349, "udp"},
-{"psbserver", {NULL}, 2350, "tcp"},
-{"psbserver", {NULL}, 2350, "udp"},
-{"psrserver", {NULL}, 2351, "tcp"},
-{"psrserver", {NULL}, 2351, "udp"},
-{"pslserver", {NULL}, 2352, "tcp"},
-{"pslserver", {NULL}, 2352, "udp"},
-{"pspserver", {NULL}, 2353, "tcp"},
-{"pspserver", {NULL}, 2353, "udp"},
-{"psprserver", {NULL}, 2354, "tcp"},
-{"psprserver", {NULL}, 2354, "udp"},
-{"psdbserver", {NULL}, 2355, "tcp"},
-{"psdbserver", {NULL}, 2355, "udp"},
-{"gxtelmd", {NULL}, 2356, "tcp"},
-{"gxtelmd", {NULL}, 2356, "udp"},
-{"unihub-server", {NULL}, 2357, "tcp"},
-{"unihub-server", {NULL}, 2357, "udp"},
-{"futrix", {NULL}, 2358, "tcp"},
-{"futrix", {NULL}, 2358, "udp"},
-{"flukeserver", {NULL}, 2359, "tcp"},
-{"flukeserver", {NULL}, 2359, "udp"},
-{"nexstorindltd", {NULL}, 2360, "tcp"},
-{"nexstorindltd", {NULL}, 2360, "udp"},
-{"tl1", {NULL}, 2361, "tcp"},
-{"tl1", {NULL}, 2361, "udp"},
-{"digiman", {NULL}, 2362, "tcp"},
-{"digiman", {NULL}, 2362, "udp"},
-{"mediacntrlnfsd", {NULL}, 2363, "tcp"},
-{"mediacntrlnfsd", {NULL}, 2363, "udp"},
-{"oi-2000", {NULL}, 2364, "tcp"},
-{"oi-2000", {NULL}, 2364, "udp"},
-{"dbref", {NULL}, 2365, "tcp"},
-{"dbref", {NULL}, 2365, "udp"},
-{"qip-login", {NULL}, 2366, "tcp"},
-{"qip-login", {NULL}, 2366, "udp"},
-{"service-ctrl", {NULL}, 2367, "tcp"},
-{"service-ctrl", {NULL}, 2367, "udp"},
-{"opentable", {NULL}, 2368, "tcp"},
-{"opentable", {NULL}, 2368, "udp"},
-{"l3-hbmon", {NULL}, 2370, "tcp"},
-{"l3-hbmon", {NULL}, 2370, "udp"},
-{"worldwire", {NULL}, 2371, "tcp"},
-{"worldwire", {NULL}, 2371, "udp"},
-{"lanmessenger", {NULL}, 2372, "tcp"},
-{"lanmessenger", {NULL}, 2372, "udp"},
-{"remographlm", {NULL}, 2373, "tcp"},
-{"hydra", {NULL}, 2374, "tcp"},
-{"compaq-https", {NULL}, 2381, "tcp"},
-{"compaq-https", {NULL}, 2381, "udp"},
-{"ms-olap3", {NULL}, 2382, "tcp"},
-{"ms-olap3", {NULL}, 2382, "udp"},
-{"ms-olap4", {NULL}, 2383, "tcp"},
-{"ms-olap4", {NULL}, 2383, "udp"},
-{"sd-request", {NULL}, 2384, "tcp"},
-{"sd-capacity", {NULL}, 2384, "udp"},
-{"sd-data", {NULL}, 2385, "tcp"},
-{"sd-data", {NULL}, 2385, "udp"},
-{"virtualtape", {NULL}, 2386, "tcp"},
-{"virtualtape", {NULL}, 2386, "udp"},
-{"vsamredirector", {NULL}, 2387, "tcp"},
-{"vsamredirector", {NULL}, 2387, "udp"},
-{"mynahautostart", {NULL}, 2388, "tcp"},
-{"mynahautostart", {NULL}, 2388, "udp"},
-{"ovsessionmgr", {NULL}, 2389, "tcp"},
-{"ovsessionmgr", {NULL}, 2389, "udp"},
-{"rsmtp", {NULL}, 2390, "tcp"},
-{"rsmtp", {NULL}, 2390, "udp"},
-{"3com-net-mgmt", {NULL}, 2391, "tcp"},
-{"3com-net-mgmt", {NULL}, 2391, "udp"},
-{"tacticalauth", {NULL}, 2392, "tcp"},
-{"tacticalauth", {NULL}, 2392, "udp"},
-{"ms-olap1", {NULL}, 2393, "tcp"},
-{"ms-olap1", {NULL}, 2393, "udp"},
-{"ms-olap2", {NULL}, 2394, "tcp"},
-{"ms-olap2", {NULL}, 2394, "udp"},
-{"lan900_remote", {NULL}, 2395, "tcp"},
-{"lan900_remote", {NULL}, 2395, "udp"},
-{"wusage", {NULL}, 2396, "tcp"},
-{"wusage", {NULL}, 2396, "udp"},
-{"ncl", {NULL}, 2397, "tcp"},
-{"ncl", {NULL}, 2397, "udp"},
-{"orbiter", {NULL}, 2398, "tcp"},
-{"orbiter", {NULL}, 2398, "udp"},
-{"fmpro-fdal", {NULL}, 2399, "tcp"},
-{"fmpro-fdal", {NULL}, 2399, "udp"},
-{"opequus-server", {NULL}, 2400, "tcp"},
-{"opequus-server", {NULL}, 2400, "udp"},
-{"cvspserver", {NULL}, 2401, "tcp"},
-{"cvspserver", {NULL}, 2401, "udp"},
-{"taskmaster2000", {NULL}, 2402, "tcp"},
-{"taskmaster2000", {NULL}, 2402, "udp"},
-{"taskmaster2000", {NULL}, 2403, "tcp"},
-{"taskmaster2000", {NULL}, 2403, "udp"},
-{"iec-104", {NULL}, 2404, "tcp"},
-{"iec-104", {NULL}, 2404, "udp"},
-{"trc-netpoll", {NULL}, 2405, "tcp"},
-{"trc-netpoll", {NULL}, 2405, "udp"},
-{"jediserver", {NULL}, 2406, "tcp"},
-{"jediserver", {NULL}, 2406, "udp"},
-{"orion", {NULL}, 2407, "tcp"},
-{"orion", {NULL}, 2407, "udp"},
-{"optimanet", {NULL}, 2408, "tcp"},
-{"optimanet", {NULL}, 2408, "udp"},
-{"sns-protocol", {NULL}, 2409, "tcp"},
-{"sns-protocol", {NULL}, 2409, "udp"},
-{"vrts-registry", {NULL}, 2410, "tcp"},
-{"vrts-registry", {NULL}, 2410, "udp"},
-{"netwave-ap-mgmt", {NULL}, 2411, "tcp"},
-{"netwave-ap-mgmt", {NULL}, 2411, "udp"},
-{"cdn", {NULL}, 2412, "tcp"},
-{"cdn", {NULL}, 2412, "udp"},
-{"orion-rmi-reg", {NULL}, 2413, "tcp"},
-{"orion-rmi-reg", {NULL}, 2413, "udp"},
-{"beeyond", {NULL}, 2414, "tcp"},
-{"beeyond", {NULL}, 2414, "udp"},
-{"codima-rtp", {NULL}, 2415, "tcp"},
-{"codima-rtp", {NULL}, 2415, "udp"},
-{"rmtserver", {NULL}, 2416, "tcp"},
-{"rmtserver", {NULL}, 2416, "udp"},
-{"composit-server", {NULL}, 2417, "tcp"},
-{"composit-server", {NULL}, 2417, "udp"},
-{"cas", {NULL}, 2418, "tcp"},
-{"cas", {NULL}, 2418, "udp"},
-{"attachmate-s2s", {NULL}, 2419, "tcp"},
-{"attachmate-s2s", {NULL}, 2419, "udp"},
-{"dslremote-mgmt", {NULL}, 2420, "tcp"},
-{"dslremote-mgmt", {NULL}, 2420, "udp"},
-{"g-talk", {NULL}, 2421, "tcp"},
-{"g-talk", {NULL}, 2421, "udp"},
-{"crmsbits", {NULL}, 2422, "tcp"},
-{"crmsbits", {NULL}, 2422, "udp"},
-{"rnrp", {NULL}, 2423, "tcp"},
-{"rnrp", {NULL}, 2423, "udp"},
-{"kofax-svr", {NULL}, 2424, "tcp"},
-{"kofax-svr", {NULL}, 2424, "udp"},
-{"fjitsuappmgr", {NULL}, 2425, "tcp"},
-{"fjitsuappmgr", {NULL}, 2425, "udp"},
-{"mgcp-gateway", {NULL}, 2427, "tcp"},
-{"mgcp-gateway", {NULL}, 2427, "udp"},
-{"ott", {NULL}, 2428, "tcp"},
-{"ott", {NULL}, 2428, "udp"},
-{"ft-role", {NULL}, 2429, "tcp"},
-{"ft-role", {NULL}, 2429, "udp"},
-{"venus", {NULL}, 2430, "tcp"},
-{"venus", {NULL}, 2430, "udp"},
-{"venus-se", {NULL}, 2431, "tcp"},
-{"venus-se", {NULL}, 2431, "udp"},
-{"codasrv", {NULL}, 2432, "tcp"},
-{"codasrv", {NULL}, 2432, "udp"},
-{"codasrv-se", {NULL}, 2433, "tcp"},
-{"codasrv-se", {NULL}, 2433, "udp"},
-{"pxc-epmap", {NULL}, 2434, "tcp"},
-{"pxc-epmap", {NULL}, 2434, "udp"},
-{"optilogic", {NULL}, 2435, "tcp"},
-{"optilogic", {NULL}, 2435, "udp"},
-{"topx", {NULL}, 2436, "tcp"},
-{"topx", {NULL}, 2436, "udp"},
-{"unicontrol", {NULL}, 2437, "tcp"},
-{"unicontrol", {NULL}, 2437, "udp"},
-{"msp", {NULL}, 2438, "tcp"},
-{"msp", {NULL}, 2438, "udp"},
-{"sybasedbsynch", {NULL}, 2439, "tcp"},
-{"sybasedbsynch", {NULL}, 2439, "udp"},
-{"spearway", {NULL}, 2440, "tcp"},
-{"spearway", {NULL}, 2440, "udp"},
-{"pvsw-inet", {NULL}, 2441, "tcp"},
-{"pvsw-inet", {NULL}, 2441, "udp"},
-{"netangel", {NULL}, 2442, "tcp"},
-{"netangel", {NULL}, 2442, "udp"},
-{"powerclientcsf", {NULL}, 2443, "tcp"},
-{"powerclientcsf", {NULL}, 2443, "udp"},
-{"btpp2sectrans", {NULL}, 2444, "tcp"},
-{"btpp2sectrans", {NULL}, 2444, "udp"},
-{"dtn1", {NULL}, 2445, "tcp"},
-{"dtn1", {NULL}, 2445, "udp"},
-{"bues_service", {NULL}, 2446, "tcp"},
-{"bues_service", {NULL}, 2446, "udp"},
-{"ovwdb", {NULL}, 2447, "tcp"},
-{"ovwdb", {NULL}, 2447, "udp"},
-{"hpppssvr", {NULL}, 2448, "tcp"},
-{"hpppssvr", {NULL}, 2448, "udp"},
-{"ratl", {NULL}, 2449, "tcp"},
-{"ratl", {NULL}, 2449, "udp"},
-{"netadmin", {NULL}, 2450, "tcp"},
-{"netadmin", {NULL}, 2450, "udp"},
-{"netchat", {NULL}, 2451, "tcp"},
-{"netchat", {NULL}, 2451, "udp"},
-{"snifferclient", {NULL}, 2452, "tcp"},
-{"snifferclient", {NULL}, 2452, "udp"},
-{"madge-ltd", {NULL}, 2453, "tcp"},
-{"madge-ltd", {NULL}, 2453, "udp"},
-{"indx-dds", {NULL}, 2454, "tcp"},
-{"indx-dds", {NULL}, 2454, "udp"},
-{"wago-io-system", {NULL}, 2455, "tcp"},
-{"wago-io-system", {NULL}, 2455, "udp"},
-{"altav-remmgt", {NULL}, 2456, "tcp"},
-{"altav-remmgt", {NULL}, 2456, "udp"},
-{"rapido-ip", {NULL}, 2457, "tcp"},
-{"rapido-ip", {NULL}, 2457, "udp"},
-{"griffin", {NULL}, 2458, "tcp"},
-{"griffin", {NULL}, 2458, "udp"},
-{"community", {NULL}, 2459, "tcp"},
-{"community", {NULL}, 2459, "udp"},
-{"ms-theater", {NULL}, 2460, "tcp"},
-{"ms-theater", {NULL}, 2460, "udp"},
-{"qadmifoper", {NULL}, 2461, "tcp"},
-{"qadmifoper", {NULL}, 2461, "udp"},
-{"qadmifevent", {NULL}, 2462, "tcp"},
-{"qadmifevent", {NULL}, 2462, "udp"},
-{"lsi-raid-mgmt", {NULL}, 2463, "tcp"},
-{"lsi-raid-mgmt", {NULL}, 2463, "udp"},
-{"direcpc-si", {NULL}, 2464, "tcp"},
-{"direcpc-si", {NULL}, 2464, "udp"},
-{"lbm", {NULL}, 2465, "tcp"},
-{"lbm", {NULL}, 2465, "udp"},
-{"lbf", {NULL}, 2466, "tcp"},
-{"lbf", {NULL}, 2466, "udp"},
-{"high-criteria", {NULL}, 2467, "tcp"},
-{"high-criteria", {NULL}, 2467, "udp"},
-{"qip-msgd", {NULL}, 2468, "tcp"},
-{"qip-msgd", {NULL}, 2468, "udp"},
-{"mti-tcs-comm", {NULL}, 2469, "tcp"},
-{"mti-tcs-comm", {NULL}, 2469, "udp"},
-{"taskman-port", {NULL}, 2470, "tcp"},
-{"taskman-port", {NULL}, 2470, "udp"},
-{"seaodbc", {NULL}, 2471, "tcp"},
-{"seaodbc", {NULL}, 2471, "udp"},
-{"c3", {NULL}, 2472, "tcp"},
-{"c3", {NULL}, 2472, "udp"},
-{"aker-cdp", {NULL}, 2473, "tcp"},
-{"aker-cdp", {NULL}, 2473, "udp"},
-{"vitalanalysis", {NULL}, 2474, "tcp"},
-{"vitalanalysis", {NULL}, 2474, "udp"},
-{"ace-server", {NULL}, 2475, "tcp"},
-{"ace-server", {NULL}, 2475, "udp"},
-{"ace-svr-prop", {NULL}, 2476, "tcp"},
-{"ace-svr-prop", {NULL}, 2476, "udp"},
-{"ssm-cvs", {NULL}, 2477, "tcp"},
-{"ssm-cvs", {NULL}, 2477, "udp"},
-{"ssm-cssps", {NULL}, 2478, "tcp"},
-{"ssm-cssps", {NULL}, 2478, "udp"},
-{"ssm-els", {NULL}, 2479, "tcp"},
-{"ssm-els", {NULL}, 2479, "udp"},
-{"powerexchange", {NULL}, 2480, "tcp"},
-{"powerexchange", {NULL}, 2480, "udp"},
-{"giop", {NULL}, 2481, "tcp"},
-{"giop", {NULL}, 2481, "udp"},
-{"giop-ssl", {NULL}, 2482, "tcp"},
-{"giop-ssl", {NULL}, 2482, "udp"},
-{"ttc", {NULL}, 2483, "tcp"},
-{"ttc", {NULL}, 2483, "udp"},
-{"ttc-ssl", {NULL}, 2484, "tcp"},
-{"ttc-ssl", {NULL}, 2484, "udp"},
-{"netobjects1", {NULL}, 2485, "tcp"},
-{"netobjects1", {NULL}, 2485, "udp"},
-{"netobjects2", {NULL}, 2486, "tcp"},
-{"netobjects2", {NULL}, 2486, "udp"},
-{"pns", {NULL}, 2487, "tcp"},
-{"pns", {NULL}, 2487, "udp"},
-{"moy-corp", {NULL}, 2488, "tcp"},
-{"moy-corp", {NULL}, 2488, "udp"},
-{"tsilb", {NULL}, 2489, "tcp"},
-{"tsilb", {NULL}, 2489, "udp"},
-{"qip-qdhcp", {NULL}, 2490, "tcp"},
-{"qip-qdhcp", {NULL}, 2490, "udp"},
-{"conclave-cpp", {NULL}, 2491, "tcp"},
-{"conclave-cpp", {NULL}, 2491, "udp"},
-{"groove", {NULL}, 2492, "tcp"},
-{"groove", {NULL}, 2492, "udp"},
-{"talarian-mqs", {NULL}, 2493, "tcp"},
-{"talarian-mqs", {NULL}, 2493, "udp"},
-{"bmc-ar", {NULL}, 2494, "tcp"},
-{"bmc-ar", {NULL}, 2494, "udp"},
-{"fast-rem-serv", {NULL}, 2495, "tcp"},
-{"fast-rem-serv", {NULL}, 2495, "udp"},
-{"dirgis", {NULL}, 2496, "tcp"},
-{"dirgis", {NULL}, 2496, "udp"},
-{"quaddb", {NULL}, 2497, "tcp"},
-{"quaddb", {NULL}, 2497, "udp"},
-{"odn-castraq", {NULL}, 2498, "tcp"},
-{"odn-castraq", {NULL}, 2498, "udp"},
-{"unicontrol", {NULL}, 2499, "tcp"},
-{"unicontrol", {NULL}, 2499, "udp"},
-{"rtsserv", {NULL}, 2500, "tcp"},
-{"rtsserv", {NULL}, 2500, "udp"},
-{"rtsclient", {NULL}, 2501, "tcp"},
-{"rtsclient", {NULL}, 2501, "udp"},
-{"kentrox-prot", {NULL}, 2502, "tcp"},
-{"kentrox-prot", {NULL}, 2502, "udp"},
-{"nms-dpnss", {NULL}, 2503, "tcp"},
-{"nms-dpnss", {NULL}, 2503, "udp"},
-{"wlbs", {NULL}, 2504, "tcp"},
-{"wlbs", {NULL}, 2504, "udp"},
-{"ppcontrol", {NULL}, 2505, "tcp"},
-{"ppcontrol", {NULL}, 2505, "udp"},
-{"jbroker", {NULL}, 2506, "tcp"},
-{"jbroker", {NULL}, 2506, "udp"},
-{"spock", {NULL}, 2507, "tcp"},
-{"spock", {NULL}, 2507, "udp"},
-{"jdatastore", {NULL}, 2508, "tcp"},
-{"jdatastore", {NULL}, 2508, "udp"},
-{"fjmpss", {NULL}, 2509, "tcp"},
-{"fjmpss", {NULL}, 2509, "udp"},
-{"fjappmgrbulk", {NULL}, 2510, "tcp"},
-{"fjappmgrbulk", {NULL}, 2510, "udp"},
-{"metastorm", {NULL}, 2511, "tcp"},
-{"metastorm", {NULL}, 2511, "udp"},
-{"citrixima", {NULL}, 2512, "tcp"},
-{"citrixima", {NULL}, 2512, "udp"},
-{"citrixadmin", {NULL}, 2513, "tcp"},
-{"citrixadmin", {NULL}, 2513, "udp"},
-{"facsys-ntp", {NULL}, 2514, "tcp"},
-{"facsys-ntp", {NULL}, 2514, "udp"},
-{"facsys-router", {NULL}, 2515, "tcp"},
-{"facsys-router", {NULL}, 2515, "udp"},
-{"maincontrol", {NULL}, 2516, "tcp"},
-{"maincontrol", {NULL}, 2516, "udp"},
-{"call-sig-trans", {NULL}, 2517, "tcp"},
-{"call-sig-trans", {NULL}, 2517, "udp"},
-{"willy", {NULL}, 2518, "tcp"},
-{"willy", {NULL}, 2518, "udp"},
-{"globmsgsvc", {NULL}, 2519, "tcp"},
-{"globmsgsvc", {NULL}, 2519, "udp"},
-{"pvsw", {NULL}, 2520, "tcp"},
-{"pvsw", {NULL}, 2520, "udp"},
-{"adaptecmgr", {NULL}, 2521, "tcp"},
-{"adaptecmgr", {NULL}, 2521, "udp"},
-{"windb", {NULL}, 2522, "tcp"},
-{"windb", {NULL}, 2522, "udp"},
-{"qke-llc-v3", {NULL}, 2523, "tcp"},
-{"qke-llc-v3", {NULL}, 2523, "udp"},
-{"optiwave-lm", {NULL}, 2524, "tcp"},
-{"optiwave-lm", {NULL}, 2524, "udp"},
-{"ms-v-worlds", {NULL}, 2525, "tcp"},
-{"ms-v-worlds", {NULL}, 2525, "udp"},
-{"ema-sent-lm", {NULL}, 2526, "tcp"},
-{"ema-sent-lm", {NULL}, 2526, "udp"},
-{"iqserver", {NULL}, 2527, "tcp"},
-{"iqserver", {NULL}, 2527, "udp"},
-{"ncr_ccl", {NULL}, 2528, "tcp"},
-{"ncr_ccl", {NULL}, 2528, "udp"},
-{"utsftp", {NULL}, 2529, "tcp"},
-{"utsftp", {NULL}, 2529, "udp"},
-{"vrcommerce", {NULL}, 2530, "tcp"},
-{"vrcommerce", {NULL}, 2530, "udp"},
-{"ito-e-gui", {NULL}, 2531, "tcp"},
-{"ito-e-gui", {NULL}, 2531, "udp"},
-{"ovtopmd", {NULL}, 2532, "tcp"},
-{"ovtopmd", {NULL}, 2532, "udp"},
-{"snifferserver", {NULL}, 2533, "tcp"},
-{"snifferserver", {NULL}, 2533, "udp"},
-{"combox-web-acc", {NULL}, 2534, "tcp"},
-{"combox-web-acc", {NULL}, 2534, "udp"},
-{"madcap", {NULL}, 2535, "tcp"},
-{"madcap", {NULL}, 2535, "udp"},
-{"btpp2audctr1", {NULL}, 2536, "tcp"},
-{"btpp2audctr1", {NULL}, 2536, "udp"},
-{"upgrade", {NULL}, 2537, "tcp"},
-{"upgrade", {NULL}, 2537, "udp"},
-{"vnwk-prapi", {NULL}, 2538, "tcp"},
-{"vnwk-prapi", {NULL}, 2538, "udp"},
-{"vsiadmin", {NULL}, 2539, "tcp"},
-{"vsiadmin", {NULL}, 2539, "udp"},
-{"lonworks", {NULL}, 2540, "tcp"},
-{"lonworks", {NULL}, 2540, "udp"},
-{"lonworks2", {NULL}, 2541, "tcp"},
-{"lonworks2", {NULL}, 2541, "udp"},
-{"udrawgraph", {NULL}, 2542, "tcp"},
-{"udrawgraph", {NULL}, 2542, "udp"},
-{"reftek", {NULL}, 2543, "tcp"},
-{"reftek", {NULL}, 2543, "udp"},
-{"novell-zen", {NULL}, 2544, "tcp"},
-{"novell-zen", {NULL}, 2544, "udp"},
-{"sis-emt", {NULL}, 2545, "tcp"},
-{"sis-emt", {NULL}, 2545, "udp"},
-{"vytalvaultbrtp", {NULL}, 2546, "tcp"},
-{"vytalvaultbrtp", {NULL}, 2546, "udp"},
-{"vytalvaultvsmp", {NULL}, 2547, "tcp"},
-{"vytalvaultvsmp", {NULL}, 2547, "udp"},
-{"vytalvaultpipe", {NULL}, 2548, "tcp"},
-{"vytalvaultpipe", {NULL}, 2548, "udp"},
-{"ipass", {NULL}, 2549, "tcp"},
-{"ipass", {NULL}, 2549, "udp"},
-{"ads", {NULL}, 2550, "tcp"},
-{"ads", {NULL}, 2550, "udp"},
-{"isg-uda-server", {NULL}, 2551, "tcp"},
-{"isg-uda-server", {NULL}, 2551, "udp"},
-{"call-logging", {NULL}, 2552, "tcp"},
-{"call-logging", {NULL}, 2552, "udp"},
-{"efidiningport", {NULL}, 2553, "tcp"},
-{"efidiningport", {NULL}, 2553, "udp"},
-{"vcnet-link-v10", {NULL}, 2554, "tcp"},
-{"vcnet-link-v10", {NULL}, 2554, "udp"},
-{"compaq-wcp", {NULL}, 2555, "tcp"},
-{"compaq-wcp", {NULL}, 2555, "udp"},
-{"nicetec-nmsvc", {NULL}, 2556, "tcp"},
-{"nicetec-nmsvc", {NULL}, 2556, "udp"},
-{"nicetec-mgmt", {NULL}, 2557, "tcp"},
-{"nicetec-mgmt", {NULL}, 2557, "udp"},
-{"pclemultimedia", {NULL}, 2558, "tcp"},
-{"pclemultimedia", {NULL}, 2558, "udp"},
-{"lstp", {NULL}, 2559, "tcp"},
-{"lstp", {NULL}, 2559, "udp"},
-{"labrat", {NULL}, 2560, "tcp"},
-{"labrat", {NULL}, 2560, "udp"},
-{"mosaixcc", {NULL}, 2561, "tcp"},
-{"mosaixcc", {NULL}, 2561, "udp"},
-{"delibo", {NULL}, 2562, "tcp"},
-{"delibo", {NULL}, 2562, "udp"},
-{"cti-redwood", {NULL}, 2563, "tcp"},
-{"cti-redwood", {NULL}, 2563, "udp"},
-{"hp-3000-telnet", {NULL}, 2564, "tcp"},
-{"coord-svr", {NULL}, 2565, "tcp"},
-{"coord-svr", {NULL}, 2565, "udp"},
-{"pcs-pcw", {NULL}, 2566, "tcp"},
-{"pcs-pcw", {NULL}, 2566, "udp"},
-{"clp", {NULL}, 2567, "tcp"},
-{"clp", {NULL}, 2567, "udp"},
-{"spamtrap", {NULL}, 2568, "tcp"},
-{"spamtrap", {NULL}, 2568, "udp"},
-{"sonuscallsig", {NULL}, 2569, "tcp"},
-{"sonuscallsig", {NULL}, 2569, "udp"},
-{"hs-port", {NULL}, 2570, "tcp"},
-{"hs-port", {NULL}, 2570, "udp"},
-{"cecsvc", {NULL}, 2571, "tcp"},
-{"cecsvc", {NULL}, 2571, "udp"},
-{"ibp", {NULL}, 2572, "tcp"},
-{"ibp", {NULL}, 2572, "udp"},
-{"trustestablish", {NULL}, 2573, "tcp"},
-{"trustestablish", {NULL}, 2573, "udp"},
-{"blockade-bpsp", {NULL}, 2574, "tcp"},
-{"blockade-bpsp", {NULL}, 2574, "udp"},
-{"hl7", {NULL}, 2575, "tcp"},
-{"hl7", {NULL}, 2575, "udp"},
-{"tclprodebugger", {NULL}, 2576, "tcp"},
-{"tclprodebugger", {NULL}, 2576, "udp"},
-{"scipticslsrvr", {NULL}, 2577, "tcp"},
-{"scipticslsrvr", {NULL}, 2577, "udp"},
-{"rvs-isdn-dcp", {NULL}, 2578, "tcp"},
-{"rvs-isdn-dcp", {NULL}, 2578, "udp"},
-{"mpfoncl", {NULL}, 2579, "tcp"},
-{"mpfoncl", {NULL}, 2579, "udp"},
-{"tributary", {NULL}, 2580, "tcp"},
-{"tributary", {NULL}, 2580, "udp"},
-{"argis-te", {NULL}, 2581, "tcp"},
-{"argis-te", {NULL}, 2581, "udp"},
-{"argis-ds", {NULL}, 2582, "tcp"},
-{"argis-ds", {NULL}, 2582, "udp"},
-{"mon", {NULL}, 2583, "tcp"},
-{"mon", {NULL}, 2583, "udp"},
-{"cyaserv", {NULL}, 2584, "tcp"},
-{"cyaserv", {NULL}, 2584, "udp"},
-{"netx-server", {NULL}, 2585, "tcp"},
-{"netx-server", {NULL}, 2585, "udp"},
-{"netx-agent", {NULL}, 2586, "tcp"},
-{"netx-agent", {NULL}, 2586, "udp"},
-{"masc", {NULL}, 2587, "tcp"},
-{"masc", {NULL}, 2587, "udp"},
-{"privilege", {NULL}, 2588, "tcp"},
-{"privilege", {NULL}, 2588, "udp"},
-{"quartus-tcl", {NULL}, 2589, "tcp"},
-{"quartus-tcl", {NULL}, 2589, "udp"},
-{"idotdist", {NULL}, 2590, "tcp"},
-{"idotdist", {NULL}, 2590, "udp"},
-{"maytagshuffle", {NULL}, 2591, "tcp"},
-{"maytagshuffle", {NULL}, 2591, "udp"},
-{"netrek", {NULL}, 2592, "tcp"},
-{"netrek", {NULL}, 2592, "udp"},
-{"mns-mail", {NULL}, 2593, "tcp"},
-{"mns-mail", {NULL}, 2593, "udp"},
-{"dts", {NULL}, 2594, "tcp"},
-{"dts", {NULL}, 2594, "udp"},
-{"worldfusion1", {NULL}, 2595, "tcp"},
-{"worldfusion1", {NULL}, 2595, "udp"},
-{"worldfusion2", {NULL}, 2596, "tcp"},
-{"worldfusion2", {NULL}, 2596, "udp"},
-{"homesteadglory", {NULL}, 2597, "tcp"},
-{"homesteadglory", {NULL}, 2597, "udp"},
-{"citriximaclient", {NULL}, 2598, "tcp"},
-{"citriximaclient", {NULL}, 2598, "udp"},
-{"snapd", {NULL}, 2599, "tcp"},
-{"snapd", {NULL}, 2599, "udp"},
-{"hpstgmgr", {NULL}, 2600, "tcp"},
-{"hpstgmgr", {NULL}, 2600, "udp"},
-{"discp-client", {NULL}, 2601, "tcp"},
-{"discp-client", {NULL}, 2601, "udp"},
-{"discp-server", {NULL}, 2602, "tcp"},
-{"discp-server", {NULL}, 2602, "udp"},
-{"servicemeter", {NULL}, 2603, "tcp"},
-{"servicemeter", {NULL}, 2603, "udp"},
-{"nsc-ccs", {NULL}, 2604, "tcp"},
-{"nsc-ccs", {NULL}, 2604, "udp"},
-{"nsc-posa", {NULL}, 2605, "tcp"},
-{"nsc-posa", {NULL}, 2605, "udp"},
-{"netmon", {NULL}, 2606, "tcp"},
-{"netmon", {NULL}, 2606, "udp"},
-{"connection", {NULL}, 2607, "tcp"},
-{"connection", {NULL}, 2607, "udp"},
-{"wag-service", {NULL}, 2608, "tcp"},
-{"wag-service", {NULL}, 2608, "udp"},
-{"system-monitor", {NULL}, 2609, "tcp"},
-{"system-monitor", {NULL}, 2609, "udp"},
-{"versa-tek", {NULL}, 2610, "tcp"},
-{"versa-tek", {NULL}, 2610, "udp"},
-{"lionhead", {NULL}, 2611, "tcp"},
-{"lionhead", {NULL}, 2611, "udp"},
-{"qpasa-agent", {NULL}, 2612, "tcp"},
-{"qpasa-agent", {NULL}, 2612, "udp"},
-{"smntubootstrap", {NULL}, 2613, "tcp"},
-{"smntubootstrap", {NULL}, 2613, "udp"},
-{"neveroffline", {NULL}, 2614, "tcp"},
-{"neveroffline", {NULL}, 2614, "udp"},
-{"firepower", {NULL}, 2615, "tcp"},
-{"firepower", {NULL}, 2615, "udp"},
-{"appswitch-emp", {NULL}, 2616, "tcp"},
-{"appswitch-emp", {NULL}, 2616, "udp"},
-{"cmadmin", {NULL}, 2617, "tcp"},
-{"cmadmin", {NULL}, 2617, "udp"},
-{"priority-e-com", {NULL}, 2618, "tcp"},
-{"priority-e-com", {NULL}, 2618, "udp"},
-{"bruce", {NULL}, 2619, "tcp"},
-{"bruce", {NULL}, 2619, "udp"},
-{"lpsrecommender", {NULL}, 2620, "tcp"},
-{"lpsrecommender", {NULL}, 2620, "udp"},
-{"miles-apart", {NULL}, 2621, "tcp"},
-{"miles-apart", {NULL}, 2621, "udp"},
-{"metricadbc", {NULL}, 2622, "tcp"},
-{"metricadbc", {NULL}, 2622, "udp"},
-{"lmdp", {NULL}, 2623, "tcp"},
-{"lmdp", {NULL}, 2623, "udp"},
-{"aria", {NULL}, 2624, "tcp"},
-{"aria", {NULL}, 2624, "udp"},
-{"blwnkl-port", {NULL}, 2625, "tcp"},
-{"blwnkl-port", {NULL}, 2625, "udp"},
-{"gbjd816", {NULL}, 2626, "tcp"},
-{"gbjd816", {NULL}, 2626, "udp"},
-{"moshebeeri", {NULL}, 2627, "tcp"},
-{"moshebeeri", {NULL}, 2627, "udp"},
-{"dict", {NULL}, 2628, "tcp"},
-{"dict", {NULL}, 2628, "udp"},
-{"sitaraserver", {NULL}, 2629, "tcp"},
-{"sitaraserver", {NULL}, 2629, "udp"},
-{"sitaramgmt", {NULL}, 2630, "tcp"},
-{"sitaramgmt", {NULL}, 2630, "udp"},
-{"sitaradir", {NULL}, 2631, "tcp"},
-{"sitaradir", {NULL}, 2631, "udp"},
-{"irdg-post", {NULL}, 2632, "tcp"},
-{"irdg-post", {NULL}, 2632, "udp"},
-{"interintelli", {NULL}, 2633, "tcp"},
-{"interintelli", {NULL}, 2633, "udp"},
-{"pk-electronics", {NULL}, 2634, "tcp"},
-{"pk-electronics", {NULL}, 2634, "udp"},
-{"backburner", {NULL}, 2635, "tcp"},
-{"backburner", {NULL}, 2635, "udp"},
-{"solve", {NULL}, 2636, "tcp"},
-{"solve", {NULL}, 2636, "udp"},
-{"imdocsvc", {NULL}, 2637, "tcp"},
-{"imdocsvc", {NULL}, 2637, "udp"},
-{"sybaseanywhere", {NULL}, 2638, "tcp"},
-{"sybaseanywhere", {NULL}, 2638, "udp"},
-{"aminet", {NULL}, 2639, "tcp"},
-{"aminet", {NULL}, 2639, "udp"},
-{"sai_sentlm", {NULL}, 2640, "tcp"},
-{"sai_sentlm", {NULL}, 2640, "udp"},
-{"hdl-srv", {NULL}, 2641, "tcp"},
-{"hdl-srv", {NULL}, 2641, "udp"},
-{"tragic", {NULL}, 2642, "tcp"},
-{"tragic", {NULL}, 2642, "udp"},
-{"gte-samp", {NULL}, 2643, "tcp"},
-{"gte-samp", {NULL}, 2643, "udp"},
-{"travsoft-ipx-t", {NULL}, 2644, "tcp"},
-{"travsoft-ipx-t", {NULL}, 2644, "udp"},
-{"novell-ipx-cmd", {NULL}, 2645, "tcp"},
-{"novell-ipx-cmd", {NULL}, 2645, "udp"},
-{"and-lm", {NULL}, 2646, "tcp"},
-{"and-lm", {NULL}, 2646, "udp"},
-{"syncserver", {NULL}, 2647, "tcp"},
-{"syncserver", {NULL}, 2647, "udp"},
-{"upsnotifyprot", {NULL}, 2648, "tcp"},
-{"upsnotifyprot", {NULL}, 2648, "udp"},
-{"vpsipport", {NULL}, 2649, "tcp"},
-{"vpsipport", {NULL}, 2649, "udp"},
-{"eristwoguns", {NULL}, 2650, "tcp"},
-{"eristwoguns", {NULL}, 2650, "udp"},
-{"ebinsite", {NULL}, 2651, "tcp"},
-{"ebinsite", {NULL}, 2651, "udp"},
-{"interpathpanel", {NULL}, 2652, "tcp"},
-{"interpathpanel", {NULL}, 2652, "udp"},
-{"sonus", {NULL}, 2653, "tcp"},
-{"sonus", {NULL}, 2653, "udp"},
-{"corel_vncadmin", {NULL}, 2654, "tcp"},
-{"corel_vncadmin", {NULL}, 2654, "udp"},
-{"unglue", {NULL}, 2655, "tcp"},
-{"unglue", {NULL}, 2655, "udp"},
-{"kana", {NULL}, 2656, "tcp"},
-{"kana", {NULL}, 2656, "udp"},
-{"sns-dispatcher", {NULL}, 2657, "tcp"},
-{"sns-dispatcher", {NULL}, 2657, "udp"},
-{"sns-admin", {NULL}, 2658, "tcp"},
-{"sns-admin", {NULL}, 2658, "udp"},
-{"sns-query", {NULL}, 2659, "tcp"},
-{"sns-query", {NULL}, 2659, "udp"},
-{"gcmonitor", {NULL}, 2660, "tcp"},
-{"gcmonitor", {NULL}, 2660, "udp"},
-{"olhost", {NULL}, 2661, "tcp"},
-{"olhost", {NULL}, 2661, "udp"},
-{"bintec-capi", {NULL}, 2662, "tcp"},
-{"bintec-capi", {NULL}, 2662, "udp"},
-{"bintec-tapi", {NULL}, 2663, "tcp"},
-{"bintec-tapi", {NULL}, 2663, "udp"},
-{"patrol-mq-gm", {NULL}, 2664, "tcp"},
-{"patrol-mq-gm", {NULL}, 2664, "udp"},
-{"patrol-mq-nm", {NULL}, 2665, "tcp"},
-{"patrol-mq-nm", {NULL}, 2665, "udp"},
-{"extensis", {NULL}, 2666, "tcp"},
-{"extensis", {NULL}, 2666, "udp"},
-{"alarm-clock-s", {NULL}, 2667, "tcp"},
-{"alarm-clock-s", {NULL}, 2667, "udp"},
-{"alarm-clock-c", {NULL}, 2668, "tcp"},
-{"alarm-clock-c", {NULL}, 2668, "udp"},
-{"toad", {NULL}, 2669, "tcp"},
-{"toad", {NULL}, 2669, "udp"},
-{"tve-announce", {NULL}, 2670, "tcp"},
-{"tve-announce", {NULL}, 2670, "udp"},
-{"newlixreg", {NULL}, 2671, "tcp"},
-{"newlixreg", {NULL}, 2671, "udp"},
-{"nhserver", {NULL}, 2672, "tcp"},
-{"nhserver", {NULL}, 2672, "udp"},
-{"firstcall42", {NULL}, 2673, "tcp"},
-{"firstcall42", {NULL}, 2673, "udp"},
-{"ewnn", {NULL}, 2674, "tcp"},
-{"ewnn", {NULL}, 2674, "udp"},
-{"ttc-etap", {NULL}, 2675, "tcp"},
-{"ttc-etap", {NULL}, 2675, "udp"},
-{"simslink", {NULL}, 2676, "tcp"},
-{"simslink", {NULL}, 2676, "udp"},
-{"gadgetgate1way", {NULL}, 2677, "tcp"},
-{"gadgetgate1way", {NULL}, 2677, "udp"},
-{"gadgetgate2way", {NULL}, 2678, "tcp"},
-{"gadgetgate2way", {NULL}, 2678, "udp"},
-{"syncserverssl", {NULL}, 2679, "tcp"},
-{"syncserverssl", {NULL}, 2679, "udp"},
-{"pxc-sapxom", {NULL}, 2680, "tcp"},
-{"pxc-sapxom", {NULL}, 2680, "udp"},
-{"mpnjsomb", {NULL}, 2681, "tcp"},
-{"mpnjsomb", {NULL}, 2681, "udp"},
-{"ncdloadbalance", {NULL}, 2683, "tcp"},
-{"ncdloadbalance", {NULL}, 2683, "udp"},
-{"mpnjsosv", {NULL}, 2684, "tcp"},
-{"mpnjsosv", {NULL}, 2684, "udp"},
-{"mpnjsocl", {NULL}, 2685, "tcp"},
-{"mpnjsocl", {NULL}, 2685, "udp"},
-{"mpnjsomg", {NULL}, 2686, "tcp"},
-{"mpnjsomg", {NULL}, 2686, "udp"},
-{"pq-lic-mgmt", {NULL}, 2687, "tcp"},
-{"pq-lic-mgmt", {NULL}, 2687, "udp"},
-{"md-cg-http", {NULL}, 2688, "tcp"},
-{"md-cg-http", {NULL}, 2688, "udp"},
-{"fastlynx", {NULL}, 2689, "tcp"},
-{"fastlynx", {NULL}, 2689, "udp"},
-{"hp-nnm-data", {NULL}, 2690, "tcp"},
-{"hp-nnm-data", {NULL}, 2690, "udp"},
-{"itinternet", {NULL}, 2691, "tcp"},
-{"itinternet", {NULL}, 2691, "udp"},
-{"admins-lms", {NULL}, 2692, "tcp"},
-{"admins-lms", {NULL}, 2692, "udp"},
-{"pwrsevent", {NULL}, 2694, "tcp"},
-{"pwrsevent", {NULL}, 2694, "udp"},
-{"vspread", {NULL}, 2695, "tcp"},
-{"vspread", {NULL}, 2695, "udp"},
-{"unifyadmin", {NULL}, 2696, "tcp"},
-{"unifyadmin", {NULL}, 2696, "udp"},
-{"oce-snmp-trap", {NULL}, 2697, "tcp"},
-{"oce-snmp-trap", {NULL}, 2697, "udp"},
-{"mck-ivpip", {NULL}, 2698, "tcp"},
-{"mck-ivpip", {NULL}, 2698, "udp"},
-{"csoft-plusclnt", {NULL}, 2699, "tcp"},
-{"csoft-plusclnt", {NULL}, 2699, "udp"},
-{"tqdata", {NULL}, 2700, "tcp"},
-{"tqdata", {NULL}, 2700, "udp"},
-{"sms-rcinfo", {NULL}, 2701, "tcp"},
-{"sms-rcinfo", {NULL}, 2701, "udp"},
-{"sms-xfer", {NULL}, 2702, "tcp"},
-{"sms-xfer", {NULL}, 2702, "udp"},
-{"sms-chat", {NULL}, 2703, "tcp"},
-{"sms-chat", {NULL}, 2703, "udp"},
-{"sms-remctrl", {NULL}, 2704, "tcp"},
-{"sms-remctrl", {NULL}, 2704, "udp"},
-{"sds-admin", {NULL}, 2705, "tcp"},
-{"sds-admin", {NULL}, 2705, "udp"},
-{"ncdmirroring", {NULL}, 2706, "tcp"},
-{"ncdmirroring", {NULL}, 2706, "udp"},
-{"emcsymapiport", {NULL}, 2707, "tcp"},
-{"emcsymapiport", {NULL}, 2707, "udp"},
-{"banyan-net", {NULL}, 2708, "tcp"},
-{"banyan-net", {NULL}, 2708, "udp"},
-{"supermon", {NULL}, 2709, "tcp"},
-{"supermon", {NULL}, 2709, "udp"},
-{"sso-service", {NULL}, 2710, "tcp"},
-{"sso-service", {NULL}, 2710, "udp"},
-{"sso-control", {NULL}, 2711, "tcp"},
-{"sso-control", {NULL}, 2711, "udp"},
-{"aocp", {NULL}, 2712, "tcp"},
-{"aocp", {NULL}, 2712, "udp"},
-{"raventbs", {NULL}, 2713, "tcp"},
-{"raventbs", {NULL}, 2713, "udp"},
-{"raventdm", {NULL}, 2714, "tcp"},
-{"raventdm", {NULL}, 2714, "udp"},
-{"hpstgmgr2", {NULL}, 2715, "tcp"},
-{"hpstgmgr2", {NULL}, 2715, "udp"},
-{"inova-ip-disco", {NULL}, 2716, "tcp"},
-{"inova-ip-disco", {NULL}, 2716, "udp"},
-{"pn-requester", {NULL}, 2717, "tcp"},
-{"pn-requester", {NULL}, 2717, "udp"},
-{"pn-requester2", {NULL}, 2718, "tcp"},
-{"pn-requester2", {NULL}, 2718, "udp"},
-{"scan-change", {NULL}, 2719, "tcp"},
-{"scan-change", {NULL}, 2719, "udp"},
-{"wkars", {NULL}, 2720, "tcp"},
-{"wkars", {NULL}, 2720, "udp"},
-{"smart-diagnose", {NULL}, 2721, "tcp"},
-{"smart-diagnose", {NULL}, 2721, "udp"},
-{"proactivesrvr", {NULL}, 2722, "tcp"},
-{"proactivesrvr", {NULL}, 2722, "udp"},
-{"watchdog-nt", {NULL}, 2723, "tcp"},
-{"watchdog-nt", {NULL}, 2723, "udp"},
-{"qotps", {NULL}, 2724, "tcp"},
-{"qotps", {NULL}, 2724, "udp"},
-{"msolap-ptp2", {NULL}, 2725, "tcp"},
-{"msolap-ptp2", {NULL}, 2725, "udp"},
-{"tams", {NULL}, 2726, "tcp"},
-{"tams", {NULL}, 2726, "udp"},
-{"mgcp-callagent", {NULL}, 2727, "tcp"},
-{"mgcp-callagent", {NULL}, 2727, "udp"},
-{"sqdr", {NULL}, 2728, "tcp"},
-{"sqdr", {NULL}, 2728, "udp"},
-{"tcim-control", {NULL}, 2729, "tcp"},
-{"tcim-control", {NULL}, 2729, "udp"},
-{"nec-raidplus", {NULL}, 2730, "tcp"},
-{"nec-raidplus", {NULL}, 2730, "udp"},
-{"fyre-messanger", {NULL}, 2731, "tcp"},
-{"fyre-messanger", {NULL}, 2731, "udp"},
-{"g5m", {NULL}, 2732, "tcp"},
-{"g5m", {NULL}, 2732, "udp"},
-{"signet-ctf", {NULL}, 2733, "tcp"},
-{"signet-ctf", {NULL}, 2733, "udp"},
-{"ccs-software", {NULL}, 2734, "tcp"},
-{"ccs-software", {NULL}, 2734, "udp"},
-{"netiq-mc", {NULL}, 2735, "tcp"},
-{"netiq-mc", {NULL}, 2735, "udp"},
-{"radwiz-nms-srv", {NULL}, 2736, "tcp"},
-{"radwiz-nms-srv", {NULL}, 2736, "udp"},
-{"srp-feedback", {NULL}, 2737, "tcp"},
-{"srp-feedback", {NULL}, 2737, "udp"},
-{"ndl-tcp-ois-gw", {NULL}, 2738, "tcp"},
-{"ndl-tcp-ois-gw", {NULL}, 2738, "udp"},
-{"tn-timing", {NULL}, 2739, "tcp"},
-{"tn-timing", {NULL}, 2739, "udp"},
-{"alarm", {NULL}, 2740, "tcp"},
-{"alarm", {NULL}, 2740, "udp"},
-{"tsb", {NULL}, 2741, "tcp"},
-{"tsb", {NULL}, 2741, "udp"},
-{"tsb2", {NULL}, 2742, "tcp"},
-{"tsb2", {NULL}, 2742, "udp"},
-{"murx", {NULL}, 2743, "tcp"},
-{"murx", {NULL}, 2743, "udp"},
-{"honyaku", {NULL}, 2744, "tcp"},
-{"honyaku", {NULL}, 2744, "udp"},
-{"urbisnet", {NULL}, 2745, "tcp"},
-{"urbisnet", {NULL}, 2745, "udp"},
-{"cpudpencap", {NULL}, 2746, "tcp"},
-{"cpudpencap", {NULL}, 2746, "udp"},
-{"fjippol-swrly", {NULL}, 2747, "tcp"},
-{"fjippol-swrly", {NULL}, 2747, "udp"},
-{"fjippol-polsvr", {NULL}, 2748, "tcp"},
-{"fjippol-polsvr", {NULL}, 2748, "udp"},
-{"fjippol-cnsl", {NULL}, 2749, "tcp"},
-{"fjippol-cnsl", {NULL}, 2749, "udp"},
-{"fjippol-port1", {NULL}, 2750, "tcp"},
-{"fjippol-port1", {NULL}, 2750, "udp"},
-{"fjippol-port2", {NULL}, 2751, "tcp"},
-{"fjippol-port2", {NULL}, 2751, "udp"},
-{"rsisysaccess", {NULL}, 2752, "tcp"},
-{"rsisysaccess", {NULL}, 2752, "udp"},
-{"de-spot", {NULL}, 2753, "tcp"},
-{"de-spot", {NULL}, 2753, "udp"},
-{"apollo-cc", {NULL}, 2754, "tcp"},
-{"apollo-cc", {NULL}, 2754, "udp"},
-{"expresspay", {NULL}, 2755, "tcp"},
-{"expresspay", {NULL}, 2755, "udp"},
-{"simplement-tie", {NULL}, 2756, "tcp"},
-{"simplement-tie", {NULL}, 2756, "udp"},
-{"cnrp", {NULL}, 2757, "tcp"},
-{"cnrp", {NULL}, 2757, "udp"},
-{"apollo-status", {NULL}, 2758, "tcp"},
-{"apollo-status", {NULL}, 2758, "udp"},
-{"apollo-gms", {NULL}, 2759, "tcp"},
-{"apollo-gms", {NULL}, 2759, "udp"},
-{"sabams", {NULL}, 2760, "tcp"},
-{"sabams", {NULL}, 2760, "udp"},
-{"dicom-iscl", {NULL}, 2761, "tcp"},
-{"dicom-iscl", {NULL}, 2761, "udp"},
-{"dicom-tls", {NULL}, 2762, "tcp"},
-{"dicom-tls", {NULL}, 2762, "udp"},
-{"desktop-dna", {NULL}, 2763, "tcp"},
-{"desktop-dna", {NULL}, 2763, "udp"},
-{"data-insurance", {NULL}, 2764, "tcp"},
-{"data-insurance", {NULL}, 2764, "udp"},
-{"qip-audup", {NULL}, 2765, "tcp"},
-{"qip-audup", {NULL}, 2765, "udp"},
-{"compaq-scp", {NULL}, 2766, "tcp"},
-{"compaq-scp", {NULL}, 2766, "udp"},
-{"uadtc", {NULL}, 2767, "tcp"},
-{"uadtc", {NULL}, 2767, "udp"},
-{"uacs", {NULL}, 2768, "tcp"},
-{"uacs", {NULL}, 2768, "udp"},
-{"exce", {NULL}, 2769, "tcp"},
-{"exce", {NULL}, 2769, "udp"},
-{"veronica", {NULL}, 2770, "tcp"},
-{"veronica", {NULL}, 2770, "udp"},
-{"vergencecm", {NULL}, 2771, "tcp"},
-{"vergencecm", {NULL}, 2771, "udp"},
-{"auris", {NULL}, 2772, "tcp"},
-{"auris", {NULL}, 2772, "udp"},
-{"rbakcup1", {NULL}, 2773, "tcp"},
-{"rbakcup1", {NULL}, 2773, "udp"},
-{"rbakcup2", {NULL}, 2774, "tcp"},
-{"rbakcup2", {NULL}, 2774, "udp"},
-{"smpp", {NULL}, 2775, "tcp"},
-{"smpp", {NULL}, 2775, "udp"},
-{"ridgeway1", {NULL}, 2776, "tcp"},
-{"ridgeway1", {NULL}, 2776, "udp"},
-{"ridgeway2", {NULL}, 2777, "tcp"},
-{"ridgeway2", {NULL}, 2777, "udp"},
-{"gwen-sonya", {NULL}, 2778, "tcp"},
-{"gwen-sonya", {NULL}, 2778, "udp"},
-{"lbc-sync", {NULL}, 2779, "tcp"},
-{"lbc-sync", {NULL}, 2779, "udp"},
-{"lbc-control", {NULL}, 2780, "tcp"},
-{"lbc-control", {NULL}, 2780, "udp"},
-{"whosells", {NULL}, 2781, "tcp"},
-{"whosells", {NULL}, 2781, "udp"},
-{"everydayrc", {NULL}, 2782, "tcp"},
-{"everydayrc", {NULL}, 2782, "udp"},
-{"aises", {NULL}, 2783, "tcp"},
-{"aises", {NULL}, 2783, "udp"},
-{"www-dev", {NULL}, 2784, "tcp"},
-{"www-dev", {NULL}, 2784, "udp"},
-{"aic-np", {NULL}, 2785, "tcp"},
-{"aic-np", {NULL}, 2785, "udp"},
-{"aic-oncrpc", {NULL}, 2786, "tcp"},
-{"aic-oncrpc", {NULL}, 2786, "udp"},
-{"piccolo", {NULL}, 2787, "tcp"},
-{"piccolo", {NULL}, 2787, "udp"},
-{"fryeserv", {NULL}, 2788, "tcp"},
-{"fryeserv", {NULL}, 2788, "udp"},
-{"media-agent", {NULL}, 2789, "tcp"},
-{"media-agent", {NULL}, 2789, "udp"},
-{"plgproxy", {NULL}, 2790, "tcp"},
-{"plgproxy", {NULL}, 2790, "udp"},
-{"mtport-regist", {NULL}, 2791, "tcp"},
-{"mtport-regist", {NULL}, 2791, "udp"},
-{"f5-globalsite", {NULL}, 2792, "tcp"},
-{"f5-globalsite", {NULL}, 2792, "udp"},
-{"initlsmsad", {NULL}, 2793, "tcp"},
-{"initlsmsad", {NULL}, 2793, "udp"},
-{"livestats", {NULL}, 2795, "tcp"},
-{"livestats", {NULL}, 2795, "udp"},
-{"ac-tech", {NULL}, 2796, "tcp"},
-{"ac-tech", {NULL}, 2796, "udp"},
-{"esp-encap", {NULL}, 2797, "tcp"},
-{"esp-encap", {NULL}, 2797, "udp"},
-{"tmesis-upshot", {NULL}, 2798, "tcp"},
-{"tmesis-upshot", {NULL}, 2798, "udp"},
-{"icon-discover", {NULL}, 2799, "tcp"},
-{"icon-discover", {NULL}, 2799, "udp"},
-{"acc-raid", {NULL}, 2800, "tcp"},
-{"acc-raid", {NULL}, 2800, "udp"},
-{"igcp", {NULL}, 2801, "tcp"},
-{"igcp", {NULL}, 2801, "udp"},
-{"veritas-tcp1", {NULL}, 2802, "tcp"},
-{"veritas-udp1", {NULL}, 2802, "udp"},
-{"btprjctrl", {NULL}, 2803, "tcp"},
-{"btprjctrl", {NULL}, 2803, "udp"},
-{"dvr-esm", {NULL}, 2804, "tcp"},
-{"dvr-esm", {NULL}, 2804, "udp"},
-{"wta-wsp-s", {NULL}, 2805, "tcp"},
-{"wta-wsp-s", {NULL}, 2805, "udp"},
-{"cspuni", {NULL}, 2806, "tcp"},
-{"cspuni", {NULL}, 2806, "udp"},
-{"cspmulti", {NULL}, 2807, "tcp"},
-{"cspmulti", {NULL}, 2807, "udp"},
-{"j-lan-p", {NULL}, 2808, "tcp"},
-{"j-lan-p", {NULL}, 2808, "udp"},
-{"corbaloc", {NULL}, 2809, "tcp"},
-{"corbaloc", {NULL}, 2809, "udp"},
-{"netsteward", {NULL}, 2810, "tcp"},
-{"netsteward", {NULL}, 2810, "udp"},
-{"gsiftp", {NULL}, 2811, "tcp"},
-{"gsiftp", {NULL}, 2811, "udp"},
-{"atmtcp", {NULL}, 2812, "tcp"},
-{"atmtcp", {NULL}, 2812, "udp"},
-{"llm-pass", {NULL}, 2813, "tcp"},
-{"llm-pass", {NULL}, 2813, "udp"},
-{"llm-csv", {NULL}, 2814, "tcp"},
-{"llm-csv", {NULL}, 2814, "udp"},
-{"lbc-measure", {NULL}, 2815, "tcp"},
-{"lbc-measure", {NULL}, 2815, "udp"},
-{"lbc-watchdog", {NULL}, 2816, "tcp"},
-{"lbc-watchdog", {NULL}, 2816, "udp"},
-{"nmsigport", {NULL}, 2817, "tcp"},
-{"nmsigport", {NULL}, 2817, "udp"},
-{"rmlnk", {NULL}, 2818, "tcp"},
-{"rmlnk", {NULL}, 2818, "udp"},
-{"fc-faultnotify", {NULL}, 2819, "tcp"},
-{"fc-faultnotify", {NULL}, 2819, "udp"},
-{"univision", {NULL}, 2820, "tcp"},
-{"univision", {NULL}, 2820, "udp"},
-{"vrts-at-port", {NULL}, 2821, "tcp"},
-{"vrts-at-port", {NULL}, 2821, "udp"},
-{"ka0wuc", {NULL}, 2822, "tcp"},
-{"ka0wuc", {NULL}, 2822, "udp"},
-{"cqg-netlan", {NULL}, 2823, "tcp"},
-{"cqg-netlan", {NULL}, 2823, "udp"},
-{"cqg-netlan-1", {NULL}, 2824, "tcp"},
-{"cqg-netlan-1", {NULL}, 2824, "udp"},
-{"slc-systemlog", {NULL}, 2826, "tcp"},
-{"slc-systemlog", {NULL}, 2826, "udp"},
-{"slc-ctrlrloops", {NULL}, 2827, "tcp"},
-{"slc-ctrlrloops", {NULL}, 2827, "udp"},
-{"itm-lm", {NULL}, 2828, "tcp"},
-{"itm-lm", {NULL}, 2828, "udp"},
-{"silkp1", {NULL}, 2829, "tcp"},
-{"silkp1", {NULL}, 2829, "udp"},
-{"silkp2", {NULL}, 2830, "tcp"},
-{"silkp2", {NULL}, 2830, "udp"},
-{"silkp3", {NULL}, 2831, "tcp"},
-{"silkp3", {NULL}, 2831, "udp"},
-{"silkp4", {NULL}, 2832, "tcp"},
-{"silkp4", {NULL}, 2832, "udp"},
-{"glishd", {NULL}, 2833, "tcp"},
-{"glishd", {NULL}, 2833, "udp"},
-{"evtp", {NULL}, 2834, "tcp"},
-{"evtp", {NULL}, 2834, "udp"},
-{"evtp-data", {NULL}, 2835, "tcp"},
-{"evtp-data", {NULL}, 2835, "udp"},
-{"catalyst", {NULL}, 2836, "tcp"},
-{"catalyst", {NULL}, 2836, "udp"},
-{"repliweb", {NULL}, 2837, "tcp"},
-{"repliweb", {NULL}, 2837, "udp"},
-{"starbot", {NULL}, 2838, "tcp"},
-{"starbot", {NULL}, 2838, "udp"},
-{"nmsigport", {NULL}, 2839, "tcp"},
-{"nmsigport", {NULL}, 2839, "udp"},
-{"l3-exprt", {NULL}, 2840, "tcp"},
-{"l3-exprt", {NULL}, 2840, "udp"},
-{"l3-ranger", {NULL}, 2841, "tcp"},
-{"l3-ranger", {NULL}, 2841, "udp"},
-{"l3-hawk", {NULL}, 2842, "tcp"},
-{"l3-hawk", {NULL}, 2842, "udp"},
-{"pdnet", {NULL}, 2843, "tcp"},
-{"pdnet", {NULL}, 2843, "udp"},
-{"bpcp-poll", {NULL}, 2844, "tcp"},
-{"bpcp-poll", {NULL}, 2844, "udp"},
-{"bpcp-trap", {NULL}, 2845, "tcp"},
-{"bpcp-trap", {NULL}, 2845, "udp"},
-{"aimpp-hello", {NULL}, 2846, "tcp"},
-{"aimpp-hello", {NULL}, 2846, "udp"},
-{"aimpp-port-req", {NULL}, 2847, "tcp"},
-{"aimpp-port-req", {NULL}, 2847, "udp"},
-{"amt-blc-port", {NULL}, 2848, "tcp"},
-{"amt-blc-port", {NULL}, 2848, "udp"},
-{"fxp", {NULL}, 2849, "tcp"},
-{"fxp", {NULL}, 2849, "udp"},
-{"metaconsole", {NULL}, 2850, "tcp"},
-{"metaconsole", {NULL}, 2850, "udp"},
-{"webemshttp", {NULL}, 2851, "tcp"},
-{"webemshttp", {NULL}, 2851, "udp"},
-{"bears-01", {NULL}, 2852, "tcp"},
-{"bears-01", {NULL}, 2852, "udp"},
-{"ispipes", {NULL}, 2853, "tcp"},
-{"ispipes", {NULL}, 2853, "udp"},
-{"infomover", {NULL}, 2854, "tcp"},
-{"infomover", {NULL}, 2854, "udp"},
-{"msrp", {NULL}, 2855, "tcp"},
-{"msrp", {NULL}, 2855, "udp"},
-{"cesdinv", {NULL}, 2856, "tcp"},
-{"cesdinv", {NULL}, 2856, "udp"},
-{"simctlp", {NULL}, 2857, "tcp"},
-{"simctlp", {NULL}, 2857, "udp"},
-{"ecnp", {NULL}, 2858, "tcp"},
-{"ecnp", {NULL}, 2858, "udp"},
-{"activememory", {NULL}, 2859, "tcp"},
-{"activememory", {NULL}, 2859, "udp"},
-{"dialpad-voice1", {NULL}, 2860, "tcp"},
-{"dialpad-voice1", {NULL}, 2860, "udp"},
-{"dialpad-voice2", {NULL}, 2861, "tcp"},
-{"dialpad-voice2", {NULL}, 2861, "udp"},
-{"ttg-protocol", {NULL}, 2862, "tcp"},
-{"ttg-protocol", {NULL}, 2862, "udp"},
-{"sonardata", {NULL}, 2863, "tcp"},
-{"sonardata", {NULL}, 2863, "udp"},
-{"astromed-main", {NULL}, 2864, "tcp"},
-{"astromed-main", {NULL}, 2864, "udp"},
-{"pit-vpn", {NULL}, 2865, "tcp"},
-{"pit-vpn", {NULL}, 2865, "udp"},
-{"iwlistener", {NULL}, 2866, "tcp"},
-{"iwlistener", {NULL}, 2866, "udp"},
-{"esps-portal", {NULL}, 2867, "tcp"},
-{"esps-portal", {NULL}, 2867, "udp"},
-{"npep-messaging", {NULL}, 2868, "tcp"},
-{"npep-messaging", {NULL}, 2868, "udp"},
-{"icslap", {NULL}, 2869, "tcp"},
-{"icslap", {NULL}, 2869, "udp"},
-{"daishi", {NULL}, 2870, "tcp"},
-{"daishi", {NULL}, 2870, "udp"},
-{"msi-selectplay", {NULL}, 2871, "tcp"},
-{"msi-selectplay", {NULL}, 2871, "udp"},
-{"radix", {NULL}, 2872, "tcp"},
-{"radix", {NULL}, 2872, "udp"},
-{"dxmessagebase1", {NULL}, 2874, "tcp"},
-{"dxmessagebase1", {NULL}, 2874, "udp"},
-{"dxmessagebase2", {NULL}, 2875, "tcp"},
-{"dxmessagebase2", {NULL}, 2875, "udp"},
-{"sps-tunnel", {NULL}, 2876, "tcp"},
-{"sps-tunnel", {NULL}, 2876, "udp"},
-{"bluelance", {NULL}, 2877, "tcp"},
-{"bluelance", {NULL}, 2877, "udp"},
-{"aap", {NULL}, 2878, "tcp"},
-{"aap", {NULL}, 2878, "udp"},
-{"ucentric-ds", {NULL}, 2879, "tcp"},
-{"ucentric-ds", {NULL}, 2879, "udp"},
-{"synapse", {NULL}, 2880, "tcp"},
-{"synapse", {NULL}, 2880, "udp"},
-{"ndsp", {NULL}, 2881, "tcp"},
-{"ndsp", {NULL}, 2881, "udp"},
-{"ndtp", {NULL}, 2882, "tcp"},
-{"ndtp", {NULL}, 2882, "udp"},
-{"ndnp", {NULL}, 2883, "tcp"},
-{"ndnp", {NULL}, 2883, "udp"},
-{"flashmsg", {NULL}, 2884, "tcp"},
-{"flashmsg", {NULL}, 2884, "udp"},
-{"topflow", {NULL}, 2885, "tcp"},
-{"topflow", {NULL}, 2885, "udp"},
-{"responselogic", {NULL}, 2886, "tcp"},
-{"responselogic", {NULL}, 2886, "udp"},
-{"aironetddp", {NULL}, 2887, "tcp"},
-{"aironetddp", {NULL}, 2887, "udp"},
-{"spcsdlobby", {NULL}, 2888, "tcp"},
-{"spcsdlobby", {NULL}, 2888, "udp"},
-{"rsom", {NULL}, 2889, "tcp"},
-{"rsom", {NULL}, 2889, "udp"},
-{"cspclmulti", {NULL}, 2890, "tcp"},
-{"cspclmulti", {NULL}, 2890, "udp"},
-{"cinegrfx-elmd", {NULL}, 2891, "tcp"},
-{"cinegrfx-elmd", {NULL}, 2891, "udp"},
-{"snifferdata", {NULL}, 2892, "tcp"},
-{"snifferdata", {NULL}, 2892, "udp"},
-{"vseconnector", {NULL}, 2893, "tcp"},
-{"vseconnector", {NULL}, 2893, "udp"},
-{"abacus-remote", {NULL}, 2894, "tcp"},
-{"abacus-remote", {NULL}, 2894, "udp"},
-{"natuslink", {NULL}, 2895, "tcp"},
-{"natuslink", {NULL}, 2895, "udp"},
-{"ecovisiong6-1", {NULL}, 2896, "tcp"},
-{"ecovisiong6-1", {NULL}, 2896, "udp"},
-{"citrix-rtmp", {NULL}, 2897, "tcp"},
-{"citrix-rtmp", {NULL}, 2897, "udp"},
-{"appliance-cfg", {NULL}, 2898, "tcp"},
-{"appliance-cfg", {NULL}, 2898, "udp"},
-{"powergemplus", {NULL}, 2899, "tcp"},
-{"powergemplus", {NULL}, 2899, "udp"},
-{"quicksuite", {NULL}, 2900, "tcp"},
-{"quicksuite", {NULL}, 2900, "udp"},
-{"allstorcns", {NULL}, 2901, "tcp"},
-{"allstorcns", {NULL}, 2901, "udp"},
-{"netaspi", {NULL}, 2902, "tcp"},
-{"netaspi", {NULL}, 2902, "udp"},
-{"suitcase", {NULL}, 2903, "tcp"},
-{"suitcase", {NULL}, 2903, "udp"},
-{"m2ua", {NULL}, 2904, "tcp"},
-{"m2ua", {NULL}, 2904, "udp"},
-{"m2ua", {NULL}, 2904, "sctp"},
-{"m3ua", {NULL}, 2905, "tcp"},
-{"m3ua", {NULL}, 2905, "sctp"},
-{"caller9", {NULL}, 2906, "tcp"},
-{"caller9", {NULL}, 2906, "udp"},
-{"webmethods-b2b", {NULL}, 2907, "tcp"},
-{"webmethods-b2b", {NULL}, 2907, "udp"},
-{"mao", {NULL}, 2908, "tcp"},
-{"mao", {NULL}, 2908, "udp"},
-{"funk-dialout", {NULL}, 2909, "tcp"},
-{"funk-dialout", {NULL}, 2909, "udp"},
-{"tdaccess", {NULL}, 2910, "tcp"},
-{"tdaccess", {NULL}, 2910, "udp"},
-{"blockade", {NULL}, 2911, "tcp"},
-{"blockade", {NULL}, 2911, "udp"},
-{"epicon", {NULL}, 2912, "tcp"},
-{"epicon", {NULL}, 2912, "udp"},
-{"boosterware", {NULL}, 2913, "tcp"},
-{"boosterware", {NULL}, 2913, "udp"},
-{"gamelobby", {NULL}, 2914, "tcp"},
-{"gamelobby", {NULL}, 2914, "udp"},
-{"tksocket", {NULL}, 2915, "tcp"},
-{"tksocket", {NULL}, 2915, "udp"},
-{"elvin_server", {NULL}, 2916, "tcp"},
-{"elvin_server", {NULL}, 2916, "udp"},
-{"elvin_client", {NULL}, 2917, "tcp"},
-{"elvin_client", {NULL}, 2917, "udp"},
-{"kastenchasepad", {NULL}, 2918, "tcp"},
-{"kastenchasepad", {NULL}, 2918, "udp"},
-{"roboer", {NULL}, 2919, "tcp"},
-{"roboer", {NULL}, 2919, "udp"},
-{"roboeda", {NULL}, 2920, "tcp"},
-{"roboeda", {NULL}, 2920, "udp"},
-{"cesdcdman", {NULL}, 2921, "tcp"},
-{"cesdcdman", {NULL}, 2921, "udp"},
-{"cesdcdtrn", {NULL}, 2922, "tcp"},
-{"cesdcdtrn", {NULL}, 2922, "udp"},
-{"wta-wsp-wtp-s", {NULL}, 2923, "tcp"},
-{"wta-wsp-wtp-s", {NULL}, 2923, "udp"},
-{"precise-vip", {NULL}, 2924, "tcp"},
-{"precise-vip", {NULL}, 2924, "udp"},
-{"mobile-file-dl", {NULL}, 2926, "tcp"},
-{"mobile-file-dl", {NULL}, 2926, "udp"},
-{"unimobilectrl", {NULL}, 2927, "tcp"},
-{"unimobilectrl", {NULL}, 2927, "udp"},
-{"redstone-cpss", {NULL}, 2928, "tcp"},
-{"redstone-cpss", {NULL}, 2928, "udp"},
-{"amx-webadmin", {NULL}, 2929, "tcp"},
-{"amx-webadmin", {NULL}, 2929, "udp"},
-{"amx-weblinx", {NULL}, 2930, "tcp"},
-{"amx-weblinx", {NULL}, 2930, "udp"},
-{"circle-x", {NULL}, 2931, "tcp"},
-{"circle-x", {NULL}, 2931, "udp"},
-{"incp", {NULL}, 2932, "tcp"},
-{"incp", {NULL}, 2932, "udp"},
-{"4-tieropmgw", {NULL}, 2933, "tcp"},
-{"4-tieropmgw", {NULL}, 2933, "udp"},
-{"4-tieropmcli", {NULL}, 2934, "tcp"},
-{"4-tieropmcli", {NULL}, 2934, "udp"},
-{"qtp", {NULL}, 2935, "tcp"},
-{"qtp", {NULL}, 2935, "udp"},
-{"otpatch", {NULL}, 2936, "tcp"},
-{"otpatch", {NULL}, 2936, "udp"},
-{"pnaconsult-lm", {NULL}, 2937, "tcp"},
-{"pnaconsult-lm", {NULL}, 2937, "udp"},
-{"sm-pas-1", {NULL}, 2938, "tcp"},
-{"sm-pas-1", {NULL}, 2938, "udp"},
-{"sm-pas-2", {NULL}, 2939, "tcp"},
-{"sm-pas-2", {NULL}, 2939, "udp"},
-{"sm-pas-3", {NULL}, 2940, "tcp"},
-{"sm-pas-3", {NULL}, 2940, "udp"},
-{"sm-pas-4", {NULL}, 2941, "tcp"},
-{"sm-pas-4", {NULL}, 2941, "udp"},
-{"sm-pas-5", {NULL}, 2942, "tcp"},
-{"sm-pas-5", {NULL}, 2942, "udp"},
-{"ttnrepository", {NULL}, 2943, "tcp"},
-{"ttnrepository", {NULL}, 2943, "udp"},
-{"megaco-h248", {NULL}, 2944, "tcp"},
-{"megaco-h248", {NULL}, 2944, "udp"},
-{"megaco-h248", {NULL}, 2944, "sctp"},
-{"h248-binary", {NULL}, 2945, "tcp"},
-{"h248-binary", {NULL}, 2945, "udp"},
-{"h248-binary", {NULL}, 2945, "sctp"},
-{"fjsvmpor", {NULL}, 2946, "tcp"},
-{"fjsvmpor", {NULL}, 2946, "udp"},
-{"gpsd", {NULL}, 2947, "tcp"},
-{"gpsd", {NULL}, 2947, "udp"},
-{"wap-push", {NULL}, 2948, "tcp"},
-{"wap-push", {NULL}, 2948, "udp"},
-{"wap-pushsecure", {NULL}, 2949, "tcp"},
-{"wap-pushsecure", {NULL}, 2949, "udp"},
-{"esip", {NULL}, 2950, "tcp"},
-{"esip", {NULL}, 2950, "udp"},
-{"ottp", {NULL}, 2951, "tcp"},
-{"ottp", {NULL}, 2951, "udp"},
-{"mpfwsas", {NULL}, 2952, "tcp"},
-{"mpfwsas", {NULL}, 2952, "udp"},
-{"ovalarmsrv", {NULL}, 2953, "tcp"},
-{"ovalarmsrv", {NULL}, 2953, "udp"},
-{"ovalarmsrv-cmd", {NULL}, 2954, "tcp"},
-{"ovalarmsrv-cmd", {NULL}, 2954, "udp"},
-{"csnotify", {NULL}, 2955, "tcp"},
-{"csnotify", {NULL}, 2955, "udp"},
-{"ovrimosdbman", {NULL}, 2956, "tcp"},
-{"ovrimosdbman", {NULL}, 2956, "udp"},
-{"jmact5", {NULL}, 2957, "tcp"},
-{"jmact5", {NULL}, 2957, "udp"},
-{"jmact6", {NULL}, 2958, "tcp"},
-{"jmact6", {NULL}, 2958, "udp"},
-{"rmopagt", {NULL}, 2959, "tcp"},
-{"rmopagt", {NULL}, 2959, "udp"},
-{"dfoxserver", {NULL}, 2960, "tcp"},
-{"dfoxserver", {NULL}, 2960, "udp"},
-{"boldsoft-lm", {NULL}, 2961, "tcp"},
-{"boldsoft-lm", {NULL}, 2961, "udp"},
-{"iph-policy-cli", {NULL}, 2962, "tcp"},
-{"iph-policy-cli", {NULL}, 2962, "udp"},
-{"iph-policy-adm", {NULL}, 2963, "tcp"},
-{"iph-policy-adm", {NULL}, 2963, "udp"},
-{"bullant-srap", {NULL}, 2964, "tcp"},
-{"bullant-srap", {NULL}, 2964, "udp"},
-{"bullant-rap", {NULL}, 2965, "tcp"},
-{"bullant-rap", {NULL}, 2965, "udp"},
-{"idp-infotrieve", {NULL}, 2966, "tcp"},
-{"idp-infotrieve", {NULL}, 2966, "udp"},
-{"ssc-agent", {NULL}, 2967, "tcp"},
-{"ssc-agent", {NULL}, 2967, "udp"},
-{"enpp", {NULL}, 2968, "tcp"},
-{"enpp", {NULL}, 2968, "udp"},
-{"essp", {NULL}, 2969, "tcp"},
-{"essp", {NULL}, 2969, "udp"},
-{"index-net", {NULL}, 2970, "tcp"},
-{"index-net", {NULL}, 2970, "udp"},
-{"netclip", {NULL}, 2971, "tcp"},
-{"netclip", {NULL}, 2971, "udp"},
-{"pmsm-webrctl", {NULL}, 2972, "tcp"},
-{"pmsm-webrctl", {NULL}, 2972, "udp"},
-{"svnetworks", {NULL}, 2973, "tcp"},
-{"svnetworks", {NULL}, 2973, "udp"},
-{"signal", {NULL}, 2974, "tcp"},
-{"signal", {NULL}, 2974, "udp"},
-{"fjmpcm", {NULL}, 2975, "tcp"},
-{"fjmpcm", {NULL}, 2975, "udp"},
-{"cns-srv-port", {NULL}, 2976, "tcp"},
-{"cns-srv-port", {NULL}, 2976, "udp"},
-{"ttc-etap-ns", {NULL}, 2977, "tcp"},
-{"ttc-etap-ns", {NULL}, 2977, "udp"},
-{"ttc-etap-ds", {NULL}, 2978, "tcp"},
-{"ttc-etap-ds", {NULL}, 2978, "udp"},
-{"h263-video", {NULL}, 2979, "tcp"},
-{"h263-video", {NULL}, 2979, "udp"},
-{"wimd", {NULL}, 2980, "tcp"},
-{"wimd", {NULL}, 2980, "udp"},
-{"mylxamport", {NULL}, 2981, "tcp"},
-{"mylxamport", {NULL}, 2981, "udp"},
-{"iwb-whiteboard", {NULL}, 2982, "tcp"},
-{"iwb-whiteboard", {NULL}, 2982, "udp"},
-{"netplan", {NULL}, 2983, "tcp"},
-{"netplan", {NULL}, 2983, "udp"},
-{"hpidsadmin", {NULL}, 2984, "tcp"},
-{"hpidsadmin", {NULL}, 2984, "udp"},
-{"hpidsagent", {NULL}, 2985, "tcp"},
-{"hpidsagent", {NULL}, 2985, "udp"},
-{"stonefalls", {NULL}, 2986, "tcp"},
-{"stonefalls", {NULL}, 2986, "udp"},
-{"identify", {NULL}, 2987, "tcp"},
-{"identify", {NULL}, 2987, "udp"},
-{"hippad", {NULL}, 2988, "tcp"},
-{"hippad", {NULL}, 2988, "udp"},
-{"zarkov", {NULL}, 2989, "tcp"},
-{"zarkov", {NULL}, 2989, "udp"},
-{"boscap", {NULL}, 2990, "tcp"},
-{"boscap", {NULL}, 2990, "udp"},
-{"wkstn-mon", {NULL}, 2991, "tcp"},
-{"wkstn-mon", {NULL}, 2991, "udp"},
-{"avenyo", {NULL}, 2992, "tcp"},
-{"avenyo", {NULL}, 2992, "udp"},
-{"veritas-vis1", {NULL}, 2993, "tcp"},
-{"veritas-vis1", {NULL}, 2993, "udp"},
-{"veritas-vis2", {NULL}, 2994, "tcp"},
-{"veritas-vis2", {NULL}, 2994, "udp"},
-{"idrs", {NULL}, 2995, "tcp"},
-{"idrs", {NULL}, 2995, "udp"},
-{"vsixml", {NULL}, 2996, "tcp"},
-{"vsixml", {NULL}, 2996, "udp"},
-{"rebol", {NULL}, 2997, "tcp"},
-{"rebol", {NULL}, 2997, "udp"},
-{"realsecure", {NULL}, 2998, "tcp"},
-{"realsecure", {NULL}, 2998, "udp"},
-{"remoteware-un", {NULL}, 2999, "tcp"},
-{"remoteware-un", {NULL}, 2999, "udp"},
-{"hbci", {NULL}, 3000, "tcp"},
-{"hbci", {NULL}, 3000, "udp"},
-{"remoteware-cl", {NULL}, 3000, "tcp"},
-{"remoteware-cl", {NULL}, 3000, "udp"},
-{"exlm-agent", {NULL}, 3002, "tcp"},
-{"exlm-agent", {NULL}, 3002, "udp"},
-{"remoteware-srv", {NULL}, 3002, "tcp"},
-{"remoteware-srv", {NULL}, 3002, "udp"},
-{"cgms", {NULL}, 3003, "tcp"},
-{"cgms", {NULL}, 3003, "udp"},
-{"csoftragent", {NULL}, 3004, "tcp"},
-{"csoftragent", {NULL}, 3004, "udp"},
-{"geniuslm", {NULL}, 3005, "tcp"},
-{"geniuslm", {NULL}, 3005, "udp"},
-{"ii-admin", {NULL}, 3006, "tcp"},
-{"ii-admin", {NULL}, 3006, "udp"},
-{"lotusmtap", {NULL}, 3007, "tcp"},
-{"lotusmtap", {NULL}, 3007, "udp"},
-{"midnight-tech", {NULL}, 3008, "tcp"},
-{"midnight-tech", {NULL}, 3008, "udp"},
-{"pxc-ntfy", {NULL}, 3009, "tcp"},
-{"pxc-ntfy", {NULL}, 3009, "udp"},
-{"gw", {NULL}, 3010, "tcp"},
-{"ping-pong", {NULL}, 3010, "udp"},
-{"trusted-web", {NULL}, 3011, "tcp"},
-{"trusted-web", {NULL}, 3011, "udp"},
-{"twsdss", {NULL}, 3012, "tcp"},
-{"twsdss", {NULL}, 3012, "udp"},
-{"gilatskysurfer", {NULL}, 3013, "tcp"},
-{"gilatskysurfer", {NULL}, 3013, "udp"},
-{"broker_service", {NULL}, 3014, "tcp"},
-{"broker_service", {NULL}, 3014, "udp"},
-{"nati-dstp", {NULL}, 3015, "tcp"},
-{"nati-dstp", {NULL}, 3015, "udp"},
-{"notify_srvr", {NULL}, 3016, "tcp"},
-{"notify_srvr", {NULL}, 3016, "udp"},
-{"event_listener", {NULL}, 3017, "tcp"},
-{"event_listener", {NULL}, 3017, "udp"},
-{"srvc_registry", {NULL}, 3018, "tcp"},
-{"srvc_registry", {NULL}, 3018, "udp"},
-{"resource_mgr", {NULL}, 3019, "tcp"},
-{"resource_mgr", {NULL}, 3019, "udp"},
-{"cifs", {NULL}, 3020, "tcp"},
-{"cifs", {NULL}, 3020, "udp"},
-{"agriserver", {NULL}, 3021, "tcp"},
-{"agriserver", {NULL}, 3021, "udp"},
-{"csregagent", {NULL}, 3022, "tcp"},
-{"csregagent", {NULL}, 3022, "udp"},
-{"magicnotes", {NULL}, 3023, "tcp"},
-{"magicnotes", {NULL}, 3023, "udp"},
-{"nds_sso", {NULL}, 3024, "tcp"},
-{"nds_sso", {NULL}, 3024, "udp"},
-{"arepa-raft", {NULL}, 3025, "tcp"},
-{"arepa-raft", {NULL}, 3025, "udp"},
-{"agri-gateway", {NULL}, 3026, "tcp"},
-{"agri-gateway", {NULL}, 3026, "udp"},
-{"LiebDevMgmt_C", {NULL}, 3027, "tcp"},
-{"LiebDevMgmt_C", {NULL}, 3027, "udp"},
-{"LiebDevMgmt_DM", {NULL}, 3028, "tcp"},
-{"LiebDevMgmt_DM", {NULL}, 3028, "udp"},
-{"LiebDevMgmt_A", {NULL}, 3029, "tcp"},
-{"LiebDevMgmt_A", {NULL}, 3029, "udp"},
-{"arepa-cas", {NULL}, 3030, "tcp"},
-{"arepa-cas", {NULL}, 3030, "udp"},
-{"eppc", {NULL}, 3031, "tcp"},
-{"eppc", {NULL}, 3031, "udp"},
-{"redwood-chat", {NULL}, 3032, "tcp"},
-{"redwood-chat", {NULL}, 3032, "udp"},
-{"pdb", {NULL}, 3033, "tcp"},
-{"pdb", {NULL}, 3033, "udp"},
-{"osmosis-aeea", {NULL}, 3034, "tcp"},
-{"osmosis-aeea", {NULL}, 3034, "udp"},
-{"fjsv-gssagt", {NULL}, 3035, "tcp"},
-{"fjsv-gssagt", {NULL}, 3035, "udp"},
-{"hagel-dump", {NULL}, 3036, "tcp"},
-{"hagel-dump", {NULL}, 3036, "udp"},
-{"hp-san-mgmt", {NULL}, 3037, "tcp"},
-{"hp-san-mgmt", {NULL}, 3037, "udp"},
-{"santak-ups", {NULL}, 3038, "tcp"},
-{"santak-ups", {NULL}, 3038, "udp"},
-{"cogitate", {NULL}, 3039, "tcp"},
-{"cogitate", {NULL}, 3039, "udp"},
-{"tomato-springs", {NULL}, 3040, "tcp"},
-{"tomato-springs", {NULL}, 3040, "udp"},
-{"di-traceware", {NULL}, 3041, "tcp"},
-{"di-traceware", {NULL}, 3041, "udp"},
-{"journee", {NULL}, 3042, "tcp"},
-{"journee", {NULL}, 3042, "udp"},
-{"brp", {NULL}, 3043, "tcp"},
-{"brp", {NULL}, 3043, "udp"},
-{"epp", {NULL}, 3044, "tcp"},
-{"epp", {NULL}, 3044, "udp"},
-{"responsenet", {NULL}, 3045, "tcp"},
-{"responsenet", {NULL}, 3045, "udp"},
-{"di-ase", {NULL}, 3046, "tcp"},
-{"di-ase", {NULL}, 3046, "udp"},
-{"hlserver", {NULL}, 3047, "tcp"},
-{"hlserver", {NULL}, 3047, "udp"},
-{"pctrader", {NULL}, 3048, "tcp"},
-{"pctrader", {NULL}, 3048, "udp"},
-{"nsws", {NULL}, 3049, "tcp"},
-{"nsws", {NULL}, 3049, "udp"},
-{"gds_db", {NULL}, 3050, "tcp"},
-{"gds_db", {NULL}, 3050, "udp"},
-{"galaxy-server", {NULL}, 3051, "tcp"},
-{"galaxy-server", {NULL}, 3051, "udp"},
-{"apc-3052", {NULL}, 3052, "tcp"},
-{"apc-3052", {NULL}, 3052, "udp"},
-{"dsom-server", {NULL}, 3053, "tcp"},
-{"dsom-server", {NULL}, 3053, "udp"},
-{"amt-cnf-prot", {NULL}, 3054, "tcp"},
-{"amt-cnf-prot", {NULL}, 3054, "udp"},
-{"policyserver", {NULL}, 3055, "tcp"},
-{"policyserver", {NULL}, 3055, "udp"},
-{"cdl-server", {NULL}, 3056, "tcp"},
-{"cdl-server", {NULL}, 3056, "udp"},
-{"goahead-fldup", {NULL}, 3057, "tcp"},
-{"goahead-fldup", {NULL}, 3057, "udp"},
-{"videobeans", {NULL}, 3058, "tcp"},
-{"videobeans", {NULL}, 3058, "udp"},
-{"qsoft", {NULL}, 3059, "tcp"},
-{"qsoft", {NULL}, 3059, "udp"},
-{"interserver", {NULL}, 3060, "tcp"},
-{"interserver", {NULL}, 3060, "udp"},
-{"cautcpd", {NULL}, 3061, "tcp"},
-{"cautcpd", {NULL}, 3061, "udp"},
-{"ncacn-ip-tcp", {NULL}, 3062, "tcp"},
-{"ncacn-ip-tcp", {NULL}, 3062, "udp"},
-{"ncadg-ip-udp", {NULL}, 3063, "tcp"},
-{"ncadg-ip-udp", {NULL}, 3063, "udp"},
-{"rprt", {NULL}, 3064, "tcp"},
-{"rprt", {NULL}, 3064, "udp"},
-{"slinterbase", {NULL}, 3065, "tcp"},
-{"slinterbase", {NULL}, 3065, "udp"},
-{"netattachsdmp", {NULL}, 3066, "tcp"},
-{"netattachsdmp", {NULL}, 3066, "udp"},
-{"fjhpjp", {NULL}, 3067, "tcp"},
-{"fjhpjp", {NULL}, 3067, "udp"},
-{"ls3bcast", {NULL}, 3068, "tcp"},
-{"ls3bcast", {NULL}, 3068, "udp"},
-{"ls3", {NULL}, 3069, "tcp"},
-{"ls3", {NULL}, 3069, "udp"},
-{"mgxswitch", {NULL}, 3070, "tcp"},
-{"mgxswitch", {NULL}, 3070, "udp"},
-{"csd-mgmt-port", {NULL}, 3071, "tcp"},
-{"csd-mgmt-port", {NULL}, 3071, "udp"},
-{"csd-monitor", {NULL}, 3072, "tcp"},
-{"csd-monitor", {NULL}, 3072, "udp"},
-{"vcrp", {NULL}, 3073, "tcp"},
-{"vcrp", {NULL}, 3073, "udp"},
-{"xbox", {NULL}, 3074, "tcp"},
-{"xbox", {NULL}, 3074, "udp"},
-{"orbix-locator", {NULL}, 3075, "tcp"},
-{"orbix-locator", {NULL}, 3075, "udp"},
-{"orbix-config", {NULL}, 3076, "tcp"},
-{"orbix-config", {NULL}, 3076, "udp"},
-{"orbix-loc-ssl", {NULL}, 3077, "tcp"},
-{"orbix-loc-ssl", {NULL}, 3077, "udp"},
-{"orbix-cfg-ssl", {NULL}, 3078, "tcp"},
-{"orbix-cfg-ssl", {NULL}, 3078, "udp"},
-{"lv-frontpanel", {NULL}, 3079, "tcp"},
-{"lv-frontpanel", {NULL}, 3079, "udp"},
-{"stm_pproc", {NULL}, 3080, "tcp"},
-{"stm_pproc", {NULL}, 3080, "udp"},
-{"tl1-lv", {NULL}, 3081, "tcp"},
-{"tl1-lv", {NULL}, 3081, "udp"},
-{"tl1-raw", {NULL}, 3082, "tcp"},
-{"tl1-raw", {NULL}, 3082, "udp"},
-{"tl1-telnet", {NULL}, 3083, "tcp"},
-{"tl1-telnet", {NULL}, 3083, "udp"},
-{"itm-mccs", {NULL}, 3084, "tcp"},
-{"itm-mccs", {NULL}, 3084, "udp"},
-{"pcihreq", {NULL}, 3085, "tcp"},
-{"pcihreq", {NULL}, 3085, "udp"},
-{"jdl-dbkitchen", {NULL}, 3086, "tcp"},
-{"jdl-dbkitchen", {NULL}, 3086, "udp"},
-{"asoki-sma", {NULL}, 3087, "tcp"},
-{"asoki-sma", {NULL}, 3087, "udp"},
-{"xdtp", {NULL}, 3088, "tcp"},
-{"xdtp", {NULL}, 3088, "udp"},
-{"ptk-alink", {NULL}, 3089, "tcp"},
-{"ptk-alink", {NULL}, 3089, "udp"},
-{"stss", {NULL}, 3090, "tcp"},
-{"stss", {NULL}, 3090, "udp"},
-{"1ci-smcs", {NULL}, 3091, "tcp"},
-{"1ci-smcs", {NULL}, 3091, "udp"},
-{"rapidmq-center", {NULL}, 3093, "tcp"},
-{"rapidmq-center", {NULL}, 3093, "udp"},
-{"rapidmq-reg", {NULL}, 3094, "tcp"},
-{"rapidmq-reg", {NULL}, 3094, "udp"},
-{"panasas", {NULL}, 3095, "tcp"},
-{"panasas", {NULL}, 3095, "udp"},
-{"ndl-aps", {NULL}, 3096, "tcp"},
-{"ndl-aps", {NULL}, 3096, "udp"},
-{"itu-bicc-stc", {NULL}, 3097, "sctp"},
-{"umm-port", {NULL}, 3098, "tcp"},
-{"umm-port", {NULL}, 3098, "udp"},
-{"chmd", {NULL}, 3099, "tcp"},
-{"chmd", {NULL}, 3099, "udp"},
-{"opcon-xps", {NULL}, 3100, "tcp"},
-{"opcon-xps", {NULL}, 3100, "udp"},
-{"hp-pxpib", {NULL}, 3101, "tcp"},
-{"hp-pxpib", {NULL}, 3101, "udp"},
-{"slslavemon", {NULL}, 3102, "tcp"},
-{"slslavemon", {NULL}, 3102, "udp"},
-{"autocuesmi", {NULL}, 3103, "tcp"},
-{"autocuesmi", {NULL}, 3103, "udp"},
-{"autocuelog", {NULL}, 3104, "tcp"},
-{"autocuetime", {NULL}, 3104, "udp"},
-{"cardbox", {NULL}, 3105, "tcp"},
-{"cardbox", {NULL}, 3105, "udp"},
-{"cardbox-http", {NULL}, 3106, "tcp"},
-{"cardbox-http", {NULL}, 3106, "udp"},
-{"business", {NULL}, 3107, "tcp"},
-{"business", {NULL}, 3107, "udp"},
-{"geolocate", {NULL}, 3108, "tcp"},
-{"geolocate", {NULL}, 3108, "udp"},
-{"personnel", {NULL}, 3109, "tcp"},
-{"personnel", {NULL}, 3109, "udp"},
-{"sim-control", {NULL}, 3110, "tcp"},
-{"sim-control", {NULL}, 3110, "udp"},
-{"wsynch", {NULL}, 3111, "tcp"},
-{"wsynch", {NULL}, 3111, "udp"},
-{"ksysguard", {NULL}, 3112, "tcp"},
-{"ksysguard", {NULL}, 3112, "udp"},
-{"cs-auth-svr", {NULL}, 3113, "tcp"},
-{"cs-auth-svr", {NULL}, 3113, "udp"},
-{"ccmad", {NULL}, 3114, "tcp"},
-{"ccmad", {NULL}, 3114, "udp"},
-{"mctet-master", {NULL}, 3115, "tcp"},
-{"mctet-master", {NULL}, 3115, "udp"},
-{"mctet-gateway", {NULL}, 3116, "tcp"},
-{"mctet-gateway", {NULL}, 3116, "udp"},
-{"mctet-jserv", {NULL}, 3117, "tcp"},
-{"mctet-jserv", {NULL}, 3117, "udp"},
-{"pkagent", {NULL}, 3118, "tcp"},
-{"pkagent", {NULL}, 3118, "udp"},
-{"d2000kernel", {NULL}, 3119, "tcp"},
-{"d2000kernel", {NULL}, 3119, "udp"},
-{"d2000webserver", {NULL}, 3120, "tcp"},
-{"d2000webserver", {NULL}, 3120, "udp"},
-{"vtr-emulator", {NULL}, 3122, "tcp"},
-{"vtr-emulator", {NULL}, 3122, "udp"},
-{"edix", {NULL}, 3123, "tcp"},
-{"edix", {NULL}, 3123, "udp"},
-{"beacon-port", {NULL}, 3124, "tcp"},
-{"beacon-port", {NULL}, 3124, "udp"},
-{"a13-an", {NULL}, 3125, "tcp"},
-{"a13-an", {NULL}, 3125, "udp"},
-{"ctx-bridge", {NULL}, 3127, "tcp"},
-{"ctx-bridge", {NULL}, 3127, "udp"},
-{"ndl-aas", {NULL}, 3128, "tcp"},
-{"ndl-aas", {NULL}, 3128, "udp"},
-{"netport-id", {NULL}, 3129, "tcp"},
-{"netport-id", {NULL}, 3129, "udp"},
-{"icpv2", {NULL}, 3130, "tcp"},
-{"icpv2", {NULL}, 3130, "udp"},
-{"netbookmark", {NULL}, 3131, "tcp"},
-{"netbookmark", {NULL}, 3131, "udp"},
-{"ms-rule-engine", {NULL}, 3132, "tcp"},
-{"ms-rule-engine", {NULL}, 3132, "udp"},
-{"prism-deploy", {NULL}, 3133, "tcp"},
-{"prism-deploy", {NULL}, 3133, "udp"},
-{"ecp", {NULL}, 3134, "tcp"},
-{"ecp", {NULL}, 3134, "udp"},
-{"peerbook-port", {NULL}, 3135, "tcp"},
-{"peerbook-port", {NULL}, 3135, "udp"},
-{"grubd", {NULL}, 3136, "tcp"},
-{"grubd", {NULL}, 3136, "udp"},
-{"rtnt-1", {NULL}, 3137, "tcp"},
-{"rtnt-1", {NULL}, 3137, "udp"},
-{"rtnt-2", {NULL}, 3138, "tcp"},
-{"rtnt-2", {NULL}, 3138, "udp"},
-{"incognitorv", {NULL}, 3139, "tcp"},
-{"incognitorv", {NULL}, 3139, "udp"},
-{"ariliamulti", {NULL}, 3140, "tcp"},
-{"ariliamulti", {NULL}, 3140, "udp"},
-{"vmodem", {NULL}, 3141, "tcp"},
-{"vmodem", {NULL}, 3141, "udp"},
-{"rdc-wh-eos", {NULL}, 3142, "tcp"},
-{"rdc-wh-eos", {NULL}, 3142, "udp"},
-{"seaview", {NULL}, 3143, "tcp"},
-{"seaview", {NULL}, 3143, "udp"},
-{"tarantella", {NULL}, 3144, "tcp"},
-{"tarantella", {NULL}, 3144, "udp"},
-{"csi-lfap", {NULL}, 3145, "tcp"},
-{"csi-lfap", {NULL}, 3145, "udp"},
-{"bears-02", {NULL}, 3146, "tcp"},
-{"bears-02", {NULL}, 3146, "udp"},
-{"rfio", {NULL}, 3147, "tcp"},
-{"rfio", {NULL}, 3147, "udp"},
-{"nm-game-admin", {NULL}, 3148, "tcp"},
-{"nm-game-admin", {NULL}, 3148, "udp"},
-{"nm-game-server", {NULL}, 3149, "tcp"},
-{"nm-game-server", {NULL}, 3149, "udp"},
-{"nm-asses-admin", {NULL}, 3150, "tcp"},
-{"nm-asses-admin", {NULL}, 3150, "udp"},
-{"nm-assessor", {NULL}, 3151, "tcp"},
-{"nm-assessor", {NULL}, 3151, "udp"},
-{"feitianrockey", {NULL}, 3152, "tcp"},
-{"feitianrockey", {NULL}, 3152, "udp"},
-{"s8-client-port", {NULL}, 3153, "tcp"},
-{"s8-client-port", {NULL}, 3153, "udp"},
-{"ccmrmi", {NULL}, 3154, "tcp"},
-{"ccmrmi", {NULL}, 3154, "udp"},
-{"jpegmpeg", {NULL}, 3155, "tcp"},
-{"jpegmpeg", {NULL}, 3155, "udp"},
-{"indura", {NULL}, 3156, "tcp"},
-{"indura", {NULL}, 3156, "udp"},
-{"e3consultants", {NULL}, 3157, "tcp"},
-{"e3consultants", {NULL}, 3157, "udp"},
-{"stvp", {NULL}, 3158, "tcp"},
-{"stvp", {NULL}, 3158, "udp"},
-{"navegaweb-port", {NULL}, 3159, "tcp"},
-{"navegaweb-port", {NULL}, 3159, "udp"},
-{"tip-app-server", {NULL}, 3160, "tcp"},
-{"tip-app-server", {NULL}, 3160, "udp"},
-{"doc1lm", {NULL}, 3161, "tcp"},
-{"doc1lm", {NULL}, 3161, "udp"},
-{"sflm", {NULL}, 3162, "tcp"},
-{"sflm", {NULL}, 3162, "udp"},
-{"res-sap", {NULL}, 3163, "tcp"},
-{"res-sap", {NULL}, 3163, "udp"},
-{"imprs", {NULL}, 3164, "tcp"},
-{"imprs", {NULL}, 3164, "udp"},
-{"newgenpay", {NULL}, 3165, "tcp"},
-{"newgenpay", {NULL}, 3165, "udp"},
-{"sossecollector", {NULL}, 3166, "tcp"},
-{"sossecollector", {NULL}, 3166, "udp"},
-{"nowcontact", {NULL}, 3167, "tcp"},
-{"nowcontact", {NULL}, 3167, "udp"},
-{"poweronnud", {NULL}, 3168, "tcp"},
-{"poweronnud", {NULL}, 3168, "udp"},
-{"serverview-as", {NULL}, 3169, "tcp"},
-{"serverview-as", {NULL}, 3169, "udp"},
-{"serverview-asn", {NULL}, 3170, "tcp"},
-{"serverview-asn", {NULL}, 3170, "udp"},
-{"serverview-gf", {NULL}, 3171, "tcp"},
-{"serverview-gf", {NULL}, 3171, "udp"},
-{"serverview-rm", {NULL}, 3172, "tcp"},
-{"serverview-rm", {NULL}, 3172, "udp"},
-{"serverview-icc", {NULL}, 3173, "tcp"},
-{"serverview-icc", {NULL}, 3173, "udp"},
-{"armi-server", {NULL}, 3174, "tcp"},
-{"armi-server", {NULL}, 3174, "udp"},
-{"t1-e1-over-ip", {NULL}, 3175, "tcp"},
-{"t1-e1-over-ip", {NULL}, 3175, "udp"},
-{"ars-master", {NULL}, 3176, "tcp"},
-{"ars-master", {NULL}, 3176, "udp"},
-{"phonex-port", {NULL}, 3177, "tcp"},
-{"phonex-port", {NULL}, 3177, "udp"},
-{"radclientport", {NULL}, 3178, "tcp"},
-{"radclientport", {NULL}, 3178, "udp"},
-{"h2gf-w-2m", {NULL}, 3179, "tcp"},
-{"h2gf-w-2m", {NULL}, 3179, "udp"},
-{"mc-brk-srv", {NULL}, 3180, "tcp"},
-{"mc-brk-srv", {NULL}, 3180, "udp"},
-{"bmcpatrolagent", {NULL}, 3181, "tcp"},
-{"bmcpatrolagent", {NULL}, 3181, "udp"},
-{"bmcpatrolrnvu", {NULL}, 3182, "tcp"},
-{"bmcpatrolrnvu", {NULL}, 3182, "udp"},
-{"cops-tls", {NULL}, 3183, "tcp"},
-{"cops-tls", {NULL}, 3183, "udp"},
-{"apogeex-port", {NULL}, 3184, "tcp"},
-{"apogeex-port", {NULL}, 3184, "udp"},
-{"smpppd", {NULL}, 3185, "tcp"},
-{"smpppd", {NULL}, 3185, "udp"},
-{"iiw-port", {NULL}, 3186, "tcp"},
-{"iiw-port", {NULL}, 3186, "udp"},
-{"odi-port", {NULL}, 3187, "tcp"},
-{"odi-port", {NULL}, 3187, "udp"},
-{"brcm-comm-port", {NULL}, 3188, "tcp"},
-{"brcm-comm-port", {NULL}, 3188, "udp"},
-{"pcle-infex", {NULL}, 3189, "tcp"},
-{"pcle-infex", {NULL}, 3189, "udp"},
-{"csvr-proxy", {NULL}, 3190, "tcp"},
-{"csvr-proxy", {NULL}, 3190, "udp"},
-{"csvr-sslproxy", {NULL}, 3191, "tcp"},
-{"csvr-sslproxy", {NULL}, 3191, "udp"},
-{"firemonrcc", {NULL}, 3192, "tcp"},
-{"firemonrcc", {NULL}, 3192, "udp"},
-{"spandataport", {NULL}, 3193, "tcp"},
-{"spandataport", {NULL}, 3193, "udp"},
-{"magbind", {NULL}, 3194, "tcp"},
-{"magbind", {NULL}, 3194, "udp"},
-{"ncu-1", {NULL}, 3195, "tcp"},
-{"ncu-1", {NULL}, 3195, "udp"},
-{"ncu-2", {NULL}, 3196, "tcp"},
-{"ncu-2", {NULL}, 3196, "udp"},
-{"embrace-dp-s", {NULL}, 3197, "tcp"},
-{"embrace-dp-s", {NULL}, 3197, "udp"},
-{"embrace-dp-c", {NULL}, 3198, "tcp"},
-{"embrace-dp-c", {NULL}, 3198, "udp"},
-{"dmod-workspace", {NULL}, 3199, "tcp"},
-{"dmod-workspace", {NULL}, 3199, "udp"},
-{"tick-port", {NULL}, 3200, "tcp"},
-{"tick-port", {NULL}, 3200, "udp"},
-{"cpq-tasksmart", {NULL}, 3201, "tcp"},
-{"cpq-tasksmart", {NULL}, 3201, "udp"},
-{"intraintra", {NULL}, 3202, "tcp"},
-{"intraintra", {NULL}, 3202, "udp"},
-{"netwatcher-mon", {NULL}, 3203, "tcp"},
-{"netwatcher-mon", {NULL}, 3203, "udp"},
-{"netwatcher-db", {NULL}, 3204, "tcp"},
-{"netwatcher-db", {NULL}, 3204, "udp"},
-{"isns", {NULL}, 3205, "tcp"},
-{"isns", {NULL}, 3205, "udp"},
-{"ironmail", {NULL}, 3206, "tcp"},
-{"ironmail", {NULL}, 3206, "udp"},
-{"vx-auth-port", {NULL}, 3207, "tcp"},
-{"vx-auth-port", {NULL}, 3207, "udp"},
-{"pfu-prcallback", {NULL}, 3208, "tcp"},
-{"pfu-prcallback", {NULL}, 3208, "udp"},
-{"netwkpathengine", {NULL}, 3209, "tcp"},
-{"netwkpathengine", {NULL}, 3209, "udp"},
-{"flamenco-proxy", {NULL}, 3210, "tcp"},
-{"flamenco-proxy", {NULL}, 3210, "udp"},
-{"avsecuremgmt", {NULL}, 3211, "tcp"},
-{"avsecuremgmt", {NULL}, 3211, "udp"},
-{"surveyinst", {NULL}, 3212, "tcp"},
-{"surveyinst", {NULL}, 3212, "udp"},
-{"neon24x7", {NULL}, 3213, "tcp"},
-{"neon24x7", {NULL}, 3213, "udp"},
-{"jmq-daemon-1", {NULL}, 3214, "tcp"},
-{"jmq-daemon-1", {NULL}, 3214, "udp"},
-{"jmq-daemon-2", {NULL}, 3215, "tcp"},
-{"jmq-daemon-2", {NULL}, 3215, "udp"},
-{"ferrari-foam", {NULL}, 3216, "tcp"},
-{"ferrari-foam", {NULL}, 3216, "udp"},
-{"unite", {NULL}, 3217, "tcp"},
-{"unite", {NULL}, 3217, "udp"},
-{"smartpackets", {NULL}, 3218, "tcp"},
-{"smartpackets", {NULL}, 3218, "udp"},
-{"wms-messenger", {NULL}, 3219, "tcp"},
-{"wms-messenger", {NULL}, 3219, "udp"},
-{"xnm-ssl", {NULL}, 3220, "tcp"},
-{"xnm-ssl", {NULL}, 3220, "udp"},
-{"xnm-clear-text", {NULL}, 3221, "tcp"},
-{"xnm-clear-text", {NULL}, 3221, "udp"},
-{"glbp", {NULL}, 3222, "tcp"},
-{"glbp", {NULL}, 3222, "udp"},
-{"digivote", {NULL}, 3223, "tcp"},
-{"digivote", {NULL}, 3223, "udp"},
-{"aes-discovery", {NULL}, 3224, "tcp"},
-{"aes-discovery", {NULL}, 3224, "udp"},
-{"fcip-port", {NULL}, 3225, "tcp"},
-{"fcip-port", {NULL}, 3225, "udp"},
-{"isi-irp", {NULL}, 3226, "tcp"},
-{"isi-irp", {NULL}, 3226, "udp"},
-{"dwnmshttp", {NULL}, 3227, "tcp"},
-{"dwnmshttp", {NULL}, 3227, "udp"},
-{"dwmsgserver", {NULL}, 3228, "tcp"},
-{"dwmsgserver", {NULL}, 3228, "udp"},
-{"global-cd-port", {NULL}, 3229, "tcp"},
-{"global-cd-port", {NULL}, 3229, "udp"},
-{"sftdst-port", {NULL}, 3230, "tcp"},
-{"sftdst-port", {NULL}, 3230, "udp"},
-{"vidigo", {NULL}, 3231, "tcp"},
-{"vidigo", {NULL}, 3231, "udp"},
-{"mdtp", {NULL}, 3232, "tcp"},
-{"mdtp", {NULL}, 3232, "udp"},
-{"whisker", {NULL}, 3233, "tcp"},
-{"whisker", {NULL}, 3233, "udp"},
-{"alchemy", {NULL}, 3234, "tcp"},
-{"alchemy", {NULL}, 3234, "udp"},
-{"mdap-port", {NULL}, 3235, "tcp"},
-{"mdap-port", {NULL}, 3235, "udp"},
-{"apparenet-ts", {NULL}, 3236, "tcp"},
-{"apparenet-ts", {NULL}, 3236, "udp"},
-{"apparenet-tps", {NULL}, 3237, "tcp"},
-{"apparenet-tps", {NULL}, 3237, "udp"},
-{"apparenet-as", {NULL}, 3238, "tcp"},
-{"apparenet-as", {NULL}, 3238, "udp"},
-{"apparenet-ui", {NULL}, 3239, "tcp"},
-{"apparenet-ui", {NULL}, 3239, "udp"},
-{"triomotion", {NULL}, 3240, "tcp"},
-{"triomotion", {NULL}, 3240, "udp"},
-{"sysorb", {NULL}, 3241, "tcp"},
-{"sysorb", {NULL}, 3241, "udp"},
-{"sdp-id-port", {NULL}, 3242, "tcp"},
-{"sdp-id-port", {NULL}, 3242, "udp"},
-{"timelot", {NULL}, 3243, "tcp"},
-{"timelot", {NULL}, 3243, "udp"},
-{"onesaf", {NULL}, 3244, "tcp"},
-{"onesaf", {NULL}, 3244, "udp"},
-{"vieo-fe", {NULL}, 3245, "tcp"},
-{"vieo-fe", {NULL}, 3245, "udp"},
-{"dvt-system", {NULL}, 3246, "tcp"},
-{"dvt-system", {NULL}, 3246, "udp"},
-{"dvt-data", {NULL}, 3247, "tcp"},
-{"dvt-data", {NULL}, 3247, "udp"},
-{"procos-lm", {NULL}, 3248, "tcp"},
-{"procos-lm", {NULL}, 3248, "udp"},
-{"ssp", {NULL}, 3249, "tcp"},
-{"ssp", {NULL}, 3249, "udp"},
-{"hicp", {NULL}, 3250, "tcp"},
-{"hicp", {NULL}, 3250, "udp"},
-{"sysscanner", {NULL}, 3251, "tcp"},
-{"sysscanner", {NULL}, 3251, "udp"},
-{"dhe", {NULL}, 3252, "tcp"},
-{"dhe", {NULL}, 3252, "udp"},
-{"pda-data", {NULL}, 3253, "tcp"},
-{"pda-data", {NULL}, 3253, "udp"},
-{"pda-sys", {NULL}, 3254, "tcp"},
-{"pda-sys", {NULL}, 3254, "udp"},
-{"semaphore", {NULL}, 3255, "tcp"},
-{"semaphore", {NULL}, 3255, "udp"},
-{"cpqrpm-agent", {NULL}, 3256, "tcp"},
-{"cpqrpm-agent", {NULL}, 3256, "udp"},
-{"cpqrpm-server", {NULL}, 3257, "tcp"},
-{"cpqrpm-server", {NULL}, 3257, "udp"},
-{"ivecon-port", {NULL}, 3258, "tcp"},
-{"ivecon-port", {NULL}, 3258, "udp"},
-{"epncdp2", {NULL}, 3259, "tcp"},
-{"epncdp2", {NULL}, 3259, "udp"},
-{"iscsi-target", {NULL}, 3260, "tcp"},
-{"iscsi-target", {NULL}, 3260, "udp"},
-{"winshadow", {NULL}, 3261, "tcp"},
-{"winshadow", {NULL}, 3261, "udp"},
-{"necp", {NULL}, 3262, "tcp"},
-{"necp", {NULL}, 3262, "udp"},
-{"ecolor-imager", {NULL}, 3263, "tcp"},
-{"ecolor-imager", {NULL}, 3263, "udp"},
-{"ccmail", {NULL}, 3264, "tcp"},
-{"ccmail", {NULL}, 3264, "udp"},
-{"altav-tunnel", {NULL}, 3265, "tcp"},
-{"altav-tunnel", {NULL}, 3265, "udp"},
-{"ns-cfg-server", {NULL}, 3266, "tcp"},
-{"ns-cfg-server", {NULL}, 3266, "udp"},
-{"ibm-dial-out", {NULL}, 3267, "tcp"},
-{"ibm-dial-out", {NULL}, 3267, "udp"},
-{"msft-gc", {NULL}, 3268, "tcp"},
-{"msft-gc", {NULL}, 3268, "udp"},
-{"msft-gc-ssl", {NULL}, 3269, "tcp"},
-{"msft-gc-ssl", {NULL}, 3269, "udp"},
-{"verismart", {NULL}, 3270, "tcp"},
-{"verismart", {NULL}, 3270, "udp"},
-{"csoft-prev", {NULL}, 3271, "tcp"},
-{"csoft-prev", {NULL}, 3271, "udp"},
-{"user-manager", {NULL}, 3272, "tcp"},
-{"user-manager", {NULL}, 3272, "udp"},
-{"sxmp", {NULL}, 3273, "tcp"},
-{"sxmp", {NULL}, 3273, "udp"},
-{"ordinox-server", {NULL}, 3274, "tcp"},
-{"ordinox-server", {NULL}, 3274, "udp"},
-{"samd", {NULL}, 3275, "tcp"},
-{"samd", {NULL}, 3275, "udp"},
-{"maxim-asics", {NULL}, 3276, "tcp"},
-{"maxim-asics", {NULL}, 3276, "udp"},
-{"awg-proxy", {NULL}, 3277, "tcp"},
-{"awg-proxy", {NULL}, 3277, "udp"},
-{"lkcmserver", {NULL}, 3278, "tcp"},
-{"lkcmserver", {NULL}, 3278, "udp"},
-{"admind", {NULL}, 3279, "tcp"},
-{"admind", {NULL}, 3279, "udp"},
-{"vs-server", {NULL}, 3280, "tcp"},
-{"vs-server", {NULL}, 3280, "udp"},
-{"sysopt", {NULL}, 3281, "tcp"},
-{"sysopt", {NULL}, 3281, "udp"},
-{"datusorb", {NULL}, 3282, "tcp"},
-{"datusorb", {NULL}, 3282, "udp"},
-{"net-assistant", {NULL}, 3283, "tcp"},
-{"net-assistant", {NULL}, 3283, "udp"},
-{"4talk", {NULL}, 3284, "tcp"},
-{"4talk", {NULL}, 3284, "udp"},
-{"plato", {NULL}, 3285, "tcp"},
-{"plato", {NULL}, 3285, "udp"},
-{"e-net", {NULL}, 3286, "tcp"},
-{"e-net", {NULL}, 3286, "udp"},
-{"directvdata", {NULL}, 3287, "tcp"},
-{"directvdata", {NULL}, 3287, "udp"},
-{"cops", {NULL}, 3288, "tcp"},
-{"cops", {NULL}, 3288, "udp"},
-{"enpc", {NULL}, 3289, "tcp"},
-{"enpc", {NULL}, 3289, "udp"},
-{"caps-lm", {NULL}, 3290, "tcp"},
-{"caps-lm", {NULL}, 3290, "udp"},
-{"sah-lm", {NULL}, 3291, "tcp"},
-{"sah-lm", {NULL}, 3291, "udp"},
-{"cart-o-rama", {NULL}, 3292, "tcp"},
-{"cart-o-rama", {NULL}, 3292, "udp"},
-{"fg-fps", {NULL}, 3293, "tcp"},
-{"fg-fps", {NULL}, 3293, "udp"},
-{"fg-gip", {NULL}, 3294, "tcp"},
-{"fg-gip", {NULL}, 3294, "udp"},
-{"dyniplookup", {NULL}, 3295, "tcp"},
-{"dyniplookup", {NULL}, 3295, "udp"},
-{"rib-slm", {NULL}, 3296, "tcp"},
-{"rib-slm", {NULL}, 3296, "udp"},
-{"cytel-lm", {NULL}, 3297, "tcp"},
-{"cytel-lm", {NULL}, 3297, "udp"},
-{"deskview", {NULL}, 3298, "tcp"},
-{"deskview", {NULL}, 3298, "udp"},
-{"pdrncs", {NULL}, 3299, "tcp"},
-{"pdrncs", {NULL}, 3299, "udp"},
-{"mcs-fastmail", {NULL}, 3302, "tcp"},
-{"mcs-fastmail", {NULL}, 3302, "udp"},
-{"opsession-clnt", {NULL}, 3303, "tcp"},
-{"opsession-clnt", {NULL}, 3303, "udp"},
-{"opsession-srvr", {NULL}, 3304, "tcp"},
-{"opsession-srvr", {NULL}, 3304, "udp"},
-{"odette-ftp", {NULL}, 3305, "tcp"},
-{"odette-ftp", {NULL}, 3305, "udp"},
-{"mysql", {NULL}, 3306, "tcp"},
-{"mysql", {NULL}, 3306, "udp"},
-{"opsession-prxy", {NULL}, 3307, "tcp"},
-{"opsession-prxy", {NULL}, 3307, "udp"},
-{"tns-server", {NULL}, 3308, "tcp"},
-{"tns-server", {NULL}, 3308, "udp"},
-{"tns-adv", {NULL}, 3309, "tcp"},
-{"tns-adv", {NULL}, 3309, "udp"},
-{"dyna-access", {NULL}, 3310, "tcp"},
-{"dyna-access", {NULL}, 3310, "udp"},
-{"mcns-tel-ret", {NULL}, 3311, "tcp"},
-{"mcns-tel-ret", {NULL}, 3311, "udp"},
-{"appman-server", {NULL}, 3312, "tcp"},
-{"appman-server", {NULL}, 3312, "udp"},
-{"uorb", {NULL}, 3313, "tcp"},
-{"uorb", {NULL}, 3313, "udp"},
-{"uohost", {NULL}, 3314, "tcp"},
-{"uohost", {NULL}, 3314, "udp"},
-{"cdid", {NULL}, 3315, "tcp"},
-{"cdid", {NULL}, 3315, "udp"},
-{"aicc-cmi", {NULL}, 3316, "tcp"},
-{"aicc-cmi", {NULL}, 3316, "udp"},
-{"vsaiport", {NULL}, 3317, "tcp"},
-{"vsaiport", {NULL}, 3317, "udp"},
-{"ssrip", {NULL}, 3318, "tcp"},
-{"ssrip", {NULL}, 3318, "udp"},
-{"sdt-lmd", {NULL}, 3319, "tcp"},
-{"sdt-lmd", {NULL}, 3319, "udp"},
-{"officelink2000", {NULL}, 3320, "tcp"},
-{"officelink2000", {NULL}, 3320, "udp"},
-{"vnsstr", {NULL}, 3321, "tcp"},
-{"vnsstr", {NULL}, 3321, "udp"},
-{"sftu", {NULL}, 3326, "tcp"},
-{"sftu", {NULL}, 3326, "udp"},
-{"bbars", {NULL}, 3327, "tcp"},
-{"bbars", {NULL}, 3327, "udp"},
-{"egptlm", {NULL}, 3328, "tcp"},
-{"egptlm", {NULL}, 3328, "udp"},
-{"hp-device-disc", {NULL}, 3329, "tcp"},
-{"hp-device-disc", {NULL}, 3329, "udp"},
-{"mcs-calypsoicf", {NULL}, 3330, "tcp"},
-{"mcs-calypsoicf", {NULL}, 3330, "udp"},
-{"mcs-messaging", {NULL}, 3331, "tcp"},
-{"mcs-messaging", {NULL}, 3331, "udp"},
-{"mcs-mailsvr", {NULL}, 3332, "tcp"},
-{"mcs-mailsvr", {NULL}, 3332, "udp"},
-{"dec-notes", {NULL}, 3333, "tcp"},
-{"dec-notes", {NULL}, 3333, "udp"},
-{"directv-web", {NULL}, 3334, "tcp"},
-{"directv-web", {NULL}, 3334, "udp"},
-{"directv-soft", {NULL}, 3335, "tcp"},
-{"directv-soft", {NULL}, 3335, "udp"},
-{"directv-tick", {NULL}, 3336, "tcp"},
-{"directv-tick", {NULL}, 3336, "udp"},
-{"directv-catlg", {NULL}, 3337, "tcp"},
-{"directv-catlg", {NULL}, 3337, "udp"},
-{"anet-b", {NULL}, 3338, "tcp"},
-{"anet-b", {NULL}, 3338, "udp"},
-{"anet-l", {NULL}, 3339, "tcp"},
-{"anet-l", {NULL}, 3339, "udp"},
-{"anet-m", {NULL}, 3340, "tcp"},
-{"anet-m", {NULL}, 3340, "udp"},
-{"anet-h", {NULL}, 3341, "tcp"},
-{"anet-h", {NULL}, 3341, "udp"},
-{"webtie", {NULL}, 3342, "tcp"},
-{"webtie", {NULL}, 3342, "udp"},
-{"ms-cluster-net", {NULL}, 3343, "tcp"},
-{"ms-cluster-net", {NULL}, 3343, "udp"},
-{"bnt-manager", {NULL}, 3344, "tcp"},
-{"bnt-manager", {NULL}, 3344, "udp"},
-{"influence", {NULL}, 3345, "tcp"},
-{"influence", {NULL}, 3345, "udp"},
-{"trnsprntproxy", {NULL}, 3346, "tcp"},
-{"trnsprntproxy", {NULL}, 3346, "udp"},
-{"phoenix-rpc", {NULL}, 3347, "tcp"},
-{"phoenix-rpc", {NULL}, 3347, "udp"},
-{"pangolin-laser", {NULL}, 3348, "tcp"},
-{"pangolin-laser", {NULL}, 3348, "udp"},
-{"chevinservices", {NULL}, 3349, "tcp"},
-{"chevinservices", {NULL}, 3349, "udp"},
-{"findviatv", {NULL}, 3350, "tcp"},
-{"findviatv", {NULL}, 3350, "udp"},
-{"btrieve", {NULL}, 3351, "tcp"},
-{"btrieve", {NULL}, 3351, "udp"},
-{"ssql", {NULL}, 3352, "tcp"},
-{"ssql", {NULL}, 3352, "udp"},
-{"fatpipe", {NULL}, 3353, "tcp"},
-{"fatpipe", {NULL}, 3353, "udp"},
-{"suitjd", {NULL}, 3354, "tcp"},
-{"suitjd", {NULL}, 3354, "udp"},
-{"ordinox-dbase", {NULL}, 3355, "tcp"},
-{"ordinox-dbase", {NULL}, 3355, "udp"},
-{"upnotifyps", {NULL}, 3356, "tcp"},
-{"upnotifyps", {NULL}, 3356, "udp"},
-{"adtech-test", {NULL}, 3357, "tcp"},
-{"adtech-test", {NULL}, 3357, "udp"},
-{"mpsysrmsvr", {NULL}, 3358, "tcp"},
-{"mpsysrmsvr", {NULL}, 3358, "udp"},
-{"wg-netforce", {NULL}, 3359, "tcp"},
-{"wg-netforce", {NULL}, 3359, "udp"},
-{"kv-server", {NULL}, 3360, "tcp"},
-{"kv-server", {NULL}, 3360, "udp"},
-{"kv-agent", {NULL}, 3361, "tcp"},
-{"kv-agent", {NULL}, 3361, "udp"},
-{"dj-ilm", {NULL}, 3362, "tcp"},
-{"dj-ilm", {NULL}, 3362, "udp"},
-{"nati-vi-server", {NULL}, 3363, "tcp"},
-{"nati-vi-server", {NULL}, 3363, "udp"},
-{"creativeserver", {NULL}, 3364, "tcp"},
-{"creativeserver", {NULL}, 3364, "udp"},
-{"contentserver", {NULL}, 3365, "tcp"},
-{"contentserver", {NULL}, 3365, "udp"},
-{"creativepartnr", {NULL}, 3366, "tcp"},
-{"creativepartnr", {NULL}, 3366, "udp"},
-{"tip2", {NULL}, 3372, "tcp"},
-{"tip2", {NULL}, 3372, "udp"},
-{"lavenir-lm", {NULL}, 3373, "tcp"},
-{"lavenir-lm", {NULL}, 3373, "udp"},
-{"cluster-disc", {NULL}, 3374, "tcp"},
-{"cluster-disc", {NULL}, 3374, "udp"},
-{"vsnm-agent", {NULL}, 3375, "tcp"},
-{"vsnm-agent", {NULL}, 3375, "udp"},
-{"cdbroker", {NULL}, 3376, "tcp"},
-{"cdbroker", {NULL}, 3376, "udp"},
-{"cogsys-lm", {NULL}, 3377, "tcp"},
-{"cogsys-lm", {NULL}, 3377, "udp"},
-{"wsicopy", {NULL}, 3378, "tcp"},
-{"wsicopy", {NULL}, 3378, "udp"},
-{"socorfs", {NULL}, 3379, "tcp"},
-{"socorfs", {NULL}, 3379, "udp"},
-{"sns-channels", {NULL}, 3380, "tcp"},
-{"sns-channels", {NULL}, 3380, "udp"},
-{"geneous", {NULL}, 3381, "tcp"},
-{"geneous", {NULL}, 3381, "udp"},
-{"fujitsu-neat", {NULL}, 3382, "tcp"},
-{"fujitsu-neat", {NULL}, 3382, "udp"},
-{"esp-lm", {NULL}, 3383, "tcp"},
-{"esp-lm", {NULL}, 3383, "udp"},
-{"hp-clic", {NULL}, 3384, "tcp"},
-{"hp-clic", {NULL}, 3384, "udp"},
-{"qnxnetman", {NULL}, 3385, "tcp"},
-{"qnxnetman", {NULL}, 3385, "udp"},
-{"gprs-data", {NULL}, 3386, "tcp"},
-{"gprs-sig", {NULL}, 3386, "udp"},
-{"backroomnet", {NULL}, 3387, "tcp"},
-{"backroomnet", {NULL}, 3387, "udp"},
-{"cbserver", {NULL}, 3388, "tcp"},
-{"cbserver", {NULL}, 3388, "udp"},
-{"ms-wbt-server", {NULL}, 3389, "tcp"},
-{"ms-wbt-server", {NULL}, 3389, "udp"},
-{"dsc", {NULL}, 3390, "tcp"},
-{"dsc", {NULL}, 3390, "udp"},
-{"savant", {NULL}, 3391, "tcp"},
-{"savant", {NULL}, 3391, "udp"},
-{"efi-lm", {NULL}, 3392, "tcp"},
-{"efi-lm", {NULL}, 3392, "udp"},
-{"d2k-tapestry1", {NULL}, 3393, "tcp"},
-{"d2k-tapestry1", {NULL}, 3393, "udp"},
-{"d2k-tapestry2", {NULL}, 3394, "tcp"},
-{"d2k-tapestry2", {NULL}, 3394, "udp"},
-{"dyna-lm", {NULL}, 3395, "tcp"},
-{"dyna-lm", {NULL}, 3395, "udp"},
-{"printer_agent", {NULL}, 3396, "tcp"},
-{"printer_agent", {NULL}, 3396, "udp"},
-{"cloanto-lm", {NULL}, 3397, "tcp"},
-{"cloanto-lm", {NULL}, 3397, "udp"},
-{"mercantile", {NULL}, 3398, "tcp"},
-{"mercantile", {NULL}, 3398, "udp"},
-{"csms", {NULL}, 3399, "tcp"},
-{"csms", {NULL}, 3399, "udp"},
-{"csms2", {NULL}, 3400, "tcp"},
-{"csms2", {NULL}, 3400, "udp"},
-{"filecast", {NULL}, 3401, "tcp"},
-{"filecast", {NULL}, 3401, "udp"},
-{"fxaengine-net", {NULL}, 3402, "tcp"},
-{"fxaengine-net", {NULL}, 3402, "udp"},
-{"nokia-ann-ch1", {NULL}, 3405, "tcp"},
-{"nokia-ann-ch1", {NULL}, 3405, "udp"},
-{"nokia-ann-ch2", {NULL}, 3406, "tcp"},
-{"nokia-ann-ch2", {NULL}, 3406, "udp"},
-{"ldap-admin", {NULL}, 3407, "tcp"},
-{"ldap-admin", {NULL}, 3407, "udp"},
-{"BESApi", {NULL}, 3408, "tcp"},
-{"BESApi", {NULL}, 3408, "udp"},
-{"networklens", {NULL}, 3409, "tcp"},
-{"networklens", {NULL}, 3409, "udp"},
-{"networklenss", {NULL}, 3410, "tcp"},
-{"networklenss", {NULL}, 3410, "udp"},
-{"biolink-auth", {NULL}, 3411, "tcp"},
-{"biolink-auth", {NULL}, 3411, "udp"},
-{"xmlblaster", {NULL}, 3412, "tcp"},
-{"xmlblaster", {NULL}, 3412, "udp"},
-{"svnet", {NULL}, 3413, "tcp"},
-{"svnet", {NULL}, 3413, "udp"},
-{"wip-port", {NULL}, 3414, "tcp"},
-{"wip-port", {NULL}, 3414, "udp"},
-{"bcinameservice", {NULL}, 3415, "tcp"},
-{"bcinameservice", {NULL}, 3415, "udp"},
-{"commandport", {NULL}, 3416, "tcp"},
-{"commandport", {NULL}, 3416, "udp"},
-{"csvr", {NULL}, 3417, "tcp"},
-{"csvr", {NULL}, 3417, "udp"},
-{"rnmap", {NULL}, 3418, "tcp"},
-{"rnmap", {NULL}, 3418, "udp"},
-{"softaudit", {NULL}, 3419, "tcp"},
-{"softaudit", {NULL}, 3419, "udp"},
-{"ifcp-port", {NULL}, 3420, "tcp"},
-{"ifcp-port", {NULL}, 3420, "udp"},
-{"bmap", {NULL}, 3421, "tcp"},
-{"bmap", {NULL}, 3421, "udp"},
-{"rusb-sys-port", {NULL}, 3422, "tcp"},
-{"rusb-sys-port", {NULL}, 3422, "udp"},
-{"xtrm", {NULL}, 3423, "tcp"},
-{"xtrm", {NULL}, 3423, "udp"},
-{"xtrms", {NULL}, 3424, "tcp"},
-{"xtrms", {NULL}, 3424, "udp"},
-{"agps-port", {NULL}, 3425, "tcp"},
-{"agps-port", {NULL}, 3425, "udp"},
-{"arkivio", {NULL}, 3426, "tcp"},
-{"arkivio", {NULL}, 3426, "udp"},
-{"websphere-snmp", {NULL}, 3427, "tcp"},
-{"websphere-snmp", {NULL}, 3427, "udp"},
-{"twcss", {NULL}, 3428, "tcp"},
-{"twcss", {NULL}, 3428, "udp"},
-{"gcsp", {NULL}, 3429, "tcp"},
-{"gcsp", {NULL}, 3429, "udp"},
-{"ssdispatch", {NULL}, 3430, "tcp"},
-{"ssdispatch", {NULL}, 3430, "udp"},
-{"ndl-als", {NULL}, 3431, "tcp"},
-{"ndl-als", {NULL}, 3431, "udp"},
-{"osdcp", {NULL}, 3432, "tcp"},
-{"osdcp", {NULL}, 3432, "udp"},
-{"alta-smp", {NULL}, 3433, "tcp"},
-{"alta-smp", {NULL}, 3433, "udp"},
-{"opencm", {NULL}, 3434, "tcp"},
-{"opencm", {NULL}, 3434, "udp"},
-{"pacom", {NULL}, 3435, "tcp"},
-{"pacom", {NULL}, 3435, "udp"},
-{"gc-config", {NULL}, 3436, "tcp"},
-{"gc-config", {NULL}, 3436, "udp"},
-{"autocueds", {NULL}, 3437, "tcp"},
-{"autocueds", {NULL}, 3437, "udp"},
-{"spiral-admin", {NULL}, 3438, "tcp"},
-{"spiral-admin", {NULL}, 3438, "udp"},
-{"hri-port", {NULL}, 3439, "tcp"},
-{"hri-port", {NULL}, 3439, "udp"},
-{"ans-console", {NULL}, 3440, "tcp"},
-{"ans-console", {NULL}, 3440, "udp"},
-{"connect-client", {NULL}, 3441, "tcp"},
-{"connect-client", {NULL}, 3441, "udp"},
-{"connect-server", {NULL}, 3442, "tcp"},
-{"connect-server", {NULL}, 3442, "udp"},
-{"ov-nnm-websrv", {NULL}, 3443, "tcp"},
-{"ov-nnm-websrv", {NULL}, 3443, "udp"},
-{"denali-server", {NULL}, 3444, "tcp"},
-{"denali-server", {NULL}, 3444, "udp"},
-{"monp", {NULL}, 3445, "tcp"},
-{"monp", {NULL}, 3445, "udp"},
-{"3comfaxrpc", {NULL}, 3446, "tcp"},
-{"3comfaxrpc", {NULL}, 3446, "udp"},
-{"directnet", {NULL}, 3447, "tcp"},
-{"directnet", {NULL}, 3447, "udp"},
-{"dnc-port", {NULL}, 3448, "tcp"},
-{"dnc-port", {NULL}, 3448, "udp"},
-{"hotu-chat", {NULL}, 3449, "tcp"},
-{"hotu-chat", {NULL}, 3449, "udp"},
-{"castorproxy", {NULL}, 3450, "tcp"},
-{"castorproxy", {NULL}, 3450, "udp"},
-{"asam", {NULL}, 3451, "tcp"},
-{"asam", {NULL}, 3451, "udp"},
-{"sabp-signal", {NULL}, 3452, "tcp"},
-{"sabp-signal", {NULL}, 3452, "udp"},
-{"pscupd", {NULL}, 3453, "tcp"},
-{"pscupd", {NULL}, 3453, "udp"},
-{"mira", {NULL}, 3454, "tcp"},
-{"prsvp", {NULL}, 3455, "tcp"},
-{"prsvp", {NULL}, 3455, "udp"},
-{"vat", {NULL}, 3456, "tcp"},
-{"vat", {NULL}, 3456, "udp"},
-{"vat-control", {NULL}, 3457, "tcp"},
-{"vat-control", {NULL}, 3457, "udp"},
-{"d3winosfi", {NULL}, 3458, "tcp"},
-{"d3winosfi", {NULL}, 3458, "udp"},
-{"integral", {NULL}, 3459, "tcp"},
-{"integral", {NULL}, 3459, "udp"},
-{"edm-manager", {NULL}, 3460, "tcp"},
-{"edm-manager", {NULL}, 3460, "udp"},
-{"edm-stager", {NULL}, 3461, "tcp"},
-{"edm-stager", {NULL}, 3461, "udp"},
-{"edm-std-notify", {NULL}, 3462, "tcp"},
-{"edm-std-notify", {NULL}, 3462, "udp"},
-{"edm-adm-notify", {NULL}, 3463, "tcp"},
-{"edm-adm-notify", {NULL}, 3463, "udp"},
-{"edm-mgr-sync", {NULL}, 3464, "tcp"},
-{"edm-mgr-sync", {NULL}, 3464, "udp"},
-{"edm-mgr-cntrl", {NULL}, 3465, "tcp"},
-{"edm-mgr-cntrl", {NULL}, 3465, "udp"},
-{"workflow", {NULL}, 3466, "tcp"},
-{"workflow", {NULL}, 3466, "udp"},
-{"rcst", {NULL}, 3467, "tcp"},
-{"rcst", {NULL}, 3467, "udp"},
-{"ttcmremotectrl", {NULL}, 3468, "tcp"},
-{"ttcmremotectrl", {NULL}, 3468, "udp"},
-{"pluribus", {NULL}, 3469, "tcp"},
-{"pluribus", {NULL}, 3469, "udp"},
-{"jt400", {NULL}, 3470, "tcp"},
-{"jt400", {NULL}, 3470, "udp"},
-{"jt400-ssl", {NULL}, 3471, "tcp"},
-{"jt400-ssl", {NULL}, 3471, "udp"},
-{"jaugsremotec-1", {NULL}, 3472, "tcp"},
-{"jaugsremotec-1", {NULL}, 3472, "udp"},
-{"jaugsremotec-2", {NULL}, 3473, "tcp"},
-{"jaugsremotec-2", {NULL}, 3473, "udp"},
-{"ttntspauto", {NULL}, 3474, "tcp"},
-{"ttntspauto", {NULL}, 3474, "udp"},
-{"genisar-port", {NULL}, 3475, "tcp"},
-{"genisar-port", {NULL}, 3475, "udp"},
-{"nppmp", {NULL}, 3476, "tcp"},
-{"nppmp", {NULL}, 3476, "udp"},
-{"ecomm", {NULL}, 3477, "tcp"},
-{"ecomm", {NULL}, 3477, "udp"},
-{"stun", {NULL}, 3478, "tcp"},
-{"stun", {NULL}, 3478, "udp"},
-{"turn", {NULL}, 3478, "tcp"},
-{"turn", {NULL}, 3478, "udp"},
-{"stun-behavior", {NULL}, 3478, "tcp"},
-{"stun-behavior", {NULL}, 3478, "udp"},
-{"twrpc", {NULL}, 3479, "tcp"},
-{"twrpc", {NULL}, 3479, "udp"},
-{"plethora", {NULL}, 3480, "tcp"},
-{"plethora", {NULL}, 3480, "udp"},
-{"cleanerliverc", {NULL}, 3481, "tcp"},
-{"cleanerliverc", {NULL}, 3481, "udp"},
-{"vulture", {NULL}, 3482, "tcp"},
-{"vulture", {NULL}, 3482, "udp"},
-{"slim-devices", {NULL}, 3483, "tcp"},
-{"slim-devices", {NULL}, 3483, "udp"},
-{"gbs-stp", {NULL}, 3484, "tcp"},
-{"gbs-stp", {NULL}, 3484, "udp"},
-{"celatalk", {NULL}, 3485, "tcp"},
-{"celatalk", {NULL}, 3485, "udp"},
-{"ifsf-hb-port", {NULL}, 3486, "tcp"},
-{"ifsf-hb-port", {NULL}, 3486, "udp"},
-{"ltctcp", {NULL}, 3487, "tcp"},
-{"ltcudp", {NULL}, 3487, "udp"},
-{"fs-rh-srv", {NULL}, 3488, "tcp"},
-{"fs-rh-srv", {NULL}, 3488, "udp"},
-{"dtp-dia", {NULL}, 3489, "tcp"},
-{"dtp-dia", {NULL}, 3489, "udp"},
-{"colubris", {NULL}, 3490, "tcp"},
-{"colubris", {NULL}, 3490, "udp"},
-{"swr-port", {NULL}, 3491, "tcp"},
-{"swr-port", {NULL}, 3491, "udp"},
-{"tvdumtray-port", {NULL}, 3492, "tcp"},
-{"tvdumtray-port", {NULL}, 3492, "udp"},
-{"nut", {NULL}, 3493, "tcp"},
-{"nut", {NULL}, 3493, "udp"},
-{"ibm3494", {NULL}, 3494, "tcp"},
-{"ibm3494", {NULL}, 3494, "udp"},
-{"seclayer-tcp", {NULL}, 3495, "tcp"},
-{"seclayer-tcp", {NULL}, 3495, "udp"},
-{"seclayer-tls", {NULL}, 3496, "tcp"},
-{"seclayer-tls", {NULL}, 3496, "udp"},
-{"ipether232port", {NULL}, 3497, "tcp"},
-{"ipether232port", {NULL}, 3497, "udp"},
-{"dashpas-port", {NULL}, 3498, "tcp"},
-{"dashpas-port", {NULL}, 3498, "udp"},
-{"sccip-media", {NULL}, 3499, "tcp"},
-{"sccip-media", {NULL}, 3499, "udp"},
-{"rtmp-port", {NULL}, 3500, "tcp"},
-{"rtmp-port", {NULL}, 3500, "udp"},
-{"isoft-p2p", {NULL}, 3501, "tcp"},
-{"isoft-p2p", {NULL}, 3501, "udp"},
-{"avinstalldisc", {NULL}, 3502, "tcp"},
-{"avinstalldisc", {NULL}, 3502, "udp"},
-{"lsp-ping", {NULL}, 3503, "tcp"},
-{"lsp-ping", {NULL}, 3503, "udp"},
-{"ironstorm", {NULL}, 3504, "tcp"},
-{"ironstorm", {NULL}, 3504, "udp"},
-{"ccmcomm", {NULL}, 3505, "tcp"},
-{"ccmcomm", {NULL}, 3505, "udp"},
-{"apc-3506", {NULL}, 3506, "tcp"},
-{"apc-3506", {NULL}, 3506, "udp"},
-{"nesh-broker", {NULL}, 3507, "tcp"},
-{"nesh-broker", {NULL}, 3507, "udp"},
-{"interactionweb", {NULL}, 3508, "tcp"},
-{"interactionweb", {NULL}, 3508, "udp"},
-{"vt-ssl", {NULL}, 3509, "tcp"},
-{"vt-ssl", {NULL}, 3509, "udp"},
-{"xss-port", {NULL}, 3510, "tcp"},
-{"xss-port", {NULL}, 3510, "udp"},
-{"webmail-2", {NULL}, 3511, "tcp"},
-{"webmail-2", {NULL}, 3511, "udp"},
-{"aztec", {NULL}, 3512, "tcp"},
-{"aztec", {NULL}, 3512, "udp"},
-{"arcpd", {NULL}, 3513, "tcp"},
-{"arcpd", {NULL}, 3513, "udp"},
-{"must-p2p", {NULL}, 3514, "tcp"},
-{"must-p2p", {NULL}, 3514, "udp"},
-{"must-backplane", {NULL}, 3515, "tcp"},
-{"must-backplane", {NULL}, 3515, "udp"},
-{"smartcard-port", {NULL}, 3516, "tcp"},
-{"smartcard-port", {NULL}, 3516, "udp"},
-{"802-11-iapp", {NULL}, 3517, "tcp"},
-{"802-11-iapp", {NULL}, 3517, "udp"},
-{"artifact-msg", {NULL}, 3518, "tcp"},
-{"artifact-msg", {NULL}, 3518, "udp"},
-{"nvmsgd", {NULL}, 3519, "tcp"},
-{"galileo", {NULL}, 3519, "udp"},
-{"galileolog", {NULL}, 3520, "tcp"},
-{"galileolog", {NULL}, 3520, "udp"},
-{"mc3ss", {NULL}, 3521, "tcp"},
-{"mc3ss", {NULL}, 3521, "udp"},
-{"nssocketport", {NULL}, 3522, "tcp"},
-{"nssocketport", {NULL}, 3522, "udp"},
-{"odeumservlink", {NULL}, 3523, "tcp"},
-{"odeumservlink", {NULL}, 3523, "udp"},
-{"ecmport", {NULL}, 3524, "tcp"},
-{"ecmport", {NULL}, 3524, "udp"},
-{"eisport", {NULL}, 3525, "tcp"},
-{"eisport", {NULL}, 3525, "udp"},
-{"starquiz-port", {NULL}, 3526, "tcp"},
-{"starquiz-port", {NULL}, 3526, "udp"},
-{"beserver-msg-q", {NULL}, 3527, "tcp"},
-{"beserver-msg-q", {NULL}, 3527, "udp"},
-{"jboss-iiop", {NULL}, 3528, "tcp"},
-{"jboss-iiop", {NULL}, 3528, "udp"},
-{"jboss-iiop-ssl", {NULL}, 3529, "tcp"},
-{"jboss-iiop-ssl", {NULL}, 3529, "udp"},
-{"gf", {NULL}, 3530, "tcp"},
-{"gf", {NULL}, 3530, "udp"},
-{"joltid", {NULL}, 3531, "tcp"},
-{"joltid", {NULL}, 3531, "udp"},
-{"raven-rmp", {NULL}, 3532, "tcp"},
-{"raven-rmp", {NULL}, 3532, "udp"},
-{"raven-rdp", {NULL}, 3533, "tcp"},
-{"raven-rdp", {NULL}, 3533, "udp"},
-{"urld-port", {NULL}, 3534, "tcp"},
-{"urld-port", {NULL}, 3534, "udp"},
-{"ms-la", {NULL}, 3535, "tcp"},
-{"ms-la", {NULL}, 3535, "udp"},
-{"snac", {NULL}, 3536, "tcp"},
-{"snac", {NULL}, 3536, "udp"},
-{"ni-visa-remote", {NULL}, 3537, "tcp"},
-{"ni-visa-remote", {NULL}, 3537, "udp"},
-{"ibm-diradm", {NULL}, 3538, "tcp"},
-{"ibm-diradm", {NULL}, 3538, "udp"},
-{"ibm-diradm-ssl", {NULL}, 3539, "tcp"},
-{"ibm-diradm-ssl", {NULL}, 3539, "udp"},
-{"pnrp-port", {NULL}, 3540, "tcp"},
-{"pnrp-port", {NULL}, 3540, "udp"},
-{"voispeed-port", {NULL}, 3541, "tcp"},
-{"voispeed-port", {NULL}, 3541, "udp"},
-{"hacl-monitor", {NULL}, 3542, "tcp"},
-{"hacl-monitor", {NULL}, 3542, "udp"},
-{"qftest-lookup", {NULL}, 3543, "tcp"},
-{"qftest-lookup", {NULL}, 3543, "udp"},
-{"teredo", {NULL}, 3544, "tcp"},
-{"teredo", {NULL}, 3544, "udp"},
-{"camac", {NULL}, 3545, "tcp"},
-{"camac", {NULL}, 3545, "udp"},
-{"symantec-sim", {NULL}, 3547, "tcp"},
-{"symantec-sim", {NULL}, 3547, "udp"},
-{"interworld", {NULL}, 3548, "tcp"},
-{"interworld", {NULL}, 3548, "udp"},
-{"tellumat-nms", {NULL}, 3549, "tcp"},
-{"tellumat-nms", {NULL}, 3549, "udp"},
-{"ssmpp", {NULL}, 3550, "tcp"},
-{"ssmpp", {NULL}, 3550, "udp"},
-{"apcupsd", {NULL}, 3551, "tcp"},
-{"apcupsd", {NULL}, 3551, "udp"},
-{"taserver", {NULL}, 3552, "tcp"},
-{"taserver", {NULL}, 3552, "udp"},
-{"rbr-discovery", {NULL}, 3553, "tcp"},
-{"rbr-discovery", {NULL}, 3553, "udp"},
-{"questnotify", {NULL}, 3554, "tcp"},
-{"questnotify", {NULL}, 3554, "udp"},
-{"razor", {NULL}, 3555, "tcp"},
-{"razor", {NULL}, 3555, "udp"},
-{"sky-transport", {NULL}, 3556, "tcp"},
-{"sky-transport", {NULL}, 3556, "udp"},
-{"personalos-001", {NULL}, 3557, "tcp"},
-{"personalos-001", {NULL}, 3557, "udp"},
-{"mcp-port", {NULL}, 3558, "tcp"},
-{"mcp-port", {NULL}, 3558, "udp"},
-{"cctv-port", {NULL}, 3559, "tcp"},
-{"cctv-port", {NULL}, 3559, "udp"},
-{"iniserve-port", {NULL}, 3560, "tcp"},
-{"iniserve-port", {NULL}, 3560, "udp"},
-{"bmc-onekey", {NULL}, 3561, "tcp"},
-{"bmc-onekey", {NULL}, 3561, "udp"},
-{"sdbproxy", {NULL}, 3562, "tcp"},
-{"sdbproxy", {NULL}, 3562, "udp"},
-{"watcomdebug", {NULL}, 3563, "tcp"},
-{"watcomdebug", {NULL}, 3563, "udp"},
-{"esimport", {NULL}, 3564, "tcp"},
-{"esimport", {NULL}, 3564, "udp"},
-{"m2pa", {NULL}, 3565, "tcp"},
-{"m2pa", {NULL}, 3565, "sctp"},
-{"quest-data-hub", {NULL}, 3566, "tcp"},
-{"oap", {NULL}, 3567, "tcp"},
-{"oap", {NULL}, 3567, "udp"},
-{"oap-s", {NULL}, 3568, "tcp"},
-{"oap-s", {NULL}, 3568, "udp"},
-{"mbg-ctrl", {NULL}, 3569, "tcp"},
-{"mbg-ctrl", {NULL}, 3569, "udp"},
-{"mccwebsvr-port", {NULL}, 3570, "tcp"},
-{"mccwebsvr-port", {NULL}, 3570, "udp"},
-{"megardsvr-port", {NULL}, 3571, "tcp"},
-{"megardsvr-port", {NULL}, 3571, "udp"},
-{"megaregsvrport", {NULL}, 3572, "tcp"},
-{"megaregsvrport", {NULL}, 3572, "udp"},
-{"tag-ups-1", {NULL}, 3573, "tcp"},
-{"tag-ups-1", {NULL}, 3573, "udp"},
-{"dmaf-server", {NULL}, 3574, "tcp"},
-{"dmaf-caster", {NULL}, 3574, "udp"},
-{"ccm-port", {NULL}, 3575, "tcp"},
-{"ccm-port", {NULL}, 3575, "udp"},
-{"cmc-port", {NULL}, 3576, "tcp"},
-{"cmc-port", {NULL}, 3576, "udp"},
-{"config-port", {NULL}, 3577, "tcp"},
-{"config-port", {NULL}, 3577, "udp"},
-{"data-port", {NULL}, 3578, "tcp"},
-{"data-port", {NULL}, 3578, "udp"},
-{"ttat3lb", {NULL}, 3579, "tcp"},
-{"ttat3lb", {NULL}, 3579, "udp"},
-{"nati-svrloc", {NULL}, 3580, "tcp"},
-{"nati-svrloc", {NULL}, 3580, "udp"},
-{"kfxaclicensing", {NULL}, 3581, "tcp"},
-{"kfxaclicensing", {NULL}, 3581, "udp"},
-{"press", {NULL}, 3582, "tcp"},
-{"press", {NULL}, 3582, "udp"},
-{"canex-watch", {NULL}, 3583, "tcp"},
-{"canex-watch", {NULL}, 3583, "udp"},
-{"u-dbap", {NULL}, 3584, "tcp"},
-{"u-dbap", {NULL}, 3584, "udp"},
-{"emprise-lls", {NULL}, 3585, "tcp"},
-{"emprise-lls", {NULL}, 3585, "udp"},
-{"emprise-lsc", {NULL}, 3586, "tcp"},
-{"emprise-lsc", {NULL}, 3586, "udp"},
-{"p2pgroup", {NULL}, 3587, "tcp"},
-{"p2pgroup", {NULL}, 3587, "udp"},
-{"sentinel", {NULL}, 3588, "tcp"},
-{"sentinel", {NULL}, 3588, "udp"},
-{"isomair", {NULL}, 3589, "tcp"},
-{"isomair", {NULL}, 3589, "udp"},
-{"wv-csp-sms", {NULL}, 3590, "tcp"},
-{"wv-csp-sms", {NULL}, 3590, "udp"},
-{"gtrack-server", {NULL}, 3591, "tcp"},
-{"gtrack-server", {NULL}, 3591, "udp"},
-{"gtrack-ne", {NULL}, 3592, "tcp"},
-{"gtrack-ne", {NULL}, 3592, "udp"},
-{"bpmd", {NULL}, 3593, "tcp"},
-{"bpmd", {NULL}, 3593, "udp"},
-{"mediaspace", {NULL}, 3594, "tcp"},
-{"mediaspace", {NULL}, 3594, "udp"},
-{"shareapp", {NULL}, 3595, "tcp"},
-{"shareapp", {NULL}, 3595, "udp"},
-{"iw-mmogame", {NULL}, 3596, "tcp"},
-{"iw-mmogame", {NULL}, 3596, "udp"},
-{"a14", {NULL}, 3597, "tcp"},
-{"a14", {NULL}, 3597, "udp"},
-{"a15", {NULL}, 3598, "tcp"},
-{"a15", {NULL}, 3598, "udp"},
-{"quasar-server", {NULL}, 3599, "tcp"},
-{"quasar-server", {NULL}, 3599, "udp"},
-{"trap-daemon", {NULL}, 3600, "tcp"},
-{"trap-daemon", {NULL}, 3600, "udp"},
-{"visinet-gui", {NULL}, 3601, "tcp"},
-{"visinet-gui", {NULL}, 3601, "udp"},
-{"infiniswitchcl", {NULL}, 3602, "tcp"},
-{"infiniswitchcl", {NULL}, 3602, "udp"},
-{"int-rcv-cntrl", {NULL}, 3603, "tcp"},
-{"int-rcv-cntrl", {NULL}, 3603, "udp"},
-{"bmc-jmx-port", {NULL}, 3604, "tcp"},
-{"bmc-jmx-port", {NULL}, 3604, "udp"},
-{"comcam-io", {NULL}, 3605, "tcp"},
-{"comcam-io", {NULL}, 3605, "udp"},
-{"splitlock", {NULL}, 3606, "tcp"},
-{"splitlock", {NULL}, 3606, "udp"},
-{"precise-i3", {NULL}, 3607, "tcp"},
-{"precise-i3", {NULL}, 3607, "udp"},
-{"trendchip-dcp", {NULL}, 3608, "tcp"},
-{"trendchip-dcp", {NULL}, 3608, "udp"},
-{"cpdi-pidas-cm", {NULL}, 3609, "tcp"},
-{"cpdi-pidas-cm", {NULL}, 3609, "udp"},
-{"echonet", {NULL}, 3610, "tcp"},
-{"echonet", {NULL}, 3610, "udp"},
-{"six-degrees", {NULL}, 3611, "tcp"},
-{"six-degrees", {NULL}, 3611, "udp"},
-{"hp-dataprotect", {NULL}, 3612, "tcp"},
-{"hp-dataprotect", {NULL}, 3612, "udp"},
-{"alaris-disc", {NULL}, 3613, "tcp"},
-{"alaris-disc", {NULL}, 3613, "udp"},
-{"sigma-port", {NULL}, 3614, "tcp"},
-{"sigma-port", {NULL}, 3614, "udp"},
-{"start-network", {NULL}, 3615, "tcp"},
-{"start-network", {NULL}, 3615, "udp"},
-{"cd3o-protocol", {NULL}, 3616, "tcp"},
-{"cd3o-protocol", {NULL}, 3616, "udp"},
-{"sharp-server", {NULL}, 3617, "tcp"},
-{"sharp-server", {NULL}, 3617, "udp"},
-{"aairnet-1", {NULL}, 3618, "tcp"},
-{"aairnet-1", {NULL}, 3618, "udp"},
-{"aairnet-2", {NULL}, 3619, "tcp"},
-{"aairnet-2", {NULL}, 3619, "udp"},
-{"ep-pcp", {NULL}, 3620, "tcp"},
-{"ep-pcp", {NULL}, 3620, "udp"},
-{"ep-nsp", {NULL}, 3621, "tcp"},
-{"ep-nsp", {NULL}, 3621, "udp"},
-{"ff-lr-port", {NULL}, 3622, "tcp"},
-{"ff-lr-port", {NULL}, 3622, "udp"},
-{"haipe-discover", {NULL}, 3623, "tcp"},
-{"haipe-discover", {NULL}, 3623, "udp"},
-{"dist-upgrade", {NULL}, 3624, "tcp"},
-{"dist-upgrade", {NULL}, 3624, "udp"},
-{"volley", {NULL}, 3625, "tcp"},
-{"volley", {NULL}, 3625, "udp"},
-{"bvcdaemon-port", {NULL}, 3626, "tcp"},
-{"bvcdaemon-port", {NULL}, 3626, "udp"},
-{"jamserverport", {NULL}, 3627, "tcp"},
-{"jamserverport", {NULL}, 3627, "udp"},
-{"ept-machine", {NULL}, 3628, "tcp"},
-{"ept-machine", {NULL}, 3628, "udp"},
-{"escvpnet", {NULL}, 3629, "tcp"},
-{"escvpnet", {NULL}, 3629, "udp"},
-{"cs-remote-db", {NULL}, 3630, "tcp"},
-{"cs-remote-db", {NULL}, 3630, "udp"},
-{"cs-services", {NULL}, 3631, "tcp"},
-{"cs-services", {NULL}, 3631, "udp"},
-{"distcc", {NULL}, 3632, "tcp"},
-{"distcc", {NULL}, 3632, "udp"},
-{"wacp", {NULL}, 3633, "tcp"},
-{"wacp", {NULL}, 3633, "udp"},
-{"hlibmgr", {NULL}, 3634, "tcp"},
-{"hlibmgr", {NULL}, 3634, "udp"},
-{"sdo", {NULL}, 3635, "tcp"},
-{"sdo", {NULL}, 3635, "udp"},
-{"servistaitsm", {NULL}, 3636, "tcp"},
-{"servistaitsm", {NULL}, 3636, "udp"},
-{"scservp", {NULL}, 3637, "tcp"},
-{"scservp", {NULL}, 3637, "udp"},
-{"ehp-backup", {NULL}, 3638, "tcp"},
-{"ehp-backup", {NULL}, 3638, "udp"},
-{"xap-ha", {NULL}, 3639, "tcp"},
-{"xap-ha", {NULL}, 3639, "udp"},
-{"netplay-port1", {NULL}, 3640, "tcp"},
-{"netplay-port1", {NULL}, 3640, "udp"},
-{"netplay-port2", {NULL}, 3641, "tcp"},
-{"netplay-port2", {NULL}, 3641, "udp"},
-{"juxml-port", {NULL}, 3642, "tcp"},
-{"juxml-port", {NULL}, 3642, "udp"},
-{"audiojuggler", {NULL}, 3643, "tcp"},
-{"audiojuggler", {NULL}, 3643, "udp"},
-{"ssowatch", {NULL}, 3644, "tcp"},
-{"ssowatch", {NULL}, 3644, "udp"},
-{"cyc", {NULL}, 3645, "tcp"},
-{"cyc", {NULL}, 3645, "udp"},
-{"xss-srv-port", {NULL}, 3646, "tcp"},
-{"xss-srv-port", {NULL}, 3646, "udp"},
-{"splitlock-gw", {NULL}, 3647, "tcp"},
-{"splitlock-gw", {NULL}, 3647, "udp"},
-{"fjcp", {NULL}, 3648, "tcp"},
-{"fjcp", {NULL}, 3648, "udp"},
-{"nmmp", {NULL}, 3649, "tcp"},
-{"nmmp", {NULL}, 3649, "udp"},
-{"prismiq-plugin", {NULL}, 3650, "tcp"},
-{"prismiq-plugin", {NULL}, 3650, "udp"},
-{"xrpc-registry", {NULL}, 3651, "tcp"},
-{"xrpc-registry", {NULL}, 3651, "udp"},
-{"vxcrnbuport", {NULL}, 3652, "tcp"},
-{"vxcrnbuport", {NULL}, 3652, "udp"},
-{"tsp", {NULL}, 3653, "tcp"},
-{"tsp", {NULL}, 3653, "udp"},
-{"vaprtm", {NULL}, 3654, "tcp"},
-{"vaprtm", {NULL}, 3654, "udp"},
-{"abatemgr", {NULL}, 3655, "tcp"},
-{"abatemgr", {NULL}, 3655, "udp"},
-{"abatjss", {NULL}, 3656, "tcp"},
-{"abatjss", {NULL}, 3656, "udp"},
-{"immedianet-bcn", {NULL}, 3657, "tcp"},
-{"immedianet-bcn", {NULL}, 3657, "udp"},
-{"ps-ams", {NULL}, 3658, "tcp"},
-{"ps-ams", {NULL}, 3658, "udp"},
-{"apple-sasl", {NULL}, 3659, "tcp"},
-{"apple-sasl", {NULL}, 3659, "udp"},
-{"can-nds-ssl", {NULL}, 3660, "tcp"},
-{"can-nds-ssl", {NULL}, 3660, "udp"},
-{"can-ferret-ssl", {NULL}, 3661, "tcp"},
-{"can-ferret-ssl", {NULL}, 3661, "udp"},
-{"pserver", {NULL}, 3662, "tcp"},
-{"pserver", {NULL}, 3662, "udp"},
-{"dtp", {NULL}, 3663, "tcp"},
-{"dtp", {NULL}, 3663, "udp"},
-{"ups-engine", {NULL}, 3664, "tcp"},
-{"ups-engine", {NULL}, 3664, "udp"},
-{"ent-engine", {NULL}, 3665, "tcp"},
-{"ent-engine", {NULL}, 3665, "udp"},
-{"eserver-pap", {NULL}, 3666, "tcp"},
-{"eserver-pap", {NULL}, 3666, "udp"},
-{"infoexch", {NULL}, 3667, "tcp"},
-{"infoexch", {NULL}, 3667, "udp"},
-{"dell-rm-port", {NULL}, 3668, "tcp"},
-{"dell-rm-port", {NULL}, 3668, "udp"},
-{"casanswmgmt", {NULL}, 3669, "tcp"},
-{"casanswmgmt", {NULL}, 3669, "udp"},
-{"smile", {NULL}, 3670, "tcp"},
-{"smile", {NULL}, 3670, "udp"},
-{"efcp", {NULL}, 3671, "tcp"},
-{"efcp", {NULL}, 3671, "udp"},
-{"lispworks-orb", {NULL}, 3672, "tcp"},
-{"lispworks-orb", {NULL}, 3672, "udp"},
-{"mediavault-gui", {NULL}, 3673, "tcp"},
-{"mediavault-gui", {NULL}, 3673, "udp"},
-{"wininstall-ipc", {NULL}, 3674, "tcp"},
-{"wininstall-ipc", {NULL}, 3674, "udp"},
-{"calltrax", {NULL}, 3675, "tcp"},
-{"calltrax", {NULL}, 3675, "udp"},
-{"va-pacbase", {NULL}, 3676, "tcp"},
-{"va-pacbase", {NULL}, 3676, "udp"},
-{"roverlog", {NULL}, 3677, "tcp"},
-{"roverlog", {NULL}, 3677, "udp"},
-{"ipr-dglt", {NULL}, 3678, "tcp"},
-{"ipr-dglt", {NULL}, 3678, "udp"},
-{"newton-dock", {NULL}, 3679, "tcp"},
-{"newton-dock", {NULL}, 3679, "udp"},
-{"npds-tracker", {NULL}, 3680, "tcp"},
-{"npds-tracker", {NULL}, 3680, "udp"},
-{"bts-x73", {NULL}, 3681, "tcp"},
-{"bts-x73", {NULL}, 3681, "udp"},
-{"cas-mapi", {NULL}, 3682, "tcp"},
-{"cas-mapi", {NULL}, 3682, "udp"},
-{"bmc-ea", {NULL}, 3683, "tcp"},
-{"bmc-ea", {NULL}, 3683, "udp"},
-{"faxstfx-port", {NULL}, 3684, "tcp"},
-{"faxstfx-port", {NULL}, 3684, "udp"},
-{"dsx-agent", {NULL}, 3685, "tcp"},
-{"dsx-agent", {NULL}, 3685, "udp"},
-{"tnmpv2", {NULL}, 3686, "tcp"},
-{"tnmpv2", {NULL}, 3686, "udp"},
-{"simple-push", {NULL}, 3687, "tcp"},
-{"simple-push", {NULL}, 3687, "udp"},
-{"simple-push-s", {NULL}, 3688, "tcp"},
-{"simple-push-s", {NULL}, 3688, "udp"},
-{"daap", {NULL}, 3689, "tcp"},
-{"daap", {NULL}, 3689, "udp"},
-{"svn", {NULL}, 3690, "tcp"},
-{"svn", {NULL}, 3690, "udp"},
-{"magaya-network", {NULL}, 3691, "tcp"},
-{"magaya-network", {NULL}, 3691, "udp"},
-{"intelsync", {NULL}, 3692, "tcp"},
-{"intelsync", {NULL}, 3692, "udp"},
-{"bmc-data-coll", {NULL}, 3695, "tcp"},
-{"bmc-data-coll", {NULL}, 3695, "udp"},
-{"telnetcpcd", {NULL}, 3696, "tcp"},
-{"telnetcpcd", {NULL}, 3696, "udp"},
-{"nw-license", {NULL}, 3697, "tcp"},
-{"nw-license", {NULL}, 3697, "udp"},
-{"sagectlpanel", {NULL}, 3698, "tcp"},
-{"sagectlpanel", {NULL}, 3698, "udp"},
-{"kpn-icw", {NULL}, 3699, "tcp"},
-{"kpn-icw", {NULL}, 3699, "udp"},
-{"lrs-paging", {NULL}, 3700, "tcp"},
-{"lrs-paging", {NULL}, 3700, "udp"},
-{"netcelera", {NULL}, 3701, "tcp"},
-{"netcelera", {NULL}, 3701, "udp"},
-{"ws-discovery", {NULL}, 3702, "tcp"},
-{"ws-discovery", {NULL}, 3702, "udp"},
-{"adobeserver-3", {NULL}, 3703, "tcp"},
-{"adobeserver-3", {NULL}, 3703, "udp"},
-{"adobeserver-4", {NULL}, 3704, "tcp"},
-{"adobeserver-4", {NULL}, 3704, "udp"},
-{"adobeserver-5", {NULL}, 3705, "tcp"},
-{"adobeserver-5", {NULL}, 3705, "udp"},
-{"rt-event", {NULL}, 3706, "tcp"},
-{"rt-event", {NULL}, 3706, "udp"},
-{"rt-event-s", {NULL}, 3707, "tcp"},
-{"rt-event-s", {NULL}, 3707, "udp"},
-{"sun-as-iiops", {NULL}, 3708, "tcp"},
-{"sun-as-iiops", {NULL}, 3708, "udp"},
-{"ca-idms", {NULL}, 3709, "tcp"},
-{"ca-idms", {NULL}, 3709, "udp"},
-{"portgate-auth", {NULL}, 3710, "tcp"},
-{"portgate-auth", {NULL}, 3710, "udp"},
-{"edb-server2", {NULL}, 3711, "tcp"},
-{"edb-server2", {NULL}, 3711, "udp"},
-{"sentinel-ent", {NULL}, 3712, "tcp"},
-{"sentinel-ent", {NULL}, 3712, "udp"},
-{"tftps", {NULL}, 3713, "tcp"},
-{"tftps", {NULL}, 3713, "udp"},
-{"delos-dms", {NULL}, 3714, "tcp"},
-{"delos-dms", {NULL}, 3714, "udp"},
-{"anoto-rendezv", {NULL}, 3715, "tcp"},
-{"anoto-rendezv", {NULL}, 3715, "udp"},
-{"wv-csp-sms-cir", {NULL}, 3716, "tcp"},
-{"wv-csp-sms-cir", {NULL}, 3716, "udp"},
-{"wv-csp-udp-cir", {NULL}, 3717, "tcp"},
-{"wv-csp-udp-cir", {NULL}, 3717, "udp"},
-{"opus-services", {NULL}, 3718, "tcp"},
-{"opus-services", {NULL}, 3718, "udp"},
-{"itelserverport", {NULL}, 3719, "tcp"},
-{"itelserverport", {NULL}, 3719, "udp"},
-{"ufastro-instr", {NULL}, 3720, "tcp"},
-{"ufastro-instr", {NULL}, 3720, "udp"},
-{"xsync", {NULL}, 3721, "tcp"},
-{"xsync", {NULL}, 3721, "udp"},
-{"xserveraid", {NULL}, 3722, "tcp"},
-{"xserveraid", {NULL}, 3722, "udp"},
-{"sychrond", {NULL}, 3723, "tcp"},
-{"sychrond", {NULL}, 3723, "udp"},
-{"blizwow", {NULL}, 3724, "tcp"},
-{"blizwow", {NULL}, 3724, "udp"},
-{"na-er-tip", {NULL}, 3725, "tcp"},
-{"na-er-tip", {NULL}, 3725, "udp"},
-{"array-manager", {NULL}, 3726, "tcp"},
-{"array-manager", {NULL}, 3726, "udp"},
-{"e-mdu", {NULL}, 3727, "tcp"},
-{"e-mdu", {NULL}, 3727, "udp"},
-{"e-woa", {NULL}, 3728, "tcp"},
-{"e-woa", {NULL}, 3728, "udp"},
-{"fksp-audit", {NULL}, 3729, "tcp"},
-{"fksp-audit", {NULL}, 3729, "udp"},
-{"client-ctrl", {NULL}, 3730, "tcp"},
-{"client-ctrl", {NULL}, 3730, "udp"},
-{"smap", {NULL}, 3731, "tcp"},
-{"smap", {NULL}, 3731, "udp"},
-{"m-wnn", {NULL}, 3732, "tcp"},
-{"m-wnn", {NULL}, 3732, "udp"},
-{"multip-msg", {NULL}, 3733, "tcp"},
-{"multip-msg", {NULL}, 3733, "udp"},
-{"synel-data", {NULL}, 3734, "tcp"},
-{"synel-data", {NULL}, 3734, "udp"},
-{"pwdis", {NULL}, 3735, "tcp"},
-{"pwdis", {NULL}, 3735, "udp"},
-{"rs-rmi", {NULL}, 3736, "tcp"},
-{"rs-rmi", {NULL}, 3736, "udp"},
-{"xpanel", {NULL}, 3737, "tcp"},
-{"versatalk", {NULL}, 3738, "tcp"},
-{"versatalk", {NULL}, 3738, "udp"},
-{"launchbird-lm", {NULL}, 3739, "tcp"},
-{"launchbird-lm", {NULL}, 3739, "udp"},
-{"heartbeat", {NULL}, 3740, "tcp"},
-{"heartbeat", {NULL}, 3740, "udp"},
-{"wysdma", {NULL}, 3741, "tcp"},
-{"wysdma", {NULL}, 3741, "udp"},
-{"cst-port", {NULL}, 3742, "tcp"},
-{"cst-port", {NULL}, 3742, "udp"},
-{"ipcs-command", {NULL}, 3743, "tcp"},
-{"ipcs-command", {NULL}, 3743, "udp"},
-{"sasg", {NULL}, 3744, "tcp"},
-{"sasg", {NULL}, 3744, "udp"},
-{"gw-call-port", {NULL}, 3745, "tcp"},
-{"gw-call-port", {NULL}, 3745, "udp"},
-{"linktest", {NULL}, 3746, "tcp"},
-{"linktest", {NULL}, 3746, "udp"},
-{"linktest-s", {NULL}, 3747, "tcp"},
-{"linktest-s", {NULL}, 3747, "udp"},
-{"webdata", {NULL}, 3748, "tcp"},
-{"webdata", {NULL}, 3748, "udp"},
-{"cimtrak", {NULL}, 3749, "tcp"},
-{"cimtrak", {NULL}, 3749, "udp"},
-{"cbos-ip-port", {NULL}, 3750, "tcp"},
-{"cbos-ip-port", {NULL}, 3750, "udp"},
-{"gprs-cube", {NULL}, 3751, "tcp"},
-{"gprs-cube", {NULL}, 3751, "udp"},
-{"vipremoteagent", {NULL}, 3752, "tcp"},
-{"vipremoteagent", {NULL}, 3752, "udp"},
-{"nattyserver", {NULL}, 3753, "tcp"},
-{"nattyserver", {NULL}, 3753, "udp"},
-{"timestenbroker", {NULL}, 3754, "tcp"},
-{"timestenbroker", {NULL}, 3754, "udp"},
-{"sas-remote-hlp", {NULL}, 3755, "tcp"},
-{"sas-remote-hlp", {NULL}, 3755, "udp"},
-{"canon-capt", {NULL}, 3756, "tcp"},
-{"canon-capt", {NULL}, 3756, "udp"},
-{"grf-port", {NULL}, 3757, "tcp"},
-{"grf-port", {NULL}, 3757, "udp"},
-{"apw-registry", {NULL}, 3758, "tcp"},
-{"apw-registry", {NULL}, 3758, "udp"},
-{"exapt-lmgr", {NULL}, 3759, "tcp"},
-{"exapt-lmgr", {NULL}, 3759, "udp"},
-{"adtempusclient", {NULL}, 3760, "tcp"},
-{"adtempusclient", {NULL}, 3760, "udp"},
-{"gsakmp", {NULL}, 3761, "tcp"},
-{"gsakmp", {NULL}, 3761, "udp"},
-{"gbs-smp", {NULL}, 3762, "tcp"},
-{"gbs-smp", {NULL}, 3762, "udp"},
-{"xo-wave", {NULL}, 3763, "tcp"},
-{"xo-wave", {NULL}, 3763, "udp"},
-{"mni-prot-rout", {NULL}, 3764, "tcp"},
-{"mni-prot-rout", {NULL}, 3764, "udp"},
-{"rtraceroute", {NULL}, 3765, "tcp"},
-{"rtraceroute", {NULL}, 3765, "udp"},
-{"listmgr-port", {NULL}, 3767, "tcp"},
-{"listmgr-port", {NULL}, 3767, "udp"},
-{"rblcheckd", {NULL}, 3768, "tcp"},
-{"rblcheckd", {NULL}, 3768, "udp"},
-{"haipe-otnk", {NULL}, 3769, "tcp"},
-{"haipe-otnk", {NULL}, 3769, "udp"},
-{"cindycollab", {NULL}, 3770, "tcp"},
-{"cindycollab", {NULL}, 3770, "udp"},
-{"paging-port", {NULL}, 3771, "tcp"},
-{"paging-port", {NULL}, 3771, "udp"},
-{"ctp", {NULL}, 3772, "tcp"},
-{"ctp", {NULL}, 3772, "udp"},
-{"ctdhercules", {NULL}, 3773, "tcp"},
-{"ctdhercules", {NULL}, 3773, "udp"},
-{"zicom", {NULL}, 3774, "tcp"},
-{"zicom", {NULL}, 3774, "udp"},
-{"ispmmgr", {NULL}, 3775, "tcp"},
-{"ispmmgr", {NULL}, 3775, "udp"},
-{"dvcprov-port", {NULL}, 3776, "tcp"},
-{"dvcprov-port", {NULL}, 3776, "udp"},
-{"jibe-eb", {NULL}, 3777, "tcp"},
-{"jibe-eb", {NULL}, 3777, "udp"},
-{"c-h-it-port", {NULL}, 3778, "tcp"},
-{"c-h-it-port", {NULL}, 3778, "udp"},
-{"cognima", {NULL}, 3779, "tcp"},
-{"cognima", {NULL}, 3779, "udp"},
-{"nnp", {NULL}, 3780, "tcp"},
-{"nnp", {NULL}, 3780, "udp"},
-{"abcvoice-port", {NULL}, 3781, "tcp"},
-{"abcvoice-port", {NULL}, 3781, "udp"},
-{"iso-tp0s", {NULL}, 3782, "tcp"},
-{"iso-tp0s", {NULL}, 3782, "udp"},
-{"bim-pem", {NULL}, 3783, "tcp"},
-{"bim-pem", {NULL}, 3783, "udp"},
-{"bfd-control", {NULL}, 3784, "tcp"},
-{"bfd-control", {NULL}, 3784, "udp"},
-{"bfd-echo", {NULL}, 3785, "tcp"},
-{"bfd-echo", {NULL}, 3785, "udp"},
-{"upstriggervsw", {NULL}, 3786, "tcp"},
-{"upstriggervsw", {NULL}, 3786, "udp"},
-{"fintrx", {NULL}, 3787, "tcp"},
-{"fintrx", {NULL}, 3787, "udp"},
-{"isrp-port", {NULL}, 3788, "tcp"},
-{"isrp-port", {NULL}, 3788, "udp"},
-{"remotedeploy", {NULL}, 3789, "tcp"},
-{"remotedeploy", {NULL}, 3789, "udp"},
-{"quickbooksrds", {NULL}, 3790, "tcp"},
-{"quickbooksrds", {NULL}, 3790, "udp"},
-{"tvnetworkvideo", {NULL}, 3791, "tcp"},
-{"tvnetworkvideo", {NULL}, 3791, "udp"},
-{"sitewatch", {NULL}, 3792, "tcp"},
-{"sitewatch", {NULL}, 3792, "udp"},
-{"dcsoftware", {NULL}, 3793, "tcp"},
-{"dcsoftware", {NULL}, 3793, "udp"},
-{"jaus", {NULL}, 3794, "tcp"},
-{"jaus", {NULL}, 3794, "udp"},
-{"myblast", {NULL}, 3795, "tcp"},
-{"myblast", {NULL}, 3795, "udp"},
-{"spw-dialer", {NULL}, 3796, "tcp"},
-{"spw-dialer", {NULL}, 3796, "udp"},
-{"idps", {NULL}, 3797, "tcp"},
-{"idps", {NULL}, 3797, "udp"},
-{"minilock", {NULL}, 3798, "tcp"},
-{"minilock", {NULL}, 3798, "udp"},
-{"radius-dynauth", {NULL}, 3799, "tcp"},
-{"radius-dynauth", {NULL}, 3799, "udp"},
-{"pwgpsi", {NULL}, 3800, "tcp"},
-{"pwgpsi", {NULL}, 3800, "udp"},
-{"ibm-mgr", {NULL}, 3801, "tcp"},
-{"ibm-mgr", {NULL}, 3801, "udp"},
-{"vhd", {NULL}, 3802, "tcp"},
-{"vhd", {NULL}, 3802, "udp"},
-{"soniqsync", {NULL}, 3803, "tcp"},
-{"soniqsync", {NULL}, 3803, "udp"},
-{"iqnet-port", {NULL}, 3804, "tcp"},
-{"iqnet-port", {NULL}, 3804, "udp"},
-{"tcpdataserver", {NULL}, 3805, "tcp"},
-{"tcpdataserver", {NULL}, 3805, "udp"},
-{"wsmlb", {NULL}, 3806, "tcp"},
-{"wsmlb", {NULL}, 3806, "udp"},
-{"spugna", {NULL}, 3807, "tcp"},
-{"spugna", {NULL}, 3807, "udp"},
-{"sun-as-iiops-ca", {NULL}, 3808, "tcp"},
-{"sun-as-iiops-ca", {NULL}, 3808, "udp"},
-{"apocd", {NULL}, 3809, "tcp"},
-{"apocd", {NULL}, 3809, "udp"},
-{"wlanauth", {NULL}, 3810, "tcp"},
-{"wlanauth", {NULL}, 3810, "udp"},
-{"amp", {NULL}, 3811, "tcp"},
-{"amp", {NULL}, 3811, "udp"},
-{"neto-wol-server", {NULL}, 3812, "tcp"},
-{"neto-wol-server", {NULL}, 3812, "udp"},
-{"rap-ip", {NULL}, 3813, "tcp"},
-{"rap-ip", {NULL}, 3813, "udp"},
-{"neto-dcs", {NULL}, 3814, "tcp"},
-{"neto-dcs", {NULL}, 3814, "udp"},
-{"lansurveyorxml", {NULL}, 3815, "tcp"},
-{"lansurveyorxml", {NULL}, 3815, "udp"},
-{"sunlps-http", {NULL}, 3816, "tcp"},
-{"sunlps-http", {NULL}, 3816, "udp"},
-{"tapeware", {NULL}, 3817, "tcp"},
-{"tapeware", {NULL}, 3817, "udp"},
-{"crinis-hb", {NULL}, 3818, "tcp"},
-{"crinis-hb", {NULL}, 3818, "udp"},
-{"epl-slp", {NULL}, 3819, "tcp"},
-{"epl-slp", {NULL}, 3819, "udp"},
-{"scp", {NULL}, 3820, "tcp"},
-{"scp", {NULL}, 3820, "udp"},
-{"pmcp", {NULL}, 3821, "tcp"},
-{"pmcp", {NULL}, 3821, "udp"},
-{"acp-discovery", {NULL}, 3822, "tcp"},
-{"acp-discovery", {NULL}, 3822, "udp"},
-{"acp-conduit", {NULL}, 3823, "tcp"},
-{"acp-conduit", {NULL}, 3823, "udp"},
-{"acp-policy", {NULL}, 3824, "tcp"},
-{"acp-policy", {NULL}, 3824, "udp"},
-{"ffserver", {NULL}, 3825, "tcp"},
-{"ffserver", {NULL}, 3825, "udp"},
-{"wormux", {NULL}, 3826, "tcp"},
-{"wormux", {NULL}, 3826, "udp"},
-{"netmpi", {NULL}, 3827, "tcp"},
-{"netmpi", {NULL}, 3827, "udp"},
-{"neteh", {NULL}, 3828, "tcp"},
-{"neteh", {NULL}, 3828, "udp"},
-{"neteh-ext", {NULL}, 3829, "tcp"},
-{"neteh-ext", {NULL}, 3829, "udp"},
-{"cernsysmgmtagt", {NULL}, 3830, "tcp"},
-{"cernsysmgmtagt", {NULL}, 3830, "udp"},
-{"dvapps", {NULL}, 3831, "tcp"},
-{"dvapps", {NULL}, 3831, "udp"},
-{"xxnetserver", {NULL}, 3832, "tcp"},
-{"xxnetserver", {NULL}, 3832, "udp"},
-{"aipn-auth", {NULL}, 3833, "tcp"},
-{"aipn-auth", {NULL}, 3833, "udp"},
-{"spectardata", {NULL}, 3834, "tcp"},
-{"spectardata", {NULL}, 3834, "udp"},
-{"spectardb", {NULL}, 3835, "tcp"},
-{"spectardb", {NULL}, 3835, "udp"},
-{"markem-dcp", {NULL}, 3836, "tcp"},
-{"markem-dcp", {NULL}, 3836, "udp"},
-{"mkm-discovery", {NULL}, 3837, "tcp"},
-{"mkm-discovery", {NULL}, 3837, "udp"},
-{"sos", {NULL}, 3838, "tcp"},
-{"sos", {NULL}, 3838, "udp"},
-{"amx-rms", {NULL}, 3839, "tcp"},
-{"amx-rms", {NULL}, 3839, "udp"},
-{"flirtmitmir", {NULL}, 3840, "tcp"},
-{"flirtmitmir", {NULL}, 3840, "udp"},
-{"zfirm-shiprush3", {NULL}, 3841, "tcp"},
-{"zfirm-shiprush3", {NULL}, 3841, "udp"},
-{"nhci", {NULL}, 3842, "tcp"},
-{"nhci", {NULL}, 3842, "udp"},
-{"quest-agent", {NULL}, 3843, "tcp"},
-{"quest-agent", {NULL}, 3843, "udp"},
-{"rnm", {NULL}, 3844, "tcp"},
-{"rnm", {NULL}, 3844, "udp"},
-{"v-one-spp", {NULL}, 3845, "tcp"},
-{"v-one-spp", {NULL}, 3845, "udp"},
-{"an-pcp", {NULL}, 3846, "tcp"},
-{"an-pcp", {NULL}, 3846, "udp"},
-{"msfw-control", {NULL}, 3847, "tcp"},
-{"msfw-control", {NULL}, 3847, "udp"},
-{"item", {NULL}, 3848, "tcp"},
-{"item", {NULL}, 3848, "udp"},
-{"spw-dnspreload", {NULL}, 3849, "tcp"},
-{"spw-dnspreload", {NULL}, 3849, "udp"},
-{"qtms-bootstrap", {NULL}, 3850, "tcp"},
-{"qtms-bootstrap", {NULL}, 3850, "udp"},
-{"spectraport", {NULL}, 3851, "tcp"},
-{"spectraport", {NULL}, 3851, "udp"},
-{"sse-app-config", {NULL}, 3852, "tcp"},
-{"sse-app-config", {NULL}, 3852, "udp"},
-{"sscan", {NULL}, 3853, "tcp"},
-{"sscan", {NULL}, 3853, "udp"},
-{"stryker-com", {NULL}, 3854, "tcp"},
-{"stryker-com", {NULL}, 3854, "udp"},
-{"opentrac", {NULL}, 3855, "tcp"},
-{"opentrac", {NULL}, 3855, "udp"},
-{"informer", {NULL}, 3856, "tcp"},
-{"informer", {NULL}, 3856, "udp"},
-{"trap-port", {NULL}, 3857, "tcp"},
-{"trap-port", {NULL}, 3857, "udp"},
-{"trap-port-mom", {NULL}, 3858, "tcp"},
-{"trap-port-mom", {NULL}, 3858, "udp"},
-{"nav-port", {NULL}, 3859, "tcp"},
-{"nav-port", {NULL}, 3859, "udp"},
-{"sasp", {NULL}, 3860, "tcp"},
-{"sasp", {NULL}, 3860, "udp"},
-{"winshadow-hd", {NULL}, 3861, "tcp"},
-{"winshadow-hd", {NULL}, 3861, "udp"},
-{"giga-pocket", {NULL}, 3862, "tcp"},
-{"giga-pocket", {NULL}, 3862, "udp"},
-{"asap-tcp", {NULL}, 3863, "tcp"},
-{"asap-udp", {NULL}, 3863, "udp"},
-{"asap-sctp", {NULL}, 3863, "sctp"},
-{"asap-tcp-tls", {NULL}, 3864, "tcp"},
-{"asap-sctp-tls", {NULL}, 3864, "sctp"},
-{"xpl", {NULL}, 3865, "tcp"},
-{"xpl", {NULL}, 3865, "udp"},
-{"dzdaemon", {NULL}, 3866, "tcp"},
-{"dzdaemon", {NULL}, 3866, "udp"},
-{"dzoglserver", {NULL}, 3867, "tcp"},
-{"dzoglserver", {NULL}, 3867, "udp"},
-{"diameter", {NULL}, 3868, "tcp"},
-{"diameter", {NULL}, 3868, "sctp"},
-{"ovsam-mgmt", {NULL}, 3869, "tcp"},
-{"ovsam-mgmt", {NULL}, 3869, "udp"},
-{"ovsam-d-agent", {NULL}, 3870, "tcp"},
-{"ovsam-d-agent", {NULL}, 3870, "udp"},
-{"avocent-adsap", {NULL}, 3871, "tcp"},
-{"avocent-adsap", {NULL}, 3871, "udp"},
-{"oem-agent", {NULL}, 3872, "tcp"},
-{"oem-agent", {NULL}, 3872, "udp"},
-{"fagordnc", {NULL}, 3873, "tcp"},
-{"fagordnc", {NULL}, 3873, "udp"},
-{"sixxsconfig", {NULL}, 3874, "tcp"},
-{"sixxsconfig", {NULL}, 3874, "udp"},
-{"pnbscada", {NULL}, 3875, "tcp"},
-{"pnbscada", {NULL}, 3875, "udp"},
-{"dl_agent", {NULL}, 3876, "tcp"},
-{"dl_agent", {NULL}, 3876, "udp"},
-{"xmpcr-interface", {NULL}, 3877, "tcp"},
-{"xmpcr-interface", {NULL}, 3877, "udp"},
-{"fotogcad", {NULL}, 3878, "tcp"},
-{"fotogcad", {NULL}, 3878, "udp"},
-{"appss-lm", {NULL}, 3879, "tcp"},
-{"appss-lm", {NULL}, 3879, "udp"},
-{"igrs", {NULL}, 3880, "tcp"},
-{"igrs", {NULL}, 3880, "udp"},
-{"idac", {NULL}, 3881, "tcp"},
-{"idac", {NULL}, 3881, "udp"},
-{"msdts1", {NULL}, 3882, "tcp"},
-{"msdts1", {NULL}, 3882, "udp"},
-{"vrpn", {NULL}, 3883, "tcp"},
-{"vrpn", {NULL}, 3883, "udp"},
-{"softrack-meter", {NULL}, 3884, "tcp"},
-{"softrack-meter", {NULL}, 3884, "udp"},
-{"topflow-ssl", {NULL}, 3885, "tcp"},
-{"topflow-ssl", {NULL}, 3885, "udp"},
-{"nei-management", {NULL}, 3886, "tcp"},
-{"nei-management", {NULL}, 3886, "udp"},
-{"ciphire-data", {NULL}, 3887, "tcp"},
-{"ciphire-data", {NULL}, 3887, "udp"},
-{"ciphire-serv", {NULL}, 3888, "tcp"},
-{"ciphire-serv", {NULL}, 3888, "udp"},
-{"dandv-tester", {NULL}, 3889, "tcp"},
-{"dandv-tester", {NULL}, 3889, "udp"},
-{"ndsconnect", {NULL}, 3890, "tcp"},
-{"ndsconnect", {NULL}, 3890, "udp"},
-{"rtc-pm-port", {NULL}, 3891, "tcp"},
-{"rtc-pm-port", {NULL}, 3891, "udp"},
-{"pcc-image-port", {NULL}, 3892, "tcp"},
-{"pcc-image-port", {NULL}, 3892, "udp"},
-{"cgi-starapi", {NULL}, 3893, "tcp"},
-{"cgi-starapi", {NULL}, 3893, "udp"},
-{"syam-agent", {NULL}, 3894, "tcp"},
-{"syam-agent", {NULL}, 3894, "udp"},
-{"syam-smc", {NULL}, 3895, "tcp"},
-{"syam-smc", {NULL}, 3895, "udp"},
-{"sdo-tls", {NULL}, 3896, "tcp"},
-{"sdo-tls", {NULL}, 3896, "udp"},
-{"sdo-ssh", {NULL}, 3897, "tcp"},
-{"sdo-ssh", {NULL}, 3897, "udp"},
-{"senip", {NULL}, 3898, "tcp"},
-{"senip", {NULL}, 3898, "udp"},
-{"itv-control", {NULL}, 3899, "tcp"},
-{"itv-control", {NULL}, 3899, "udp"},
-{"udt_os", {NULL}, 3900, "tcp"},
-{"udt_os", {NULL}, 3900, "udp"},
-{"nimsh", {NULL}, 3901, "tcp"},
-{"nimsh", {NULL}, 3901, "udp"},
-{"nimaux", {NULL}, 3902, "tcp"},
-{"nimaux", {NULL}, 3902, "udp"},
-{"charsetmgr", {NULL}, 3903, "tcp"},
-{"charsetmgr", {NULL}, 3903, "udp"},
-{"omnilink-port", {NULL}, 3904, "tcp"},
-{"omnilink-port", {NULL}, 3904, "udp"},
-{"mupdate", {NULL}, 3905, "tcp"},
-{"mupdate", {NULL}, 3905, "udp"},
-{"topovista-data", {NULL}, 3906, "tcp"},
-{"topovista-data", {NULL}, 3906, "udp"},
-{"imoguia-port", {NULL}, 3907, "tcp"},
-{"imoguia-port", {NULL}, 3907, "udp"},
-{"hppronetman", {NULL}, 3908, "tcp"},
-{"hppronetman", {NULL}, 3908, "udp"},
-{"surfcontrolcpa", {NULL}, 3909, "tcp"},
-{"surfcontrolcpa", {NULL}, 3909, "udp"},
-{"prnrequest", {NULL}, 3910, "tcp"},
-{"prnrequest", {NULL}, 3910, "udp"},
-{"prnstatus", {NULL}, 3911, "tcp"},
-{"prnstatus", {NULL}, 3911, "udp"},
-{"gbmt-stars", {NULL}, 3912, "tcp"},
-{"gbmt-stars", {NULL}, 3912, "udp"},
-{"listcrt-port", {NULL}, 3913, "tcp"},
-{"listcrt-port", {NULL}, 3913, "udp"},
-{"listcrt-port-2", {NULL}, 3914, "tcp"},
-{"listcrt-port-2", {NULL}, 3914, "udp"},
-{"agcat", {NULL}, 3915, "tcp"},
-{"agcat", {NULL}, 3915, "udp"},
-{"wysdmc", {NULL}, 3916, "tcp"},
-{"wysdmc", {NULL}, 3916, "udp"},
-{"aftmux", {NULL}, 3917, "tcp"},
-{"aftmux", {NULL}, 3917, "udp"},
-{"pktcablemmcops", {NULL}, 3918, "tcp"},
-{"pktcablemmcops", {NULL}, 3918, "udp"},
-{"hyperip", {NULL}, 3919, "tcp"},
-{"hyperip", {NULL}, 3919, "udp"},
-{"exasoftport1", {NULL}, 3920, "tcp"},
-{"exasoftport1", {NULL}, 3920, "udp"},
-{"herodotus-net", {NULL}, 3921, "tcp"},
-{"herodotus-net", {NULL}, 3921, "udp"},
-{"sor-update", {NULL}, 3922, "tcp"},
-{"sor-update", {NULL}, 3922, "udp"},
-{"symb-sb-port", {NULL}, 3923, "tcp"},
-{"symb-sb-port", {NULL}, 3923, "udp"},
-{"mpl-gprs-port", {NULL}, 3924, "tcp"},
-{"mpl-gprs-port", {NULL}, 3924, "udp"},
-{"zmp", {NULL}, 3925, "tcp"},
-{"zmp", {NULL}, 3925, "udp"},
-{"winport", {NULL}, 3926, "tcp"},
-{"winport", {NULL}, 3926, "udp"},
-{"natdataservice", {NULL}, 3927, "tcp"},
-{"natdataservice", {NULL}, 3927, "udp"},
-{"netboot-pxe", {NULL}, 3928, "tcp"},
-{"netboot-pxe", {NULL}, 3928, "udp"},
-{"smauth-port", {NULL}, 3929, "tcp"},
-{"smauth-port", {NULL}, 3929, "udp"},
-{"syam-webserver", {NULL}, 3930, "tcp"},
-{"syam-webserver", {NULL}, 3930, "udp"},
-{"msr-plugin-port", {NULL}, 3931, "tcp"},
-{"msr-plugin-port", {NULL}, 3931, "udp"},
-{"dyn-site", {NULL}, 3932, "tcp"},
-{"dyn-site", {NULL}, 3932, "udp"},
-{"plbserve-port", {NULL}, 3933, "tcp"},
-{"plbserve-port", {NULL}, 3933, "udp"},
-{"sunfm-port", {NULL}, 3934, "tcp"},
-{"sunfm-port", {NULL}, 3934, "udp"},
-{"sdp-portmapper", {NULL}, 3935, "tcp"},
-{"sdp-portmapper", {NULL}, 3935, "udp"},
-{"mailprox", {NULL}, 3936, "tcp"},
-{"mailprox", {NULL}, 3936, "udp"},
-{"dvbservdsc", {NULL}, 3937, "tcp"},
-{"dvbservdsc", {NULL}, 3937, "udp"},
-{"dbcontrol_agent", {NULL}, 3938, "tcp"},
-{"dbcontrol_agent", {NULL}, 3938, "udp"},
-{"aamp", {NULL}, 3939, "tcp"},
-{"aamp", {NULL}, 3939, "udp"},
-{"xecp-node", {NULL}, 3940, "tcp"},
-{"xecp-node", {NULL}, 3940, "udp"},
-{"homeportal-web", {NULL}, 3941, "tcp"},
-{"homeportal-web", {NULL}, 3941, "udp"},
-{"srdp", {NULL}, 3942, "tcp"},
-{"srdp", {NULL}, 3942, "udp"},
-{"tig", {NULL}, 3943, "tcp"},
-{"tig", {NULL}, 3943, "udp"},
-{"sops", {NULL}, 3944, "tcp"},
-{"sops", {NULL}, 3944, "udp"},
-{"emcads", {NULL}, 3945, "tcp"},
-{"emcads", {NULL}, 3945, "udp"},
-{"backupedge", {NULL}, 3946, "tcp"},
-{"backupedge", {NULL}, 3946, "udp"},
-{"ccp", {NULL}, 3947, "tcp"},
-{"ccp", {NULL}, 3947, "udp"},
-{"apdap", {NULL}, 3948, "tcp"},
-{"apdap", {NULL}, 3948, "udp"},
-{"drip", {NULL}, 3949, "tcp"},
-{"drip", {NULL}, 3949, "udp"},
-{"namemunge", {NULL}, 3950, "tcp"},
-{"namemunge", {NULL}, 3950, "udp"},
-{"pwgippfax", {NULL}, 3951, "tcp"},
-{"pwgippfax", {NULL}, 3951, "udp"},
-{"i3-sessionmgr", {NULL}, 3952, "tcp"},
-{"i3-sessionmgr", {NULL}, 3952, "udp"},
-{"xmlink-connect", {NULL}, 3953, "tcp"},
-{"xmlink-connect", {NULL}, 3953, "udp"},
-{"adrep", {NULL}, 3954, "tcp"},
-{"adrep", {NULL}, 3954, "udp"},
-{"p2pcommunity", {NULL}, 3955, "tcp"},
-{"p2pcommunity", {NULL}, 3955, "udp"},
-{"gvcp", {NULL}, 3956, "tcp"},
-{"gvcp", {NULL}, 3956, "udp"},
-{"mqe-broker", {NULL}, 3957, "tcp"},
-{"mqe-broker", {NULL}, 3957, "udp"},
-{"mqe-agent", {NULL}, 3958, "tcp"},
-{"mqe-agent", {NULL}, 3958, "udp"},
-{"treehopper", {NULL}, 3959, "tcp"},
-{"treehopper", {NULL}, 3959, "udp"},
-{"bess", {NULL}, 3960, "tcp"},
-{"bess", {NULL}, 3960, "udp"},
-{"proaxess", {NULL}, 3961, "tcp"},
-{"proaxess", {NULL}, 3961, "udp"},
-{"sbi-agent", {NULL}, 3962, "tcp"},
-{"sbi-agent", {NULL}, 3962, "udp"},
-{"thrp", {NULL}, 3963, "tcp"},
-{"thrp", {NULL}, 3963, "udp"},
-{"sasggprs", {NULL}, 3964, "tcp"},
-{"sasggprs", {NULL}, 3964, "udp"},
-{"ati-ip-to-ncpe", {NULL}, 3965, "tcp"},
-{"ati-ip-to-ncpe", {NULL}, 3965, "udp"},
-{"bflckmgr", {NULL}, 3966, "tcp"},
-{"bflckmgr", {NULL}, 3966, "udp"},
-{"ppsms", {NULL}, 3967, "tcp"},
-{"ppsms", {NULL}, 3967, "udp"},
-{"ianywhere-dbns", {NULL}, 3968, "tcp"},
-{"ianywhere-dbns", {NULL}, 3968, "udp"},
-{"landmarks", {NULL}, 3969, "tcp"},
-{"landmarks", {NULL}, 3969, "udp"},
-{"lanrevagent", {NULL}, 3970, "tcp"},
-{"lanrevagent", {NULL}, 3970, "udp"},
-{"lanrevserver", {NULL}, 3971, "tcp"},
-{"lanrevserver", {NULL}, 3971, "udp"},
-{"iconp", {NULL}, 3972, "tcp"},
-{"iconp", {NULL}, 3972, "udp"},
-{"progistics", {NULL}, 3973, "tcp"},
-{"progistics", {NULL}, 3973, "udp"},
-{"citysearch", {NULL}, 3974, "tcp"},
-{"citysearch", {NULL}, 3974, "udp"},
-{"airshot", {NULL}, 3975, "tcp"},
-{"airshot", {NULL}, 3975, "udp"},
-{"opswagent", {NULL}, 3976, "tcp"},
-{"opswagent", {NULL}, 3976, "udp"},
-{"opswmanager", {NULL}, 3977, "tcp"},
-{"opswmanager", {NULL}, 3977, "udp"},
-{"secure-cfg-svr", {NULL}, 3978, "tcp"},
-{"secure-cfg-svr", {NULL}, 3978, "udp"},
-{"smwan", {NULL}, 3979, "tcp"},
-{"smwan", {NULL}, 3979, "udp"},
-{"acms", {NULL}, 3980, "tcp"},
-{"acms", {NULL}, 3980, "udp"},
-{"starfish", {NULL}, 3981, "tcp"},
-{"starfish", {NULL}, 3981, "udp"},
-{"eis", {NULL}, 3982, "tcp"},
-{"eis", {NULL}, 3982, "udp"},
-{"eisp", {NULL}, 3983, "tcp"},
-{"eisp", {NULL}, 3983, "udp"},
-{"mapper-nodemgr", {NULL}, 3984, "tcp"},
-{"mapper-nodemgr", {NULL}, 3984, "udp"},
-{"mapper-mapethd", {NULL}, 3985, "tcp"},
-{"mapper-mapethd", {NULL}, 3985, "udp"},
-{"mapper-ws_ethd", {NULL}, 3986, "tcp"},
-{"mapper-ws_ethd", {NULL}, 3986, "udp"},
-{"centerline", {NULL}, 3987, "tcp"},
-{"centerline", {NULL}, 3987, "udp"},
-{"dcs-config", {NULL}, 3988, "tcp"},
-{"dcs-config", {NULL}, 3988, "udp"},
-{"bv-queryengine", {NULL}, 3989, "tcp"},
-{"bv-queryengine", {NULL}, 3989, "udp"},
-{"bv-is", {NULL}, 3990, "tcp"},
-{"bv-is", {NULL}, 3990, "udp"},
-{"bv-smcsrv", {NULL}, 3991, "tcp"},
-{"bv-smcsrv", {NULL}, 3991, "udp"},
-{"bv-ds", {NULL}, 3992, "tcp"},
-{"bv-ds", {NULL}, 3992, "udp"},
-{"bv-agent", {NULL}, 3993, "tcp"},
-{"bv-agent", {NULL}, 3993, "udp"},
-{"iss-mgmt-ssl", {NULL}, 3995, "tcp"},
-{"iss-mgmt-ssl", {NULL}, 3995, "udp"},
-{"abcsoftware", {NULL}, 3996, "tcp"},
-{"abcsoftware", {NULL}, 3996, "udp"},
-{"agentsease-db", {NULL}, 3997, "tcp"},
-{"agentsease-db", {NULL}, 3997, "udp"},
-{"dnx", {NULL}, 3998, "tcp"},
-{"dnx", {NULL}, 3998, "udp"},
-{"nvcnet", {NULL}, 3999, "tcp"},
-{"nvcnet", {NULL}, 3999, "udp"},
-{"terabase", {NULL}, 4000, "tcp"},
-{"terabase", {NULL}, 4000, "udp"},
-{"newoak", {NULL}, 4001, "tcp"},
-{"newoak", {NULL}, 4001, "udp"},
-{"pxc-spvr-ft", {NULL}, 4002, "tcp"},
-{"pxc-spvr-ft", {NULL}, 4002, "udp"},
-{"pxc-splr-ft", {NULL}, 4003, "tcp"},
-{"pxc-splr-ft", {NULL}, 4003, "udp"},
-{"pxc-roid", {NULL}, 4004, "tcp"},
-{"pxc-roid", {NULL}, 4004, "udp"},
-{"pxc-pin", {NULL}, 4005, "tcp"},
-{"pxc-pin", {NULL}, 4005, "udp"},
-{"pxc-spvr", {NULL}, 4006, "tcp"},
-{"pxc-spvr", {NULL}, 4006, "udp"},
-{"pxc-splr", {NULL}, 4007, "tcp"},
-{"pxc-splr", {NULL}, 4007, "udp"},
-{"netcheque", {NULL}, 4008, "tcp"},
-{"netcheque", {NULL}, 4008, "udp"},
-{"chimera-hwm", {NULL}, 4009, "tcp"},
-{"chimera-hwm", {NULL}, 4009, "udp"},
-{"samsung-unidex", {NULL}, 4010, "tcp"},
-{"samsung-unidex", {NULL}, 4010, "udp"},
-{"altserviceboot", {NULL}, 4011, "tcp"},
-{"altserviceboot", {NULL}, 4011, "udp"},
-{"pda-gate", {NULL}, 4012, "tcp"},
-{"pda-gate", {NULL}, 4012, "udp"},
-{"acl-manager", {NULL}, 4013, "tcp"},
-{"acl-manager", {NULL}, 4013, "udp"},
-{"taiclock", {NULL}, 4014, "tcp"},
-{"taiclock", {NULL}, 4014, "udp"},
-{"talarian-mcast1", {NULL}, 4015, "tcp"},
-{"talarian-mcast1", {NULL}, 4015, "udp"},
-{"talarian-mcast2", {NULL}, 4016, "tcp"},
-{"talarian-mcast2", {NULL}, 4016, "udp"},
-{"talarian-mcast3", {NULL}, 4017, "tcp"},
-{"talarian-mcast3", {NULL}, 4017, "udp"},
-{"talarian-mcast4", {NULL}, 4018, "tcp"},
-{"talarian-mcast4", {NULL}, 4018, "udp"},
-{"talarian-mcast5", {NULL}, 4019, "tcp"},
-{"talarian-mcast5", {NULL}, 4019, "udp"},
-{"trap", {NULL}, 4020, "tcp"},
-{"trap", {NULL}, 4020, "udp"},
-{"nexus-portal", {NULL}, 4021, "tcp"},
-{"nexus-portal", {NULL}, 4021, "udp"},
-{"dnox", {NULL}, 4022, "tcp"},
-{"dnox", {NULL}, 4022, "udp"},
-{"esnm-zoning", {NULL}, 4023, "tcp"},
-{"esnm-zoning", {NULL}, 4023, "udp"},
-{"tnp1-port", {NULL}, 4024, "tcp"},
-{"tnp1-port", {NULL}, 4024, "udp"},
-{"partimage", {NULL}, 4025, "tcp"},
-{"partimage", {NULL}, 4025, "udp"},
-{"as-debug", {NULL}, 4026, "tcp"},
-{"as-debug", {NULL}, 4026, "udp"},
-{"bxp", {NULL}, 4027, "tcp"},
-{"bxp", {NULL}, 4027, "udp"},
-{"dtserver-port", {NULL}, 4028, "tcp"},
-{"dtserver-port", {NULL}, 4028, "udp"},
-{"ip-qsig", {NULL}, 4029, "tcp"},
-{"ip-qsig", {NULL}, 4029, "udp"},
-{"jdmn-port", {NULL}, 4030, "tcp"},
-{"jdmn-port", {NULL}, 4030, "udp"},
-{"suucp", {NULL}, 4031, "tcp"},
-{"suucp", {NULL}, 4031, "udp"},
-{"vrts-auth-port", {NULL}, 4032, "tcp"},
-{"vrts-auth-port", {NULL}, 4032, "udp"},
-{"sanavigator", {NULL}, 4033, "tcp"},
-{"sanavigator", {NULL}, 4033, "udp"},
-{"ubxd", {NULL}, 4034, "tcp"},
-{"ubxd", {NULL}, 4034, "udp"},
-{"wap-push-http", {NULL}, 4035, "tcp"},
-{"wap-push-http", {NULL}, 4035, "udp"},
-{"wap-push-https", {NULL}, 4036, "tcp"},
-{"wap-push-https", {NULL}, 4036, "udp"},
-{"ravehd", {NULL}, 4037, "tcp"},
-{"ravehd", {NULL}, 4037, "udp"},
-{"fazzt-ptp", {NULL}, 4038, "tcp"},
-{"fazzt-ptp", {NULL}, 4038, "udp"},
-{"fazzt-admin", {NULL}, 4039, "tcp"},
-{"fazzt-admin", {NULL}, 4039, "udp"},
-{"yo-main", {NULL}, 4040, "tcp"},
-{"yo-main", {NULL}, 4040, "udp"},
-{"houston", {NULL}, 4041, "tcp"},
-{"houston", {NULL}, 4041, "udp"},
-{"ldxp", {NULL}, 4042, "tcp"},
-{"ldxp", {NULL}, 4042, "udp"},
-{"nirp", {NULL}, 4043, "tcp"},
-{"nirp", {NULL}, 4043, "udp"},
-{"ltp", {NULL}, 4044, "tcp"},
-{"ltp", {NULL}, 4044, "udp"},
-{"npp", {NULL}, 4045, "tcp"},
-{"npp", {NULL}, 4045, "udp"},
-{"acp-proto", {NULL}, 4046, "tcp"},
-{"acp-proto", {NULL}, 4046, "udp"},
-{"ctp-state", {NULL}, 4047, "tcp"},
-{"ctp-state", {NULL}, 4047, "udp"},
-{"wafs", {NULL}, 4049, "tcp"},
-{"wafs", {NULL}, 4049, "udp"},
-{"cisco-wafs", {NULL}, 4050, "tcp"},
-{"cisco-wafs", {NULL}, 4050, "udp"},
-{"cppdp", {NULL}, 4051, "tcp"},
-{"cppdp", {NULL}, 4051, "udp"},
-{"interact", {NULL}, 4052, "tcp"},
-{"interact", {NULL}, 4052, "udp"},
-{"ccu-comm-1", {NULL}, 4053, "tcp"},
-{"ccu-comm-1", {NULL}, 4053, "udp"},
-{"ccu-comm-2", {NULL}, 4054, "tcp"},
-{"ccu-comm-2", {NULL}, 4054, "udp"},
-{"ccu-comm-3", {NULL}, 4055, "tcp"},
-{"ccu-comm-3", {NULL}, 4055, "udp"},
-{"lms", {NULL}, 4056, "tcp"},
-{"lms", {NULL}, 4056, "udp"},
-{"wfm", {NULL}, 4057, "tcp"},
-{"wfm", {NULL}, 4057, "udp"},
-{"kingfisher", {NULL}, 4058, "tcp"},
-{"kingfisher", {NULL}, 4058, "udp"},
-{"dlms-cosem", {NULL}, 4059, "tcp"},
-{"dlms-cosem", {NULL}, 4059, "udp"},
-{"dsmeter_iatc", {NULL}, 4060, "tcp"},
-{"dsmeter_iatc", {NULL}, 4060, "udp"},
-{"ice-location", {NULL}, 4061, "tcp"},
-{"ice-location", {NULL}, 4061, "udp"},
-{"ice-slocation", {NULL}, 4062, "tcp"},
-{"ice-slocation", {NULL}, 4062, "udp"},
-{"ice-router", {NULL}, 4063, "tcp"},
-{"ice-router", {NULL}, 4063, "udp"},
-{"ice-srouter", {NULL}, 4064, "tcp"},
-{"ice-srouter", {NULL}, 4064, "udp"},
-{"avanti_cdp", {NULL}, 4065, "tcp"},
-{"avanti_cdp", {NULL}, 4065, "udp"},
-{"pmas", {NULL}, 4066, "tcp"},
-{"pmas", {NULL}, 4066, "udp"},
-{"idp", {NULL}, 4067, "tcp"},
-{"idp", {NULL}, 4067, "udp"},
-{"ipfltbcst", {NULL}, 4068, "tcp"},
-{"ipfltbcst", {NULL}, 4068, "udp"},
-{"minger", {NULL}, 4069, "tcp"},
-{"minger", {NULL}, 4069, "udp"},
-{"tripe", {NULL}, 4070, "tcp"},
-{"tripe", {NULL}, 4070, "udp"},
-{"aibkup", {NULL}, 4071, "tcp"},
-{"aibkup", {NULL}, 4071, "udp"},
-{"zieto-sock", {NULL}, 4072, "tcp"},
-{"zieto-sock", {NULL}, 4072, "udp"},
-{"iRAPP", {NULL}, 4073, "tcp"},
-{"iRAPP", {NULL}, 4073, "udp"},
-{"cequint-cityid", {NULL}, 4074, "tcp"},
-{"cequint-cityid", {NULL}, 4074, "udp"},
-{"perimlan", {NULL}, 4075, "tcp"},
-{"perimlan", {NULL}, 4075, "udp"},
-{"seraph", {NULL}, 4076, "tcp"},
-{"seraph", {NULL}, 4076, "udp"},
-{"ascomalarm", {NULL}, 4077, "udp"},
-{"cssp", {NULL}, 4078, "tcp"},
-{"santools", {NULL}, 4079, "tcp"},
-{"santools", {NULL}, 4079, "udp"},
-{"lorica-in", {NULL}, 4080, "tcp"},
-{"lorica-in", {NULL}, 4080, "udp"},
-{"lorica-in-sec", {NULL}, 4081, "tcp"},
-{"lorica-in-sec", {NULL}, 4081, "udp"},
-{"lorica-out", {NULL}, 4082, "tcp"},
-{"lorica-out", {NULL}, 4082, "udp"},
-{"lorica-out-sec", {NULL}, 4083, "tcp"},
-{"lorica-out-sec", {NULL}, 4083, "udp"},
-{"fortisphere-vm", {NULL}, 4084, "udp"},
-{"ezmessagesrv", {NULL}, 4085, "tcp"},
-{"ftsync", {NULL}, 4086, "udp"},
-{"applusservice", {NULL}, 4087, "tcp"},
-{"npsp", {NULL}, 4088, "tcp"},
-{"opencore", {NULL}, 4089, "tcp"},
-{"opencore", {NULL}, 4089, "udp"},
-{"omasgport", {NULL}, 4090, "tcp"},
-{"omasgport", {NULL}, 4090, "udp"},
-{"ewinstaller", {NULL}, 4091, "tcp"},
-{"ewinstaller", {NULL}, 4091, "udp"},
-{"ewdgs", {NULL}, 4092, "tcp"},
-{"ewdgs", {NULL}, 4092, "udp"},
-{"pvxpluscs", {NULL}, 4093, "tcp"},
-{"pvxpluscs", {NULL}, 4093, "udp"},
-{"sysrqd", {NULL}, 4094, "tcp"},
-{"sysrqd", {NULL}, 4094, "udp"},
-{"xtgui", {NULL}, 4095, "tcp"},
-{"xtgui", {NULL}, 4095, "udp"},
-{"bre", {NULL}, 4096, "tcp"},
-{"bre", {NULL}, 4096, "udp"},
-{"patrolview", {NULL}, 4097, "tcp"},
-{"patrolview", {NULL}, 4097, "udp"},
-{"drmsfsd", {NULL}, 4098, "tcp"},
-{"drmsfsd", {NULL}, 4098, "udp"},
-{"dpcp", {NULL}, 4099, "tcp"},
-{"dpcp", {NULL}, 4099, "udp"},
-{"igo-incognito", {NULL}, 4100, "tcp"},
-{"igo-incognito", {NULL}, 4100, "udp"},
-{"brlp-0", {NULL}, 4101, "tcp"},
-{"brlp-0", {NULL}, 4101, "udp"},
-{"brlp-1", {NULL}, 4102, "tcp"},
-{"brlp-1", {NULL}, 4102, "udp"},
-{"brlp-2", {NULL}, 4103, "tcp"},
-{"brlp-2", {NULL}, 4103, "udp"},
-{"brlp-3", {NULL}, 4104, "tcp"},
-{"brlp-3", {NULL}, 4104, "udp"},
-{"shofarplayer", {NULL}, 4105, "tcp"},
-{"shofarplayer", {NULL}, 4105, "udp"},
-{"synchronite", {NULL}, 4106, "tcp"},
-{"synchronite", {NULL}, 4106, "udp"},
-{"j-ac", {NULL}, 4107, "tcp"},
-{"j-ac", {NULL}, 4107, "udp"},
-{"accel", {NULL}, 4108, "tcp"},
-{"accel", {NULL}, 4108, "udp"},
-{"izm", {NULL}, 4109, "tcp"},
-{"izm", {NULL}, 4109, "udp"},
-{"g2tag", {NULL}, 4110, "tcp"},
-{"g2tag", {NULL}, 4110, "udp"},
-{"xgrid", {NULL}, 4111, "tcp"},
-{"xgrid", {NULL}, 4111, "udp"},
-{"apple-vpns-rp", {NULL}, 4112, "tcp"},
-{"apple-vpns-rp", {NULL}, 4112, "udp"},
-{"aipn-reg", {NULL}, 4113, "tcp"},
-{"aipn-reg", {NULL}, 4113, "udp"},
-{"jomamqmonitor", {NULL}, 4114, "tcp"},
-{"jomamqmonitor", {NULL}, 4114, "udp"},
-{"cds", {NULL}, 4115, "tcp"},
-{"cds", {NULL}, 4115, "udp"},
-{"smartcard-tls", {NULL}, 4116, "tcp"},
-{"smartcard-tls", {NULL}, 4116, "udp"},
-{"hillrserv", {NULL}, 4117, "tcp"},
-{"hillrserv", {NULL}, 4117, "udp"},
-{"netscript", {NULL}, 4118, "tcp"},
-{"netscript", {NULL}, 4118, "udp"},
-{"assuria-slm", {NULL}, 4119, "tcp"},
-{"assuria-slm", {NULL}, 4119, "udp"},
-{"e-builder", {NULL}, 4121, "tcp"},
-{"e-builder", {NULL}, 4121, "udp"},
-{"fprams", {NULL}, 4122, "tcp"},
-{"fprams", {NULL}, 4122, "udp"},
-{"z-wave", {NULL}, 4123, "tcp"},
-{"z-wave", {NULL}, 4123, "udp"},
-{"tigv2", {NULL}, 4124, "tcp"},
-{"tigv2", {NULL}, 4124, "udp"},
-{"opsview-envoy", {NULL}, 4125, "tcp"},
-{"opsview-envoy", {NULL}, 4125, "udp"},
-{"ddrepl", {NULL}, 4126, "tcp"},
-{"ddrepl", {NULL}, 4126, "udp"},
-{"unikeypro", {NULL}, 4127, "tcp"},
-{"unikeypro", {NULL}, 4127, "udp"},
-{"nufw", {NULL}, 4128, "tcp"},
-{"nufw", {NULL}, 4128, "udp"},
-{"nuauth", {NULL}, 4129, "tcp"},
-{"nuauth", {NULL}, 4129, "udp"},
-{"fronet", {NULL}, 4130, "tcp"},
-{"fronet", {NULL}, 4130, "udp"},
-{"stars", {NULL}, 4131, "tcp"},
-{"stars", {NULL}, 4131, "udp"},
-{"nuts_dem", {NULL}, 4132, "tcp"},
-{"nuts_dem", {NULL}, 4132, "udp"},
-{"nuts_bootp", {NULL}, 4133, "tcp"},
-{"nuts_bootp", {NULL}, 4133, "udp"},
-{"nifty-hmi", {NULL}, 4134, "tcp"},
-{"nifty-hmi", {NULL}, 4134, "udp"},
-{"cl-db-attach", {NULL}, 4135, "tcp"},
-{"cl-db-attach", {NULL}, 4135, "udp"},
-{"cl-db-request", {NULL}, 4136, "tcp"},
-{"cl-db-request", {NULL}, 4136, "udp"},
-{"cl-db-remote", {NULL}, 4137, "tcp"},
-{"cl-db-remote", {NULL}, 4137, "udp"},
-{"nettest", {NULL}, 4138, "tcp"},
-{"nettest", {NULL}, 4138, "udp"},
-{"thrtx", {NULL}, 4139, "tcp"},
-{"thrtx", {NULL}, 4139, "udp"},
-{"cedros_fds", {NULL}, 4140, "tcp"},
-{"cedros_fds", {NULL}, 4140, "udp"},
-{"oirtgsvc", {NULL}, 4141, "tcp"},
-{"oirtgsvc", {NULL}, 4141, "udp"},
-{"oidocsvc", {NULL}, 4142, "tcp"},
-{"oidocsvc", {NULL}, 4142, "udp"},
-{"oidsr", {NULL}, 4143, "tcp"},
-{"oidsr", {NULL}, 4143, "udp"},
-{"vvr-control", {NULL}, 4145, "tcp"},
-{"vvr-control", {NULL}, 4145, "udp"},
-{"tgcconnect", {NULL}, 4146, "tcp"},
-{"tgcconnect", {NULL}, 4146, "udp"},
-{"vrxpservman", {NULL}, 4147, "tcp"},
-{"vrxpservman", {NULL}, 4147, "udp"},
-{"hhb-handheld", {NULL}, 4148, "tcp"},
-{"hhb-handheld", {NULL}, 4148, "udp"},
-{"agslb", {NULL}, 4149, "tcp"},
-{"agslb", {NULL}, 4149, "udp"},
-{"PowerAlert-nsa", {NULL}, 4150, "tcp"},
-{"PowerAlert-nsa", {NULL}, 4150, "udp"},
-{"menandmice_noh", {NULL}, 4151, "tcp"},
-{"menandmice_noh", {NULL}, 4151, "udp"},
-{"idig_mux", {NULL}, 4152, "tcp"},
-{"idig_mux", {NULL}, 4152, "udp"},
-{"mbl-battd", {NULL}, 4153, "tcp"},
-{"mbl-battd", {NULL}, 4153, "udp"},
-{"atlinks", {NULL}, 4154, "tcp"},
-{"atlinks", {NULL}, 4154, "udp"},
-{"bzr", {NULL}, 4155, "tcp"},
-{"bzr", {NULL}, 4155, "udp"},
-{"stat-results", {NULL}, 4156, "tcp"},
-{"stat-results", {NULL}, 4156, "udp"},
-{"stat-scanner", {NULL}, 4157, "tcp"},
-{"stat-scanner", {NULL}, 4157, "udp"},
-{"stat-cc", {NULL}, 4158, "tcp"},
-{"stat-cc", {NULL}, 4158, "udp"},
-{"nss", {NULL}, 4159, "tcp"},
-{"nss", {NULL}, 4159, "udp"},
-{"jini-discovery", {NULL}, 4160, "tcp"},
-{"jini-discovery", {NULL}, 4160, "udp"},
-{"omscontact", {NULL}, 4161, "tcp"},
-{"omscontact", {NULL}, 4161, "udp"},
-{"omstopology", {NULL}, 4162, "tcp"},
-{"omstopology", {NULL}, 4162, "udp"},
-{"silverpeakpeer", {NULL}, 4163, "tcp"},
-{"silverpeakpeer", {NULL}, 4163, "udp"},
-{"silverpeakcomm", {NULL}, 4164, "tcp"},
-{"silverpeakcomm", {NULL}, 4164, "udp"},
-{"altcp", {NULL}, 4165, "tcp"},
-{"altcp", {NULL}, 4165, "udp"},
-{"joost", {NULL}, 4166, "tcp"},
-{"joost", {NULL}, 4166, "udp"},
-{"ddgn", {NULL}, 4167, "tcp"},
-{"ddgn", {NULL}, 4167, "udp"},
-{"pslicser", {NULL}, 4168, "tcp"},
-{"pslicser", {NULL}, 4168, "udp"},
-{"iadt", {NULL}, 4169, "tcp"},
-{"iadt-disc", {NULL}, 4169, "udp"},
-{"d-cinema-csp", {NULL}, 4170, "tcp"},
-{"ml-svnet", {NULL}, 4171, "tcp"},
-{"pcoip", {NULL}, 4172, "tcp"},
-{"pcoip", {NULL}, 4172, "udp"},
-{"smcluster", {NULL}, 4174, "tcp"},
-{"bccp", {NULL}, 4175, "tcp"},
-{"tl-ipcproxy", {NULL}, 4176, "tcp"},
-{"wello", {NULL}, 4177, "tcp"},
-{"wello", {NULL}, 4177, "udp"},
-{"storman", {NULL}, 4178, "tcp"},
-{"storman", {NULL}, 4178, "udp"},
-{"MaxumSP", {NULL}, 4179, "tcp"},
-{"MaxumSP", {NULL}, 4179, "udp"},
-{"httpx", {NULL}, 4180, "tcp"},
-{"httpx", {NULL}, 4180, "udp"},
-{"macbak", {NULL}, 4181, "tcp"},
-{"macbak", {NULL}, 4181, "udp"},
-{"pcptcpservice", {NULL}, 4182, "tcp"},
-{"pcptcpservice", {NULL}, 4182, "udp"},
-{"gmmp", {NULL}, 4183, "tcp"},
-{"gmmp", {NULL}, 4183, "udp"},
-{"universe_suite", {NULL}, 4184, "tcp"},
-{"universe_suite", {NULL}, 4184, "udp"},
-{"wcpp", {NULL}, 4185, "tcp"},
-{"wcpp", {NULL}, 4185, "udp"},
-{"boxbackupstore", {NULL}, 4186, "tcp"},
-{"csc_proxy", {NULL}, 4187, "tcp"},
-{"vatata", {NULL}, 4188, "tcp"},
-{"vatata", {NULL}, 4188, "udp"},
-{"pcep", {NULL}, 4189, "tcp"},
-{"sieve", {NULL}, 4190, "tcp"},
-{"dsmipv6", {NULL}, 4191, "udp"},
-{"azeti", {NULL}, 4192, "tcp"},
-{"azeti-bd", {NULL}, 4192, "udp"},
-{"pvxplusio", {NULL}, 4193, "tcp"},
-{"eims-admin", {NULL}, 4199, "tcp"},
-{"eims-admin", {NULL}, 4199, "udp"},
-{"corelccam", {NULL}, 4300, "tcp"},
-{"corelccam", {NULL}, 4300, "udp"},
-{"d-data", {NULL}, 4301, "tcp"},
-{"d-data", {NULL}, 4301, "udp"},
-{"d-data-control", {NULL}, 4302, "tcp"},
-{"d-data-control", {NULL}, 4302, "udp"},
-{"srcp", {NULL}, 4303, "tcp"},
-{"srcp", {NULL}, 4303, "udp"},
-{"owserver", {NULL}, 4304, "tcp"},
-{"owserver", {NULL}, 4304, "udp"},
-{"batman", {NULL}, 4305, "tcp"},
-{"batman", {NULL}, 4305, "udp"},
-{"pinghgl", {NULL}, 4306, "tcp"},
-{"pinghgl", {NULL}, 4306, "udp"},
-{"visicron-vs", {NULL}, 4307, "tcp"},
-{"visicron-vs", {NULL}, 4307, "udp"},
-{"compx-lockview", {NULL}, 4308, "tcp"},
-{"compx-lockview", {NULL}, 4308, "udp"},
-{"dserver", {NULL}, 4309, "tcp"},
-{"dserver", {NULL}, 4309, "udp"},
-{"mirrtex", {NULL}, 4310, "tcp"},
-{"mirrtex", {NULL}, 4310, "udp"},
-{"p6ssmc", {NULL}, 4311, "tcp"},
-{"pscl-mgt", {NULL}, 4312, "tcp"},
-{"perrla", {NULL}, 4313, "tcp"},
-{"fdt-rcatp", {NULL}, 4320, "tcp"},
-{"fdt-rcatp", {NULL}, 4320, "udp"},
-{"rwhois", {NULL}, 4321, "tcp"},
-{"rwhois", {NULL}, 4321, "udp"},
-{"trim-event", {NULL}, 4322, "tcp"},
-{"trim-event", {NULL}, 4322, "udp"},
-{"trim-ice", {NULL}, 4323, "tcp"},
-{"trim-ice", {NULL}, 4323, "udp"},
-{"balour", {NULL}, 4324, "tcp"},
-{"balour", {NULL}, 4324, "udp"},
-{"geognosisman", {NULL}, 4325, "tcp"},
-{"geognosisman", {NULL}, 4325, "udp"},
-{"geognosis", {NULL}, 4326, "tcp"},
-{"geognosis", {NULL}, 4326, "udp"},
-{"jaxer-web", {NULL}, 4327, "tcp"},
-{"jaxer-web", {NULL}, 4327, "udp"},
-{"jaxer-manager", {NULL}, 4328, "tcp"},
-{"jaxer-manager", {NULL}, 4328, "udp"},
-{"publiqare-sync", {NULL}, 4329, "tcp"},
-{"gaia", {NULL}, 4340, "tcp"},
-{"gaia", {NULL}, 4340, "udp"},
-{"lisp-data", {NULL}, 4341, "tcp"},
-{"lisp-data", {NULL}, 4341, "udp"},
-{"lisp-cons", {NULL}, 4342, "tcp"},
-{"lisp-control", {NULL}, 4342, "udp"},
-{"unicall", {NULL}, 4343, "tcp"},
-{"unicall", {NULL}, 4343, "udp"},
-{"vinainstall", {NULL}, 4344, "tcp"},
-{"vinainstall", {NULL}, 4344, "udp"},
-{"m4-network-as", {NULL}, 4345, "tcp"},
-{"m4-network-as", {NULL}, 4345, "udp"},
-{"elanlm", {NULL}, 4346, "tcp"},
-{"elanlm", {NULL}, 4346, "udp"},
-{"lansurveyor", {NULL}, 4347, "tcp"},
-{"lansurveyor", {NULL}, 4347, "udp"},
-{"itose", {NULL}, 4348, "tcp"},
-{"itose", {NULL}, 4348, "udp"},
-{"fsportmap", {NULL}, 4349, "tcp"},
-{"fsportmap", {NULL}, 4349, "udp"},
-{"net-device", {NULL}, 4350, "tcp"},
-{"net-device", {NULL}, 4350, "udp"},
-{"plcy-net-svcs", {NULL}, 4351, "tcp"},
-{"plcy-net-svcs", {NULL}, 4351, "udp"},
-{"pjlink", {NULL}, 4352, "tcp"},
-{"pjlink", {NULL}, 4352, "udp"},
-{"f5-iquery", {NULL}, 4353, "tcp"},
-{"f5-iquery", {NULL}, 4353, "udp"},
-{"qsnet-trans", {NULL}, 4354, "tcp"},
-{"qsnet-trans", {NULL}, 4354, "udp"},
-{"qsnet-workst", {NULL}, 4355, "tcp"},
-{"qsnet-workst", {NULL}, 4355, "udp"},
-{"qsnet-assist", {NULL}, 4356, "tcp"},
-{"qsnet-assist", {NULL}, 4356, "udp"},
-{"qsnet-cond", {NULL}, 4357, "tcp"},
-{"qsnet-cond", {NULL}, 4357, "udp"},
-{"qsnet-nucl", {NULL}, 4358, "tcp"},
-{"qsnet-nucl", {NULL}, 4358, "udp"},
-{"omabcastltkm", {NULL}, 4359, "tcp"},
-{"omabcastltkm", {NULL}, 4359, "udp"},
-{"matrix_vnet", {NULL}, 4360, "tcp"},
-{"nacnl", {NULL}, 4361, "udp"},
-{"afore-vdp-disc", {NULL}, 4362, "udp"},
-{"wxbrief", {NULL}, 4368, "tcp"},
-{"wxbrief", {NULL}, 4368, "udp"},
-{"epmd", {NULL}, 4369, "tcp"},
-{"epmd", {NULL}, 4369, "udp"},
-{"elpro_tunnel", {NULL}, 4370, "tcp"},
-{"elpro_tunnel", {NULL}, 4370, "udp"},
-{"l2c-control", {NULL}, 4371, "tcp"},
-{"l2c-disc", {NULL}, 4371, "udp"},
-{"l2c-data", {NULL}, 4372, "tcp"},
-{"l2c-data", {NULL}, 4372, "udp"},
-{"remctl", {NULL}, 4373, "tcp"},
-{"remctl", {NULL}, 4373, "udp"},
-{"psi-ptt", {NULL}, 4374, "tcp"},
-{"tolteces", {NULL}, 4375, "tcp"},
-{"tolteces", {NULL}, 4375, "udp"},
-{"bip", {NULL}, 4376, "tcp"},
-{"bip", {NULL}, 4376, "udp"},
-{"cp-spxsvr", {NULL}, 4377, "tcp"},
-{"cp-spxsvr", {NULL}, 4377, "udp"},
-{"cp-spxdpy", {NULL}, 4378, "tcp"},
-{"cp-spxdpy", {NULL}, 4378, "udp"},
-{"ctdb", {NULL}, 4379, "tcp"},
-{"ctdb", {NULL}, 4379, "udp"},
-{"xandros-cms", {NULL}, 4389, "tcp"},
-{"xandros-cms", {NULL}, 4389, "udp"},
-{"wiegand", {NULL}, 4390, "tcp"},
-{"wiegand", {NULL}, 4390, "udp"},
-{"apwi-imserver", {NULL}, 4391, "tcp"},
-{"apwi-rxserver", {NULL}, 4392, "tcp"},
-{"apwi-rxspooler", {NULL}, 4393, "tcp"},
-{"apwi-disc", {NULL}, 4394, "udp"},
-{"omnivisionesx", {NULL}, 4395, "tcp"},
-{"omnivisionesx", {NULL}, 4395, "udp"},
-{"fly", {NULL}, 4396, "tcp"},
-{"ds-srv", {NULL}, 4400, "tcp"},
-{"ds-srv", {NULL}, 4400, "udp"},
-{"ds-srvr", {NULL}, 4401, "tcp"},
-{"ds-srvr", {NULL}, 4401, "udp"},
-{"ds-clnt", {NULL}, 4402, "tcp"},
-{"ds-clnt", {NULL}, 4402, "udp"},
-{"ds-user", {NULL}, 4403, "tcp"},
-{"ds-user", {NULL}, 4403, "udp"},
-{"ds-admin", {NULL}, 4404, "tcp"},
-{"ds-admin", {NULL}, 4404, "udp"},
-{"ds-mail", {NULL}, 4405, "tcp"},
-{"ds-mail", {NULL}, 4405, "udp"},
-{"ds-slp", {NULL}, 4406, "tcp"},
-{"ds-slp", {NULL}, 4406, "udp"},
-{"nacagent", {NULL}, 4407, "tcp"},
-{"slscc", {NULL}, 4408, "tcp"},
-{"netcabinet-com", {NULL}, 4409, "tcp"},
-{"itwo-server", {NULL}, 4410, "tcp"},
-{"netrockey6", {NULL}, 4425, "tcp"},
-{"netrockey6", {NULL}, 4425, "udp"},
-{"beacon-port-2", {NULL}, 4426, "tcp"},
-{"beacon-port-2", {NULL}, 4426, "udp"},
-{"drizzle", {NULL}, 4427, "tcp"},
-{"omviserver", {NULL}, 4428, "tcp"},
-{"omviagent", {NULL}, 4429, "tcp"},
-{"rsqlserver", {NULL}, 4430, "tcp"},
-{"rsqlserver", {NULL}, 4430, "udp"},
-{"wspipe", {NULL}, 4431, "tcp"},
-{"netblox", {NULL}, 4441, "udp"},
-{"saris", {NULL}, 4442, "tcp"},
-{"saris", {NULL}, 4442, "udp"},
-{"pharos", {NULL}, 4443, "tcp"},
-{"pharos", {NULL}, 4443, "udp"},
-{"krb524", {NULL}, 4444, "tcp"},
-{"krb524", {NULL}, 4444, "udp"},
-{"nv-video", {NULL}, 4444, "tcp"},
-{"nv-video", {NULL}, 4444, "udp"},
-{"upnotifyp", {NULL}, 4445, "tcp"},
-{"upnotifyp", {NULL}, 4445, "udp"},
-{"n1-fwp", {NULL}, 4446, "tcp"},
-{"n1-fwp", {NULL}, 4446, "udp"},
-{"n1-rmgmt", {NULL}, 4447, "tcp"},
-{"n1-rmgmt", {NULL}, 4447, "udp"},
-{"asc-slmd", {NULL}, 4448, "tcp"},
-{"asc-slmd", {NULL}, 4448, "udp"},
-{"privatewire", {NULL}, 4449, "tcp"},
-{"privatewire", {NULL}, 4449, "udp"},
-{"camp", {NULL}, 4450, "tcp"},
-{"camp", {NULL}, 4450, "udp"},
-{"ctisystemmsg", {NULL}, 4451, "tcp"},
-{"ctisystemmsg", {NULL}, 4451, "udp"},
-{"ctiprogramload", {NULL}, 4452, "tcp"},
-{"ctiprogramload", {NULL}, 4452, "udp"},
-{"nssalertmgr", {NULL}, 4453, "tcp"},
-{"nssalertmgr", {NULL}, 4453, "udp"},
-{"nssagentmgr", {NULL}, 4454, "tcp"},
-{"nssagentmgr", {NULL}, 4454, "udp"},
-{"prchat-user", {NULL}, 4455, "tcp"},
-{"prchat-user", {NULL}, 4455, "udp"},
-{"prchat-server", {NULL}, 4456, "tcp"},
-{"prchat-server", {NULL}, 4456, "udp"},
-{"prRegister", {NULL}, 4457, "tcp"},
-{"prRegister", {NULL}, 4457, "udp"},
-{"mcp", {NULL}, 4458, "tcp"},
-{"mcp", {NULL}, 4458, "udp"},
-{"hpssmgmt", {NULL}, 4484, "tcp"},
-{"hpssmgmt", {NULL}, 4484, "udp"},
-{"assyst-dr", {NULL}, 4485, "tcp"},
-{"icms", {NULL}, 4486, "tcp"},
-{"icms", {NULL}, 4486, "udp"},
-{"prex-tcp", {NULL}, 4487, "tcp"},
-{"awacs-ice", {NULL}, 4488, "tcp"},
-{"awacs-ice", {NULL}, 4488, "udp"},
-{"ipsec-nat-t", {NULL}, 4500, "tcp"},
-{"ipsec-nat-t", {NULL}, 4500, "udp"},
-{"ehs", {NULL}, 4535, "tcp"},
-{"ehs", {NULL}, 4535, "udp"},
-{"ehs-ssl", {NULL}, 4536, "tcp"},
-{"ehs-ssl", {NULL}, 4536, "udp"},
-{"wssauthsvc", {NULL}, 4537, "tcp"},
-{"wssauthsvc", {NULL}, 4537, "udp"},
-{"swx-gate", {NULL}, 4538, "tcp"},
-{"swx-gate", {NULL}, 4538, "udp"},
-{"worldscores", {NULL}, 4545, "tcp"},
-{"worldscores", {NULL}, 4545, "udp"},
-{"sf-lm", {NULL}, 4546, "tcp"},
-{"sf-lm", {NULL}, 4546, "udp"},
-{"lanner-lm", {NULL}, 4547, "tcp"},
-{"lanner-lm", {NULL}, 4547, "udp"},
-{"synchromesh", {NULL}, 4548, "tcp"},
-{"synchromesh", {NULL}, 4548, "udp"},
-{"aegate", {NULL}, 4549, "tcp"},
-{"aegate", {NULL}, 4549, "udp"},
-{"gds-adppiw-db", {NULL}, 4550, "tcp"},
-{"gds-adppiw-db", {NULL}, 4550, "udp"},
-{"ieee-mih", {NULL}, 4551, "tcp"},
-{"ieee-mih", {NULL}, 4551, "udp"},
-{"menandmice-mon", {NULL}, 4552, "tcp"},
-{"menandmice-mon", {NULL}, 4552, "udp"},
-{"icshostsvc", {NULL}, 4553, "tcp"},
-{"msfrs", {NULL}, 4554, "tcp"},
-{"msfrs", {NULL}, 4554, "udp"},
-{"rsip", {NULL}, 4555, "tcp"},
-{"rsip", {NULL}, 4555, "udp"},
-{"dtn-bundle-tcp", {NULL}, 4556, "tcp"},
-{"dtn-bundle-udp", {NULL}, 4556, "udp"},
-{"mtcevrunqss", {NULL}, 4557, "udp"},
-{"mtcevrunqman", {NULL}, 4558, "udp"},
-{"hylafax", {NULL}, 4559, "tcp"},
-{"hylafax", {NULL}, 4559, "udp"},
-{"kwtc", {NULL}, 4566, "tcp"},
-{"kwtc", {NULL}, 4566, "udp"},
-{"tram", {NULL}, 4567, "tcp"},
-{"tram", {NULL}, 4567, "udp"},
-{"bmc-reporting", {NULL}, 4568, "tcp"},
-{"bmc-reporting", {NULL}, 4568, "udp"},
-{"iax", {NULL}, 4569, "tcp"},
-{"iax", {NULL}, 4569, "udp"},
-{"rid", {NULL}, 4590, "tcp"},
-{"l3t-at-an", {NULL}, 4591, "tcp"},
-{"l3t-at-an", {NULL}, 4591, "udp"},
-{"hrpd-ith-at-an", {NULL}, 4592, "udp"},
-{"ipt-anri-anri", {NULL}, 4593, "tcp"},
-{"ipt-anri-anri", {NULL}, 4593, "udp"},
-{"ias-session", {NULL}, 4594, "tcp"},
-{"ias-session", {NULL}, 4594, "udp"},
-{"ias-paging", {NULL}, 4595, "tcp"},
-{"ias-paging", {NULL}, 4595, "udp"},
-{"ias-neighbor", {NULL}, 4596, "tcp"},
-{"ias-neighbor", {NULL}, 4596, "udp"},
-{"a21-an-1xbs", {NULL}, 4597, "tcp"},
-{"a21-an-1xbs", {NULL}, 4597, "udp"},
-{"a16-an-an", {NULL}, 4598, "tcp"},
-{"a16-an-an", {NULL}, 4598, "udp"},
-{"a17-an-an", {NULL}, 4599, "tcp"},
-{"a17-an-an", {NULL}, 4599, "udp"},
-{"piranha1", {NULL}, 4600, "tcp"},
-{"piranha1", {NULL}, 4600, "udp"},
-{"piranha2", {NULL}, 4601, "tcp"},
-{"piranha2", {NULL}, 4601, "udp"},
-{"mtsserver", {NULL}, 4602, "tcp"},
-{"menandmice-upg", {NULL}, 4603, "tcp"},
-{"playsta2-app", {NULL}, 4658, "tcp"},
-{"playsta2-app", {NULL}, 4658, "udp"},
-{"playsta2-lob", {NULL}, 4659, "tcp"},
-{"playsta2-lob", {NULL}, 4659, "udp"},
-{"smaclmgr", {NULL}, 4660, "tcp"},
-{"smaclmgr", {NULL}, 4660, "udp"},
-{"kar2ouche", {NULL}, 4661, "tcp"},
-{"kar2ouche", {NULL}, 4661, "udp"},
-{"oms", {NULL}, 4662, "tcp"},
-{"oms", {NULL}, 4662, "udp"},
-{"noteit", {NULL}, 4663, "tcp"},
-{"noteit", {NULL}, 4663, "udp"},
-{"ems", {NULL}, 4664, "tcp"},
-{"ems", {NULL}, 4664, "udp"},
-{"contclientms", {NULL}, 4665, "tcp"},
-{"contclientms", {NULL}, 4665, "udp"},
-{"eportcomm", {NULL}, 4666, "tcp"},
-{"eportcomm", {NULL}, 4666, "udp"},
-{"mmacomm", {NULL}, 4667, "tcp"},
-{"mmacomm", {NULL}, 4667, "udp"},
-{"mmaeds", {NULL}, 4668, "tcp"},
-{"mmaeds", {NULL}, 4668, "udp"},
-{"eportcommdata", {NULL}, 4669, "tcp"},
-{"eportcommdata", {NULL}, 4669, "udp"},
-{"light", {NULL}, 4670, "tcp"},
-{"light", {NULL}, 4670, "udp"},
-{"acter", {NULL}, 4671, "tcp"},
-{"acter", {NULL}, 4671, "udp"},
-{"rfa", {NULL}, 4672, "tcp"},
-{"rfa", {NULL}, 4672, "udp"},
-{"cxws", {NULL}, 4673, "tcp"},
-{"cxws", {NULL}, 4673, "udp"},
-{"appiq-mgmt", {NULL}, 4674, "tcp"},
-{"appiq-mgmt", {NULL}, 4674, "udp"},
-{"dhct-status", {NULL}, 4675, "tcp"},
-{"dhct-status", {NULL}, 4675, "udp"},
-{"dhct-alerts", {NULL}, 4676, "tcp"},
-{"dhct-alerts", {NULL}, 4676, "udp"},
-{"bcs", {NULL}, 4677, "tcp"},
-{"bcs", {NULL}, 4677, "udp"},
-{"traversal", {NULL}, 4678, "tcp"},
-{"traversal", {NULL}, 4678, "udp"},
-{"mgesupervision", {NULL}, 4679, "tcp"},
-{"mgesupervision", {NULL}, 4679, "udp"},
-{"mgemanagement", {NULL}, 4680, "tcp"},
-{"mgemanagement", {NULL}, 4680, "udp"},
-{"parliant", {NULL}, 4681, "tcp"},
-{"parliant", {NULL}, 4681, "udp"},
-{"finisar", {NULL}, 4682, "tcp"},
-{"finisar", {NULL}, 4682, "udp"},
-{"spike", {NULL}, 4683, "tcp"},
-{"spike", {NULL}, 4683, "udp"},
-{"rfid-rp1", {NULL}, 4684, "tcp"},
-{"rfid-rp1", {NULL}, 4684, "udp"},
-{"autopac", {NULL}, 4685, "tcp"},
-{"autopac", {NULL}, 4685, "udp"},
-{"msp-os", {NULL}, 4686, "tcp"},
-{"msp-os", {NULL}, 4686, "udp"},
-{"nst", {NULL}, 4687, "tcp"},
-{"nst", {NULL}, 4687, "udp"},
-{"mobile-p2p", {NULL}, 4688, "tcp"},
-{"mobile-p2p", {NULL}, 4688, "udp"},
-{"altovacentral", {NULL}, 4689, "tcp"},
-{"altovacentral", {NULL}, 4689, "udp"},
-{"prelude", {NULL}, 4690, "tcp"},
-{"prelude", {NULL}, 4690, "udp"},
-{"mtn", {NULL}, 4691, "tcp"},
-{"mtn", {NULL}, 4691, "udp"},
-{"conspiracy", {NULL}, 4692, "tcp"},
-{"conspiracy", {NULL}, 4692, "udp"},
-{"netxms-agent", {NULL}, 4700, "tcp"},
-{"netxms-agent", {NULL}, 4700, "udp"},
-{"netxms-mgmt", {NULL}, 4701, "tcp"},
-{"netxms-mgmt", {NULL}, 4701, "udp"},
-{"netxms-sync", {NULL}, 4702, "tcp"},
-{"netxms-sync", {NULL}, 4702, "udp"},
-{"npqes-test", {NULL}, 4703, "tcp"},
-{"assuria-ins", {NULL}, 4704, "tcp"},
-{"truckstar", {NULL}, 4725, "tcp"},
-{"truckstar", {NULL}, 4725, "udp"},
-{"a26-fap-fgw", {NULL}, 4726, "udp"},
-{"fcis", {NULL}, 4727, "tcp"},
-{"fcis-disc", {NULL}, 4727, "udp"},
-{"capmux", {NULL}, 4728, "tcp"},
-{"capmux", {NULL}, 4728, "udp"},
-{"gsmtap", {NULL}, 4729, "udp"},
-{"gearman", {NULL}, 4730, "tcp"},
-{"gearman", {NULL}, 4730, "udp"},
-{"remcap", {NULL}, 4731, "tcp"},
-{"ohmtrigger", {NULL}, 4732, "udp"},
-{"resorcs", {NULL}, 4733, "tcp"},
-{"ipdr-sp", {NULL}, 4737, "tcp"},
-{"ipdr-sp", {NULL}, 4737, "udp"},
-{"solera-lpn", {NULL}, 4738, "tcp"},
-{"solera-lpn", {NULL}, 4738, "udp"},
-{"ipfix", {NULL}, 4739, "tcp"},
-{"ipfix", {NULL}, 4739, "udp"},
-{"ipfix", {NULL}, 4739, "sctp"},
-{"ipfixs", {NULL}, 4740, "tcp"},
-{"ipfixs", {NULL}, 4740, "sctp"},
-{"ipfixs", {NULL}, 4740, "udp"},
-{"lumimgrd", {NULL}, 4741, "tcp"},
-{"lumimgrd", {NULL}, 4741, "udp"},
-{"sicct", {NULL}, 4742, "tcp"},
-{"sicct-sdp", {NULL}, 4742, "udp"},
-{"openhpid", {NULL}, 4743, "tcp"},
-{"openhpid", {NULL}, 4743, "udp"},
-{"ifsp", {NULL}, 4744, "tcp"},
-{"ifsp", {NULL}, 4744, "udp"},
-{"fmp", {NULL}, 4745, "tcp"},
-{"fmp", {NULL}, 4745, "udp"},
-{"profilemac", {NULL}, 4749, "tcp"},
-{"profilemac", {NULL}, 4749, "udp"},
-{"ssad", {NULL}, 4750, "tcp"},
-{"ssad", {NULL}, 4750, "udp"},
-{"spocp", {NULL}, 4751, "tcp"},
-{"spocp", {NULL}, 4751, "udp"},
-{"snap", {NULL}, 4752, "tcp"},
-{"snap", {NULL}, 4752, "udp"},
-{"bfd-multi-ctl", {NULL}, 4784, "tcp"},
-{"bfd-multi-ctl", {NULL}, 4784, "udp"},
-{"cncp", {NULL}, 4785, "udp"},
-{"smart-install", {NULL}, 4786, "tcp"},
-{"sia-ctrl-plane", {NULL}, 4787, "tcp"},
-{"iims", {NULL}, 4800, "tcp"},
-{"iims", {NULL}, 4800, "udp"},
-{"iwec", {NULL}, 4801, "tcp"},
-{"iwec", {NULL}, 4801, "udp"},
-{"ilss", {NULL}, 4802, "tcp"},
-{"ilss", {NULL}, 4802, "udp"},
-{"notateit", {NULL}, 4803, "tcp"},
-{"notateit-disc", {NULL}, 4803, "udp"},
-{"aja-ntv4-disc", {NULL}, 4804, "udp"},
-{"htcp", {NULL}, 4827, "tcp"},
-{"htcp", {NULL}, 4827, "udp"},
-{"varadero-0", {NULL}, 4837, "tcp"},
-{"varadero-0", {NULL}, 4837, "udp"},
-{"varadero-1", {NULL}, 4838, "tcp"},
-{"varadero-1", {NULL}, 4838, "udp"},
-{"varadero-2", {NULL}, 4839, "tcp"},
-{"varadero-2", {NULL}, 4839, "udp"},
-{"opcua-tcp", {NULL}, 4840, "tcp"},
-{"opcua-udp", {NULL}, 4840, "udp"},
-{"quosa", {NULL}, 4841, "tcp"},
-{"quosa", {NULL}, 4841, "udp"},
-{"gw-asv", {NULL}, 4842, "tcp"},
-{"gw-asv", {NULL}, 4842, "udp"},
-{"opcua-tls", {NULL}, 4843, "tcp"},
-{"opcua-tls", {NULL}, 4843, "udp"},
-{"gw-log", {NULL}, 4844, "tcp"},
-{"gw-log", {NULL}, 4844, "udp"},
-{"wcr-remlib", {NULL}, 4845, "tcp"},
-{"wcr-remlib", {NULL}, 4845, "udp"},
-{"contamac_icm", {NULL}, 4846, "tcp"},
-{"contamac_icm", {NULL}, 4846, "udp"},
-{"wfc", {NULL}, 4847, "tcp"},
-{"wfc", {NULL}, 4847, "udp"},
-{"appserv-http", {NULL}, 4848, "tcp"},
-{"appserv-http", {NULL}, 4848, "udp"},
-{"appserv-https", {NULL}, 4849, "tcp"},
-{"appserv-https", {NULL}, 4849, "udp"},
-{"sun-as-nodeagt", {NULL}, 4850, "tcp"},
-{"sun-as-nodeagt", {NULL}, 4850, "udp"},
-{"derby-repli", {NULL}, 4851, "tcp"},
-{"derby-repli", {NULL}, 4851, "udp"},
-{"unify-debug", {NULL}, 4867, "tcp"},
-{"unify-debug", {NULL}, 4867, "udp"},
-{"phrelay", {NULL}, 4868, "tcp"},
-{"phrelay", {NULL}, 4868, "udp"},
-{"phrelaydbg", {NULL}, 4869, "tcp"},
-{"phrelaydbg", {NULL}, 4869, "udp"},
-{"cc-tracking", {NULL}, 4870, "tcp"},
-{"cc-tracking", {NULL}, 4870, "udp"},
-{"wired", {NULL}, 4871, "tcp"},
-{"wired", {NULL}, 4871, "udp"},
-{"tritium-can", {NULL}, 4876, "tcp"},
-{"tritium-can", {NULL}, 4876, "udp"},
-{"lmcs", {NULL}, 4877, "tcp"},
-{"lmcs", {NULL}, 4877, "udp"},
-{"inst-discovery", {NULL}, 4878, "udp"},
-{"wsdl-event", {NULL}, 4879, "tcp"},
-{"hislip", {NULL}, 4880, "tcp"},
-{"socp-t", {NULL}, 4881, "udp"},
-{"socp-c", {NULL}, 4882, "udp"},
-{"wmlserver", {NULL}, 4883, "tcp"},
-{"hivestor", {NULL}, 4884, "tcp"},
-{"hivestor", {NULL}, 4884, "udp"},
-{"abbs", {NULL}, 4885, "tcp"},
-{"abbs", {NULL}, 4885, "udp"},
-{"lyskom", {NULL}, 4894, "tcp"},
-{"lyskom", {NULL}, 4894, "udp"},
-{"radmin-port", {NULL}, 4899, "tcp"},
-{"radmin-port", {NULL}, 4899, "udp"},
-{"hfcs", {NULL}, 4900, "tcp"},
-{"hfcs", {NULL}, 4900, "udp"},
-{"flr_agent", {NULL}, 4901, "tcp"},
-{"magiccontrol", {NULL}, 4902, "tcp"},
-{"lutap", {NULL}, 4912, "tcp"},
-{"lutcp", {NULL}, 4913, "tcp"},
-{"bones", {NULL}, 4914, "tcp"},
-{"bones", {NULL}, 4914, "udp"},
-{"frcs", {NULL}, 4915, "tcp"},
-{"atsc-mh-ssc", {NULL}, 4937, "udp"},
-{"eq-office-4940", {NULL}, 4940, "tcp"},
-{"eq-office-4940", {NULL}, 4940, "udp"},
-{"eq-office-4941", {NULL}, 4941, "tcp"},
-{"eq-office-4941", {NULL}, 4941, "udp"},
-{"eq-office-4942", {NULL}, 4942, "tcp"},
-{"eq-office-4942", {NULL}, 4942, "udp"},
-{"munin", {NULL}, 4949, "tcp"},
-{"munin", {NULL}, 4949, "udp"},
-{"sybasesrvmon", {NULL}, 4950, "tcp"},
-{"sybasesrvmon", {NULL}, 4950, "udp"},
-{"pwgwims", {NULL}, 4951, "tcp"},
-{"pwgwims", {NULL}, 4951, "udp"},
-{"sagxtsds", {NULL}, 4952, "tcp"},
-{"sagxtsds", {NULL}, 4952, "udp"},
-{"dbsyncarbiter", {NULL}, 4953, "tcp"},
-{"ccss-qmm", {NULL}, 4969, "tcp"},
-{"ccss-qmm", {NULL}, 4969, "udp"},
-{"ccss-qsm", {NULL}, 4970, "tcp"},
-{"ccss-qsm", {NULL}, 4970, "udp"},
-{"webyast", {NULL}, 4984, "tcp"},
-{"gerhcs", {NULL}, 4985, "tcp"},
-{"mrip", {NULL}, 4986, "tcp"},
-{"mrip", {NULL}, 4986, "udp"},
-{"smar-se-port1", {NULL}, 4987, "tcp"},
-{"smar-se-port1", {NULL}, 4987, "udp"},
-{"smar-se-port2", {NULL}, 4988, "tcp"},
-{"smar-se-port2", {NULL}, 4988, "udp"},
-{"parallel", {NULL}, 4989, "tcp"},
-{"parallel", {NULL}, 4989, "udp"},
-{"busycal", {NULL}, 4990, "tcp"},
-{"busycal", {NULL}, 4990, "udp"},
-{"vrt", {NULL}, 4991, "tcp"},
-{"vrt", {NULL}, 4991, "udp"},
-{"hfcs-manager", {NULL}, 4999, "tcp"},
-{"hfcs-manager", {NULL}, 4999, "udp"},
-{"commplex-main", {NULL}, 5000, "tcp"},
-{"commplex-main", {NULL}, 5000, "udp"},
-{"commplex-link", {NULL}, 5001, "tcp"},
-{"commplex-link", {NULL}, 5001, "udp"},
-{"rfe", {NULL}, 5002, "tcp"},
-{"rfe", {NULL}, 5002, "udp"},
-{"fmpro-internal", {NULL}, 5003, "tcp"},
-{"fmpro-internal", {NULL}, 5003, "udp"},
-{"avt-profile-1", {NULL}, 5004, "tcp"},
-{"avt-profile-1", {NULL}, 5004, "udp"},
-{"avt-profile-1", {NULL}, 5004, "dccp"},
-{"avt-profile-2", {NULL}, 5005, "tcp"},
-{"avt-profile-2", {NULL}, 5005, "udp"},
-{"avt-profile-2", {NULL}, 5005, "dccp"},
-{"wsm-server", {NULL}, 5006, "tcp"},
-{"wsm-server", {NULL}, 5006, "udp"},
-{"wsm-server-ssl", {NULL}, 5007, "tcp"},
-{"wsm-server-ssl", {NULL}, 5007, "udp"},
-{"synapsis-edge", {NULL}, 5008, "tcp"},
-{"synapsis-edge", {NULL}, 5008, "udp"},
-{"winfs", {NULL}, 5009, "tcp"},
-{"winfs", {NULL}, 5009, "udp"},
-{"telelpathstart", {NULL}, 5010, "tcp"},
-{"telelpathstart", {NULL}, 5010, "udp"},
-{"telelpathattack", {NULL}, 5011, "tcp"},
-{"telelpathattack", {NULL}, 5011, "udp"},
-{"nsp", {NULL}, 5012, "tcp"},
-{"nsp", {NULL}, 5012, "udp"},
-{"fmpro-v6", {NULL}, 5013, "tcp"},
-{"fmpro-v6", {NULL}, 5013, "udp"},
-{"onpsocket", {NULL}, 5014, "udp"},
-{"fmwp", {NULL}, 5015, "tcp"},
-{"zenginkyo-1", {NULL}, 5020, "tcp"},
-{"zenginkyo-1", {NULL}, 5020, "udp"},
-{"zenginkyo-2", {NULL}, 5021, "tcp"},
-{"zenginkyo-2", {NULL}, 5021, "udp"},
-{"mice", {NULL}, 5022, "tcp"},
-{"mice", {NULL}, 5022, "udp"},
-{"htuilsrv", {NULL}, 5023, "tcp"},
-{"htuilsrv", {NULL}, 5023, "udp"},
-{"scpi-telnet", {NULL}, 5024, "tcp"},
-{"scpi-telnet", {NULL}, 5024, "udp"},
-{"scpi-raw", {NULL}, 5025, "tcp"},
-{"scpi-raw", {NULL}, 5025, "udp"},
-{"strexec-d", {NULL}, 5026, "tcp"},
-{"strexec-d", {NULL}, 5026, "udp"},
-{"strexec-s", {NULL}, 5027, "tcp"},
-{"strexec-s", {NULL}, 5027, "udp"},
-{"qvr", {NULL}, 5028, "tcp"},
-{"infobright", {NULL}, 5029, "tcp"},
-{"infobright", {NULL}, 5029, "udp"},
-{"surfpass", {NULL}, 5030, "tcp"},
-{"surfpass", {NULL}, 5030, "udp"},
-{"dmp", {NULL}, 5031, "udp"},
-{"asnaacceler8db", {NULL}, 5042, "tcp"},
-{"asnaacceler8db", {NULL}, 5042, "udp"},
-{"swxadmin", {NULL}, 5043, "tcp"},
-{"swxadmin", {NULL}, 5043, "udp"},
-{"lxi-evntsvc", {NULL}, 5044, "tcp"},
-{"lxi-evntsvc", {NULL}, 5044, "udp"},
-{"osp", {NULL}, 5045, "tcp"},
-{"vpm-udp", {NULL}, 5046, "udp"},
-{"iscape", {NULL}, 5047, "udp"},
-{"texai", {NULL}, 5048, "tcp"},
-{"ivocalize", {NULL}, 5049, "tcp"},
-{"ivocalize", {NULL}, 5049, "udp"},
-{"mmcc", {NULL}, 5050, "tcp"},
-{"mmcc", {NULL}, 5050, "udp"},
-{"ita-agent", {NULL}, 5051, "tcp"},
-{"ita-agent", {NULL}, 5051, "udp"},
-{"ita-manager", {NULL}, 5052, "tcp"},
-{"ita-manager", {NULL}, 5052, "udp"},
-{"rlm", {NULL}, 5053, "tcp"},
-{"rlm-admin", {NULL}, 5054, "tcp"},
-{"unot", {NULL}, 5055, "tcp"},
-{"unot", {NULL}, 5055, "udp"},
-{"intecom-ps1", {NULL}, 5056, "tcp"},
-{"intecom-ps1", {NULL}, 5056, "udp"},
-{"intecom-ps2", {NULL}, 5057, "tcp"},
-{"intecom-ps2", {NULL}, 5057, "udp"},
-{"locus-disc", {NULL}, 5058, "udp"},
-{"sds", {NULL}, 5059, "tcp"},
-{"sds", {NULL}, 5059, "udp"},
-{"sip", {NULL}, 5060, "tcp"},
-{"sip", {NULL}, 5060, "udp"},
-{"sip-tls", {NULL}, 5061, "tcp"},
-{"sip-tls", {NULL}, 5061, "udp"},
-{"na-localise", {NULL}, 5062, "tcp"},
-{"na-localise", {NULL}, 5062, "udp"},
-{"csrpc", {NULL}, 5063, "tcp"},
-{"ca-1", {NULL}, 5064, "tcp"},
-{"ca-1", {NULL}, 5064, "udp"},
-{"ca-2", {NULL}, 5065, "tcp"},
-{"ca-2", {NULL}, 5065, "udp"},
-{"stanag-5066", {NULL}, 5066, "tcp"},
-{"stanag-5066", {NULL}, 5066, "udp"},
-{"authentx", {NULL}, 5067, "tcp"},
-{"authentx", {NULL}, 5067, "udp"},
-{"bitforestsrv", {NULL}, 5068, "tcp"},
-{"i-net-2000-npr", {NULL}, 5069, "tcp"},
-{"i-net-2000-npr", {NULL}, 5069, "udp"},
-{"vtsas", {NULL}, 5070, "tcp"},
-{"vtsas", {NULL}, 5070, "udp"},
-{"powerschool", {NULL}, 5071, "tcp"},
-{"powerschool", {NULL}, 5071, "udp"},
-{"ayiya", {NULL}, 5072, "tcp"},
-{"ayiya", {NULL}, 5072, "udp"},
-{"tag-pm", {NULL}, 5073, "tcp"},
-{"tag-pm", {NULL}, 5073, "udp"},
-{"alesquery", {NULL}, 5074, "tcp"},
-{"alesquery", {NULL}, 5074, "udp"},
-{"cp-spxrpts", {NULL}, 5079, "udp"},
-{"onscreen", {NULL}, 5080, "tcp"},
-{"onscreen", {NULL}, 5080, "udp"},
-{"sdl-ets", {NULL}, 5081, "tcp"},
-{"sdl-ets", {NULL}, 5081, "udp"},
-{"qcp", {NULL}, 5082, "tcp"},
-{"qcp", {NULL}, 5082, "udp"},
-{"qfp", {NULL}, 5083, "tcp"},
-{"qfp", {NULL}, 5083, "udp"},
-{"llrp", {NULL}, 5084, "tcp"},
-{"llrp", {NULL}, 5084, "udp"},
-{"encrypted-llrp", {NULL}, 5085, "tcp"},
-{"encrypted-llrp", {NULL}, 5085, "udp"},
-{"aprigo-cs", {NULL}, 5086, "tcp"},
-{"car", {NULL}, 5090, "sctp"},
-{"cxtp", {NULL}, 5091, "sctp"},
-{"magpie", {NULL}, 5092, "udp"},
-{"sentinel-lm", {NULL}, 5093, "tcp"},
-{"sentinel-lm", {NULL}, 5093, "udp"},
-{"hart-ip", {NULL}, 5094, "tcp"},
-{"hart-ip", {NULL}, 5094, "udp"},
-{"sentlm-srv2srv", {NULL}, 5099, "tcp"},
-{"sentlm-srv2srv", {NULL}, 5099, "udp"},
-{"socalia", {NULL}, 5100, "tcp"},
-{"socalia", {NULL}, 5100, "udp"},
-{"talarian-tcp", {NULL}, 5101, "tcp"},
-{"talarian-udp", {NULL}, 5101, "udp"},
-{"oms-nonsecure", {NULL}, 5102, "tcp"},
-{"oms-nonsecure", {NULL}, 5102, "udp"},
-{"actifio-c2c", {NULL}, 5103, "tcp"},
-{"tinymessage", {NULL}, 5104, "udp"},
-{"hughes-ap", {NULL}, 5105, "udp"},
-{"taep-as-svc", {NULL}, 5111, "tcp"},
-{"taep-as-svc", {NULL}, 5111, "udp"},
-{"pm-cmdsvr", {NULL}, 5112, "tcp"},
-{"pm-cmdsvr", {NULL}, 5112, "udp"},
-{"ev-services", {NULL}, 5114, "tcp"},
-{"autobuild", {NULL}, 5115, "tcp"},
-{"emb-proj-cmd", {NULL}, 5116, "udp"},
-{"gradecam", {NULL}, 5117, "tcp"},
-{"nbt-pc", {NULL}, 5133, "tcp"},
-{"nbt-pc", {NULL}, 5133, "udp"},
-{"ppactivation", {NULL}, 5134, "tcp"},
-{"erp-scale", {NULL}, 5135, "tcp"},
-{"minotaur-sa", {NULL}, 5136, "udp"},
-{"ctsd", {NULL}, 5137, "tcp"},
-{"ctsd", {NULL}, 5137, "udp"},
-{"rmonitor_secure", {NULL}, 5145, "tcp"},
-{"rmonitor_secure", {NULL}, 5145, "udp"},
-{"social-alarm", {NULL}, 5146, "tcp"},
-{"atmp", {NULL}, 5150, "tcp"},
-{"atmp", {NULL}, 5150, "udp"},
-{"esri_sde", {NULL}, 5151, "tcp"},
-{"esri_sde", {NULL}, 5151, "udp"},
-{"sde-discovery", {NULL}, 5152, "tcp"},
-{"sde-discovery", {NULL}, 5152, "udp"},
-{"toruxserver", {NULL}, 5153, "tcp"},
-{"bzflag", {NULL}, 5154, "tcp"},
-{"bzflag", {NULL}, 5154, "udp"},
-{"asctrl-agent", {NULL}, 5155, "tcp"},
-{"asctrl-agent", {NULL}, 5155, "udp"},
-{"rugameonline", {NULL}, 5156, "tcp"},
-{"mediat", {NULL}, 5157, "tcp"},
-{"snmpssh", {NULL}, 5161, "tcp"},
-{"snmpssh-trap", {NULL}, 5162, "tcp"},
-{"sbackup", {NULL}, 5163, "tcp"},
-{"vpa", {NULL}, 5164, "tcp"},
-{"vpa-disc", {NULL}, 5164, "udp"},
-{"ife_icorp", {NULL}, 5165, "tcp"},
-{"ife_icorp", {NULL}, 5165, "udp"},
-{"winpcs", {NULL}, 5166, "tcp"},
-{"winpcs", {NULL}, 5166, "udp"},
-{"scte104", {NULL}, 5167, "tcp"},
-{"scte104", {NULL}, 5167, "udp"},
-{"scte30", {NULL}, 5168, "tcp"},
-{"scte30", {NULL}, 5168, "udp"},
-{"aol", {NULL}, 5190, "tcp"},
-{"aol", {NULL}, 5190, "udp"},
-{"aol-1", {NULL}, 5191, "tcp"},
-{"aol-1", {NULL}, 5191, "udp"},
-{"aol-2", {NULL}, 5192, "tcp"},
-{"aol-2", {NULL}, 5192, "udp"},
-{"aol-3", {NULL}, 5193, "tcp"},
-{"aol-3", {NULL}, 5193, "udp"},
-{"cpscomm", {NULL}, 5194, "tcp"},
-{"targus-getdata", {NULL}, 5200, "tcp"},
-{"targus-getdata", {NULL}, 5200, "udp"},
-{"targus-getdata1", {NULL}, 5201, "tcp"},
-{"targus-getdata1", {NULL}, 5201, "udp"},
-{"targus-getdata2", {NULL}, 5202, "tcp"},
-{"targus-getdata2", {NULL}, 5202, "udp"},
-{"targus-getdata3", {NULL}, 5203, "tcp"},
-{"targus-getdata3", {NULL}, 5203, "udp"},
-{"3exmp", {NULL}, 5221, "tcp"},
-{"xmpp-client", {NULL}, 5222, "tcp"},
-{"hpvirtgrp", {NULL}, 5223, "tcp"},
-{"hpvirtgrp", {NULL}, 5223, "udp"},
-{"hpvirtctrl", {NULL}, 5224, "tcp"},
-{"hpvirtctrl", {NULL}, 5224, "udp"},
-{"hp-server", {NULL}, 5225, "tcp"},
-{"hp-server", {NULL}, 5225, "udp"},
-{"hp-status", {NULL}, 5226, "tcp"},
-{"hp-status", {NULL}, 5226, "udp"},
-{"perfd", {NULL}, 5227, "tcp"},
-{"perfd", {NULL}, 5227, "udp"},
-{"hpvroom", {NULL}, 5228, "tcp"},
-{"csedaemon", {NULL}, 5232, "tcp"},
-{"enfs", {NULL}, 5233, "tcp"},
-{"eenet", {NULL}, 5234, "tcp"},
-{"eenet", {NULL}, 5234, "udp"},
-{"galaxy-network", {NULL}, 5235, "tcp"},
-{"galaxy-network", {NULL}, 5235, "udp"},
-{"padl2sim", {NULL}, 5236, "tcp"},
-{"padl2sim", {NULL}, 5236, "udp"},
-{"mnet-discovery", {NULL}, 5237, "tcp"},
-{"mnet-discovery", {NULL}, 5237, "udp"},
-{"downtools", {NULL}, 5245, "tcp"},
-{"downtools-disc", {NULL}, 5245, "udp"},
-{"capwap-control", {NULL}, 5246, "udp"},
-{"capwap-data", {NULL}, 5247, "udp"},
-{"caacws", {NULL}, 5248, "tcp"},
-{"caacws", {NULL}, 5248, "udp"},
-{"caaclang2", {NULL}, 5249, "tcp"},
-{"caaclang2", {NULL}, 5249, "udp"},
-{"soagateway", {NULL}, 5250, "tcp"},
-{"soagateway", {NULL}, 5250, "udp"},
-{"caevms", {NULL}, 5251, "tcp"},
-{"caevms", {NULL}, 5251, "udp"},
-{"movaz-ssc", {NULL}, 5252, "tcp"},
-{"movaz-ssc", {NULL}, 5252, "udp"},
-{"kpdp", {NULL}, 5253, "tcp"},
-{"3com-njack-1", {NULL}, 5264, "tcp"},
-{"3com-njack-1", {NULL}, 5264, "udp"},
-{"3com-njack-2", {NULL}, 5265, "tcp"},
-{"3com-njack-2", {NULL}, 5265, "udp"},
-{"xmpp-server", {NULL}, 5269, "tcp"},
-{"xmp", {NULL}, 5270, "tcp"},
-{"xmp", {NULL}, 5270, "udp"},
-{"cuelink", {NULL}, 5271, "tcp"},
-{"cuelink-disc", {NULL}, 5271, "udp"},
-{"pk", {NULL}, 5272, "tcp"},
-{"pk", {NULL}, 5272, "udp"},
-{"xmpp-bosh", {NULL}, 5280, "tcp"},
-{"undo-lm", {NULL}, 5281, "tcp"},
-{"transmit-port", {NULL}, 5282, "tcp"},
-{"transmit-port", {NULL}, 5282, "udp"},
-{"presence", {NULL}, 5298, "tcp"},
-{"presence", {NULL}, 5298, "udp"},
-{"nlg-data", {NULL}, 5299, "tcp"},
-{"nlg-data", {NULL}, 5299, "udp"},
-{"hacl-hb", {NULL}, 5300, "tcp"},
-{"hacl-hb", {NULL}, 5300, "udp"},
-{"hacl-gs", {NULL}, 5301, "tcp"},
-{"hacl-gs", {NULL}, 5301, "udp"},
-{"hacl-cfg", {NULL}, 5302, "tcp"},
-{"hacl-cfg", {NULL}, 5302, "udp"},
-{"hacl-probe", {NULL}, 5303, "tcp"},
-{"hacl-probe", {NULL}, 5303, "udp"},
-{"hacl-local", {NULL}, 5304, "tcp"},
-{"hacl-local", {NULL}, 5304, "udp"},
-{"hacl-test", {NULL}, 5305, "tcp"},
-{"hacl-test", {NULL}, 5305, "udp"},
-{"sun-mc-grp", {NULL}, 5306, "tcp"},
-{"sun-mc-grp", {NULL}, 5306, "udp"},
-{"sco-aip", {NULL}, 5307, "tcp"},
-{"sco-aip", {NULL}, 5307, "udp"},
-{"cfengine", {NULL}, 5308, "tcp"},
-{"cfengine", {NULL}, 5308, "udp"},
-{"jprinter", {NULL}, 5309, "tcp"},
-{"jprinter", {NULL}, 5309, "udp"},
-{"outlaws", {NULL}, 5310, "tcp"},
-{"outlaws", {NULL}, 5310, "udp"},
-{"permabit-cs", {NULL}, 5312, "tcp"},
-{"permabit-cs", {NULL}, 5312, "udp"},
-{"rrdp", {NULL}, 5313, "tcp"},
-{"rrdp", {NULL}, 5313, "udp"},
-{"opalis-rbt-ipc", {NULL}, 5314, "tcp"},
-{"opalis-rbt-ipc", {NULL}, 5314, "udp"},
-{"hacl-poll", {NULL}, 5315, "tcp"},
-{"hacl-poll", {NULL}, 5315, "udp"},
-{"hpdevms", {NULL}, 5316, "tcp"},
-{"hpdevms", {NULL}, 5316, "udp"},
-{"bsfserver-zn", {NULL}, 5320, "tcp"},
-{"bsfsvr-zn-ssl", {NULL}, 5321, "tcp"},
-{"kfserver", {NULL}, 5343, "tcp"},
-{"kfserver", {NULL}, 5343, "udp"},
-{"xkotodrcp", {NULL}, 5344, "tcp"},
-{"xkotodrcp", {NULL}, 5344, "udp"},
-{"stuns", {NULL}, 5349, "tcp"},
-{"stuns", {NULL}, 5349, "udp"},
-{"turns", {NULL}, 5349, "tcp"},
-{"turns", {NULL}, 5349, "udp"},
-{"stun-behaviors", {NULL}, 5349, "tcp"},
-{"stun-behaviors", {NULL}, 5349, "udp"},
-{"nat-pmp-status", {NULL}, 5350, "tcp"},
-{"nat-pmp-status", {NULL}, 5350, "udp"},
-{"nat-pmp", {NULL}, 5351, "tcp"},
-{"nat-pmp", {NULL}, 5351, "udp"},
-{"dns-llq", {NULL}, 5352, "tcp"},
-{"dns-llq", {NULL}, 5352, "udp"},
-{"mdns", {NULL}, 5353, "tcp"},
-{"mdns", {NULL}, 5353, "udp"},
-{"mdnsresponder", {NULL}, 5354, "tcp"},
-{"mdnsresponder", {NULL}, 5354, "udp"},
-{"llmnr", {NULL}, 5355, "tcp"},
-{"llmnr", {NULL}, 5355, "udp"},
-{"ms-smlbiz", {NULL}, 5356, "tcp"},
-{"ms-smlbiz", {NULL}, 5356, "udp"},
-{"wsdapi", {NULL}, 5357, "tcp"},
-{"wsdapi", {NULL}, 5357, "udp"},
-{"wsdapi-s", {NULL}, 5358, "tcp"},
-{"wsdapi-s", {NULL}, 5358, "udp"},
-{"ms-alerter", {NULL}, 5359, "tcp"},
-{"ms-alerter", {NULL}, 5359, "udp"},
-{"ms-sideshow", {NULL}, 5360, "tcp"},
-{"ms-sideshow", {NULL}, 5360, "udp"},
-{"ms-s-sideshow", {NULL}, 5361, "tcp"},
-{"ms-s-sideshow", {NULL}, 5361, "udp"},
-{"serverwsd2", {NULL}, 5362, "tcp"},
-{"serverwsd2", {NULL}, 5362, "udp"},
-{"net-projection", {NULL}, 5363, "tcp"},
-{"net-projection", {NULL}, 5363, "udp"},
-{"stresstester", {NULL}, 5397, "tcp"},
-{"stresstester", {NULL}, 5397, "udp"},
-{"elektron-admin", {NULL}, 5398, "tcp"},
-{"elektron-admin", {NULL}, 5398, "udp"},
-{"securitychase", {NULL}, 5399, "tcp"},
-{"securitychase", {NULL}, 5399, "udp"},
-{"excerpt", {NULL}, 5400, "tcp"},
-{"excerpt", {NULL}, 5400, "udp"},
-{"excerpts", {NULL}, 5401, "tcp"},
-{"excerpts", {NULL}, 5401, "udp"},
-{"mftp", {NULL}, 5402, "tcp"},
-{"mftp", {NULL}, 5402, "udp"},
-{"hpoms-ci-lstn", {NULL}, 5403, "tcp"},
-{"hpoms-ci-lstn", {NULL}, 5403, "udp"},
-{"hpoms-dps-lstn", {NULL}, 5404, "tcp"},
-{"hpoms-dps-lstn", {NULL}, 5404, "udp"},
-{"netsupport", {NULL}, 5405, "tcp"},
-{"netsupport", {NULL}, 5405, "udp"},
-{"systemics-sox", {NULL}, 5406, "tcp"},
-{"systemics-sox", {NULL}, 5406, "udp"},
-{"foresyte-clear", {NULL}, 5407, "tcp"},
-{"foresyte-clear", {NULL}, 5407, "udp"},
-{"foresyte-sec", {NULL}, 5408, "tcp"},
-{"foresyte-sec", {NULL}, 5408, "udp"},
-{"salient-dtasrv", {NULL}, 5409, "tcp"},
-{"salient-dtasrv", {NULL}, 5409, "udp"},
-{"salient-usrmgr", {NULL}, 5410, "tcp"},
-{"salient-usrmgr", {NULL}, 5410, "udp"},
-{"actnet", {NULL}, 5411, "tcp"},
-{"actnet", {NULL}, 5411, "udp"},
-{"continuus", {NULL}, 5412, "tcp"},
-{"continuus", {NULL}, 5412, "udp"},
-{"wwiotalk", {NULL}, 5413, "tcp"},
-{"wwiotalk", {NULL}, 5413, "udp"},
-{"statusd", {NULL}, 5414, "tcp"},
-{"statusd", {NULL}, 5414, "udp"},
-{"ns-server", {NULL}, 5415, "tcp"},
-{"ns-server", {NULL}, 5415, "udp"},
-{"sns-gateway", {NULL}, 5416, "tcp"},
-{"sns-gateway", {NULL}, 5416, "udp"},
-{"sns-agent", {NULL}, 5417, "tcp"},
-{"sns-agent", {NULL}, 5417, "udp"},
-{"mcntp", {NULL}, 5418, "tcp"},
-{"mcntp", {NULL}, 5418, "udp"},
-{"dj-ice", {NULL}, 5419, "tcp"},
-{"dj-ice", {NULL}, 5419, "udp"},
-{"cylink-c", {NULL}, 5420, "tcp"},
-{"cylink-c", {NULL}, 5420, "udp"},
-{"netsupport2", {NULL}, 5421, "tcp"},
-{"netsupport2", {NULL}, 5421, "udp"},
-{"salient-mux", {NULL}, 5422, "tcp"},
-{"salient-mux", {NULL}, 5422, "udp"},
-{"virtualuser", {NULL}, 5423, "tcp"},
-{"virtualuser", {NULL}, 5423, "udp"},
-{"beyond-remote", {NULL}, 5424, "tcp"},
-{"beyond-remote", {NULL}, 5424, "udp"},
-{"br-channel", {NULL}, 5425, "tcp"},
-{"br-channel", {NULL}, 5425, "udp"},
-{"devbasic", {NULL}, 5426, "tcp"},
-{"devbasic", {NULL}, 5426, "udp"},
-{"sco-peer-tta", {NULL}, 5427, "tcp"},
-{"sco-peer-tta", {NULL}, 5427, "udp"},
-{"telaconsole", {NULL}, 5428, "tcp"},
-{"telaconsole", {NULL}, 5428, "udp"},
-{"base", {NULL}, 5429, "tcp"},
-{"base", {NULL}, 5429, "udp"},
-{"radec-corp", {NULL}, 5430, "tcp"},
-{"radec-corp", {NULL}, 5430, "udp"},
-{"park-agent", {NULL}, 5431, "tcp"},
-{"park-agent", {NULL}, 5431, "udp"},
-{"postgresql", {NULL}, 5432, "tcp"},
-{"postgresql", {NULL}, 5432, "udp"},
-{"pyrrho", {NULL}, 5433, "tcp"},
-{"pyrrho", {NULL}, 5433, "udp"},
-{"sgi-arrayd", {NULL}, 5434, "tcp"},
-{"sgi-arrayd", {NULL}, 5434, "udp"},
-{"sceanics", {NULL}, 5435, "tcp"},
-{"sceanics", {NULL}, 5435, "udp"},
-{"pmip6-cntl", {NULL}, 5436, "udp"},
-{"pmip6-data", {NULL}, 5437, "udp"},
-{"spss", {NULL}, 5443, "tcp"},
-{"spss", {NULL}, 5443, "udp"},
-{"surebox", {NULL}, 5453, "tcp"},
-{"surebox", {NULL}, 5453, "udp"},
-{"apc-5454", {NULL}, 5454, "tcp"},
-{"apc-5454", {NULL}, 5454, "udp"},
-{"apc-5455", {NULL}, 5455, "tcp"},
-{"apc-5455", {NULL}, 5455, "udp"},
-{"apc-5456", {NULL}, 5456, "tcp"},
-{"apc-5456", {NULL}, 5456, "udp"},
-{"silkmeter", {NULL}, 5461, "tcp"},
-{"silkmeter", {NULL}, 5461, "udp"},
-{"ttl-publisher", {NULL}, 5462, "tcp"},
-{"ttl-publisher", {NULL}, 5462, "udp"},
-{"ttlpriceproxy", {NULL}, 5463, "tcp"},
-{"ttlpriceproxy", {NULL}, 5463, "udp"},
-{"quailnet", {NULL}, 5464, "tcp"},
-{"quailnet", {NULL}, 5464, "udp"},
-{"netops-broker", {NULL}, 5465, "tcp"},
-{"netops-broker", {NULL}, 5465, "udp"},
-{"fcp-addr-srvr1", {NULL}, 5500, "tcp"},
-{"fcp-addr-srvr1", {NULL}, 5500, "udp"},
-{"fcp-addr-srvr2", {NULL}, 5501, "tcp"},
-{"fcp-addr-srvr2", {NULL}, 5501, "udp"},
-{"fcp-srvr-inst1", {NULL}, 5502, "tcp"},
-{"fcp-srvr-inst1", {NULL}, 5502, "udp"},
-{"fcp-srvr-inst2", {NULL}, 5503, "tcp"},
-{"fcp-srvr-inst2", {NULL}, 5503, "udp"},
-{"fcp-cics-gw1", {NULL}, 5504, "tcp"},
-{"fcp-cics-gw1", {NULL}, 5504, "udp"},
-{"checkoutdb", {NULL}, 5505, "tcp"},
-{"checkoutdb", {NULL}, 5505, "udp"},
-{"amc", {NULL}, 5506, "tcp"},
-{"amc", {NULL}, 5506, "udp"},
-{"sgi-eventmond", {NULL}, 5553, "tcp"},
-{"sgi-eventmond", {NULL}, 5553, "udp"},
-{"sgi-esphttp", {NULL}, 5554, "tcp"},
-{"sgi-esphttp", {NULL}, 5554, "udp"},
-{"personal-agent", {NULL}, 5555, "tcp"},
-{"personal-agent", {NULL}, 5555, "udp"},
-{"freeciv", {NULL}, 5556, "tcp"},
-{"freeciv", {NULL}, 5556, "udp"},
-{"farenet", {NULL}, 5557, "tcp"},
-{"westec-connect", {NULL}, 5566, "tcp"},
-{"m-oap", {NULL}, 5567, "tcp"},
-{"m-oap", {NULL}, 5567, "udp"},
-{"sdt", {NULL}, 5568, "tcp"},
-{"sdt", {NULL}, 5568, "udp"},
-{"sdmmp", {NULL}, 5573, "tcp"},
-{"sdmmp", {NULL}, 5573, "udp"},
-{"lsi-bobcat", {NULL}, 5574, "tcp"},
-{"ora-oap", {NULL}, 5575, "tcp"},
-{"fdtracks", {NULL}, 5579, "tcp"},
-{"tmosms0", {NULL}, 5580, "tcp"},
-{"tmosms0", {NULL}, 5580, "udp"},
-{"tmosms1", {NULL}, 5581, "tcp"},
-{"tmosms1", {NULL}, 5581, "udp"},
-{"fac-restore", {NULL}, 5582, "tcp"},
-{"fac-restore", {NULL}, 5582, "udp"},
-{"tmo-icon-sync", {NULL}, 5583, "tcp"},
-{"tmo-icon-sync", {NULL}, 5583, "udp"},
-{"bis-web", {NULL}, 5584, "tcp"},
-{"bis-web", {NULL}, 5584, "udp"},
-{"bis-sync", {NULL}, 5585, "tcp"},
-{"bis-sync", {NULL}, 5585, "udp"},
-{"ininmessaging", {NULL}, 5597, "tcp"},
-{"ininmessaging", {NULL}, 5597, "udp"},
-{"mctfeed", {NULL}, 5598, "tcp"},
-{"mctfeed", {NULL}, 5598, "udp"},
-{"esinstall", {NULL}, 5599, "tcp"},
-{"esinstall", {NULL}, 5599, "udp"},
-{"esmmanager", {NULL}, 5600, "tcp"},
-{"esmmanager", {NULL}, 5600, "udp"},
-{"esmagent", {NULL}, 5601, "tcp"},
-{"esmagent", {NULL}, 5601, "udp"},
-{"a1-msc", {NULL}, 5602, "tcp"},
-{"a1-msc", {NULL}, 5602, "udp"},
-{"a1-bs", {NULL}, 5603, "tcp"},
-{"a1-bs", {NULL}, 5603, "udp"},
-{"a3-sdunode", {NULL}, 5604, "tcp"},
-{"a3-sdunode", {NULL}, 5604, "udp"},
-{"a4-sdunode", {NULL}, 5605, "tcp"},
-{"a4-sdunode", {NULL}, 5605, "udp"},
-{"ninaf", {NULL}, 5627, "tcp"},
-{"ninaf", {NULL}, 5627, "udp"},
-{"htrust", {NULL}, 5628, "tcp"},
-{"htrust", {NULL}, 5628, "udp"},
-{"symantec-sfdb", {NULL}, 5629, "tcp"},
-{"symantec-sfdb", {NULL}, 5629, "udp"},
-{"precise-comm", {NULL}, 5630, "tcp"},
-{"precise-comm", {NULL}, 5630, "udp"},
-{"pcanywheredata", {NULL}, 5631, "tcp"},
-{"pcanywheredata", {NULL}, 5631, "udp"},
-{"pcanywherestat", {NULL}, 5632, "tcp"},
-{"pcanywherestat", {NULL}, 5632, "udp"},
-{"beorl", {NULL}, 5633, "tcp"},
-{"beorl", {NULL}, 5633, "udp"},
-{"xprtld", {NULL}, 5634, "tcp"},
-{"xprtld", {NULL}, 5634, "udp"},
-{"sfmsso", {NULL}, 5635, "tcp"},
-{"sfm-db-server", {NULL}, 5636, "tcp"},
-{"cssc", {NULL}, 5637, "tcp"},
-{"amqps", {NULL}, 5671, "tcp"},
-{"amqps", {NULL}, 5671, "udp"},
-{"amqp", {NULL}, 5672, "tcp"},
-{"amqp", {NULL}, 5672, "udp"},
-{"amqp", {NULL}, 5672, "sctp"},
-{"jms", {NULL}, 5673, "tcp"},
-{"jms", {NULL}, 5673, "udp"},
-{"hyperscsi-port", {NULL}, 5674, "tcp"},
-{"hyperscsi-port", {NULL}, 5674, "udp"},
-{"v5ua", {NULL}, 5675, "tcp"},
-{"v5ua", {NULL}, 5675, "udp"},
-{"v5ua", {NULL}, 5675, "sctp"},
-{"raadmin", {NULL}, 5676, "tcp"},
-{"raadmin", {NULL}, 5676, "udp"},
-{"questdb2-lnchr", {NULL}, 5677, "tcp"},
-{"questdb2-lnchr", {NULL}, 5677, "udp"},
-{"rrac", {NULL}, 5678, "tcp"},
-{"rrac", {NULL}, 5678, "udp"},
-{"dccm", {NULL}, 5679, "tcp"},
-{"dccm", {NULL}, 5679, "udp"},
-{"auriga-router", {NULL}, 5680, "tcp"},
-{"auriga-router", {NULL}, 5680, "udp"},
-{"ncxcp", {NULL}, 5681, "tcp"},
-{"ncxcp", {NULL}, 5681, "udp"},
-{"brightcore", {NULL}, 5682, "udp"},
-{"ggz", {NULL}, 5688, "tcp"},
-{"ggz", {NULL}, 5688, "udp"},
-{"qmvideo", {NULL}, 5689, "tcp"},
-{"qmvideo", {NULL}, 5689, "udp"},
-{"proshareaudio", {NULL}, 5713, "tcp"},
-{"proshareaudio", {NULL}, 5713, "udp"},
-{"prosharevideo", {NULL}, 5714, "tcp"},
-{"prosharevideo", {NULL}, 5714, "udp"},
-{"prosharedata", {NULL}, 5715, "tcp"},
-{"prosharedata", {NULL}, 5715, "udp"},
-{"prosharerequest", {NULL}, 5716, "tcp"},
-{"prosharerequest", {NULL}, 5716, "udp"},
-{"prosharenotify", {NULL}, 5717, "tcp"},
-{"prosharenotify", {NULL}, 5717, "udp"},
-{"dpm", {NULL}, 5718, "tcp"},
-{"dpm", {NULL}, 5718, "udp"},
-{"dpm-agent", {NULL}, 5719, "tcp"},
-{"dpm-agent", {NULL}, 5719, "udp"},
-{"ms-licensing", {NULL}, 5720, "tcp"},
-{"ms-licensing", {NULL}, 5720, "udp"},
-{"dtpt", {NULL}, 5721, "tcp"},
-{"dtpt", {NULL}, 5721, "udp"},
-{"msdfsr", {NULL}, 5722, "tcp"},
-{"msdfsr", {NULL}, 5722, "udp"},
-{"omhs", {NULL}, 5723, "tcp"},
-{"omhs", {NULL}, 5723, "udp"},
-{"omsdk", {NULL}, 5724, "tcp"},
-{"omsdk", {NULL}, 5724, "udp"},
-{"ms-ilm", {NULL}, 5725, "tcp"},
-{"ms-ilm-sts", {NULL}, 5726, "tcp"},
-{"asgenf", {NULL}, 5727, "tcp"},
-{"io-dist-data", {NULL}, 5728, "tcp"},
-{"io-dist-group", {NULL}, 5728, "udp"},
-{"openmail", {NULL}, 5729, "tcp"},
-{"openmail", {NULL}, 5729, "udp"},
-{"unieng", {NULL}, 5730, "tcp"},
-{"unieng", {NULL}, 5730, "udp"},
-{"ida-discover1", {NULL}, 5741, "tcp"},
-{"ida-discover1", {NULL}, 5741, "udp"},
-{"ida-discover2", {NULL}, 5742, "tcp"},
-{"ida-discover2", {NULL}, 5742, "udp"},
-{"watchdoc-pod", {NULL}, 5743, "tcp"},
-{"watchdoc-pod", {NULL}, 5743, "udp"},
-{"watchdoc", {NULL}, 5744, "tcp"},
-{"watchdoc", {NULL}, 5744, "udp"},
-{"fcopy-server", {NULL}, 5745, "tcp"},
-{"fcopy-server", {NULL}, 5745, "udp"},
-{"fcopys-server", {NULL}, 5746, "tcp"},
-{"fcopys-server", {NULL}, 5746, "udp"},
-{"tunatic", {NULL}, 5747, "tcp"},
-{"tunatic", {NULL}, 5747, "udp"},
-{"tunalyzer", {NULL}, 5748, "tcp"},
-{"tunalyzer", {NULL}, 5748, "udp"},
-{"rscd", {NULL}, 5750, "tcp"},
-{"rscd", {NULL}, 5750, "udp"},
-{"openmailg", {NULL}, 5755, "tcp"},
-{"openmailg", {NULL}, 5755, "udp"},
-{"x500ms", {NULL}, 5757, "tcp"},
-{"x500ms", {NULL}, 5757, "udp"},
-{"openmailns", {NULL}, 5766, "tcp"},
-{"openmailns", {NULL}, 5766, "udp"},
-{"s-openmail", {NULL}, 5767, "tcp"},
-{"s-openmail", {NULL}, 5767, "udp"},
-{"openmailpxy", {NULL}, 5768, "tcp"},
-{"openmailpxy", {NULL}, 5768, "udp"},
-{"spramsca", {NULL}, 5769, "tcp"},
-{"spramsca", {NULL}, 5769, "udp"},
-{"spramsd", {NULL}, 5770, "tcp"},
-{"spramsd", {NULL}, 5770, "udp"},
-{"netagent", {NULL}, 5771, "tcp"},
-{"netagent", {NULL}, 5771, "udp"},
-{"dali-port", {NULL}, 5777, "tcp"},
-{"dali-port", {NULL}, 5777, "udp"},
-{"vts-rpc", {NULL}, 5780, "tcp"},
-{"3par-evts", {NULL}, 5781, "tcp"},
-{"3par-evts", {NULL}, 5781, "udp"},
-{"3par-mgmt", {NULL}, 5782, "tcp"},
-{"3par-mgmt", {NULL}, 5782, "udp"},
-{"3par-mgmt-ssl", {NULL}, 5783, "tcp"},
-{"3par-mgmt-ssl", {NULL}, 5783, "udp"},
-{"ibar", {NULL}, 5784, "udp"},
-{"3par-rcopy", {NULL}, 5785, "tcp"},
-{"3par-rcopy", {NULL}, 5785, "udp"},
-{"cisco-redu", {NULL}, 5786, "udp"},
-{"waascluster", {NULL}, 5787, "udp"},
-{"xtreamx", {NULL}, 5793, "tcp"},
-{"xtreamx", {NULL}, 5793, "udp"},
-{"spdp", {NULL}, 5794, "udp"},
-{"icmpd", {NULL}, 5813, "tcp"},
-{"icmpd", {NULL}, 5813, "udp"},
-{"spt-automation", {NULL}, 5814, "tcp"},
-{"spt-automation", {NULL}, 5814, "udp"},
-{"wherehoo", {NULL}, 5859, "tcp"},
-{"wherehoo", {NULL}, 5859, "udp"},
-{"ppsuitemsg", {NULL}, 5863, "tcp"},
-{"ppsuitemsg", {NULL}, 5863, "udp"},
-{"rfb", {NULL}, 5900, "tcp"},
-{"rfb", {NULL}, 5900, "udp"},
-{"cm", {NULL}, 5910, "tcp"},
-{"cm", {NULL}, 5910, "udp"},
-{"cpdlc", {NULL}, 5911, "tcp"},
-{"cpdlc", {NULL}, 5911, "udp"},
-{"fis", {NULL}, 5912, "tcp"},
-{"fis", {NULL}, 5912, "udp"},
-{"ads-c", {NULL}, 5913, "tcp"},
-{"ads-c", {NULL}, 5913, "udp"},
-{"indy", {NULL}, 5963, "tcp"},
-{"indy", {NULL}, 5963, "udp"},
-{"mppolicy-v5", {NULL}, 5968, "tcp"},
-{"mppolicy-v5", {NULL}, 5968, "udp"},
-{"mppolicy-mgr", {NULL}, 5969, "tcp"},
-{"mppolicy-mgr", {NULL}, 5969, "udp"},
-{"couchdb", {NULL}, 5984, "tcp"},
-{"couchdb", {NULL}, 5984, "udp"},
-{"wsman", {NULL}, 5985, "tcp"},
-{"wsman", {NULL}, 5985, "udp"},
-{"wsmans", {NULL}, 5986, "tcp"},
-{"wsmans", {NULL}, 5986, "udp"},
-{"wbem-rmi", {NULL}, 5987, "tcp"},
-{"wbem-rmi", {NULL}, 5987, "udp"},
-{"wbem-http", {NULL}, 5988, "tcp"},
-{"wbem-http", {NULL}, 5988, "udp"},
-{"wbem-https", {NULL}, 5989, "tcp"},
-{"wbem-https", {NULL}, 5989, "udp"},
-{"wbem-exp-https", {NULL}, 5990, "tcp"},
-{"wbem-exp-https", {NULL}, 5990, "udp"},
-{"nuxsl", {NULL}, 5991, "tcp"},
-{"nuxsl", {NULL}, 5991, "udp"},
-{"consul-insight", {NULL}, 5992, "tcp"},
-{"consul-insight", {NULL}, 5992, "udp"},
-{"cvsup", {NULL}, 5999, "tcp"},
-{"cvsup", {NULL}, 5999, "udp"},
-{"ndl-ahp-svc", {NULL}, 6064, "tcp"},
-{"ndl-ahp-svc", {NULL}, 6064, "udp"},
-{"winpharaoh", {NULL}, 6065, "tcp"},
-{"winpharaoh", {NULL}, 6065, "udp"},
-{"ewctsp", {NULL}, 6066, "tcp"},
-{"ewctsp", {NULL}, 6066, "udp"},
-{"gsmp", {NULL}, 6068, "tcp"},
-{"gsmp", {NULL}, 6068, "udp"},
-{"trip", {NULL}, 6069, "tcp"},
-{"trip", {NULL}, 6069, "udp"},
-{"messageasap", {NULL}, 6070, "tcp"},
-{"messageasap", {NULL}, 6070, "udp"},
-{"ssdtp", {NULL}, 6071, "tcp"},
-{"ssdtp", {NULL}, 6071, "udp"},
-{"diagnose-proc", {NULL}, 6072, "tcp"},
-{"diagnose-proc", {NULL}, 6072, "udp"},
-{"directplay8", {NULL}, 6073, "tcp"},
-{"directplay8", {NULL}, 6073, "udp"},
-{"max", {NULL}, 6074, "tcp"},
-{"max", {NULL}, 6074, "udp"},
-{"dpm-acm", {NULL}, 6075, "tcp"},
-{"miami-bcast", {NULL}, 6083, "udp"},
-{"p2p-sip", {NULL}, 6084, "tcp"},
-{"konspire2b", {NULL}, 6085, "tcp"},
-{"konspire2b", {NULL}, 6085, "udp"},
-{"pdtp", {NULL}, 6086, "tcp"},
-{"pdtp", {NULL}, 6086, "udp"},
-{"ldss", {NULL}, 6087, "tcp"},
-{"ldss", {NULL}, 6087, "udp"},
-{"raxa-mgmt", {NULL}, 6099, "tcp"},
-{"synchronet-db", {NULL}, 6100, "tcp"},
-{"synchronet-db", {NULL}, 6100, "udp"},
-{"synchronet-rtc", {NULL}, 6101, "tcp"},
-{"synchronet-rtc", {NULL}, 6101, "udp"},
-{"synchronet-upd", {NULL}, 6102, "tcp"},
-{"synchronet-upd", {NULL}, 6102, "udp"},
-{"rets", {NULL}, 6103, "tcp"},
-{"rets", {NULL}, 6103, "udp"},
-{"dbdb", {NULL}, 6104, "tcp"},
-{"dbdb", {NULL}, 6104, "udp"},
-{"primaserver", {NULL}, 6105, "tcp"},
-{"primaserver", {NULL}, 6105, "udp"},
-{"mpsserver", {NULL}, 6106, "tcp"},
-{"mpsserver", {NULL}, 6106, "udp"},
-{"etc-control", {NULL}, 6107, "tcp"},
-{"etc-control", {NULL}, 6107, "udp"},
-{"sercomm-scadmin", {NULL}, 6108, "tcp"},
-{"sercomm-scadmin", {NULL}, 6108, "udp"},
-{"globecast-id", {NULL}, 6109, "tcp"},
-{"globecast-id", {NULL}, 6109, "udp"},
-{"softcm", {NULL}, 6110, "tcp"},
-{"softcm", {NULL}, 6110, "udp"},
-{"spc", {NULL}, 6111, "tcp"},
-{"spc", {NULL}, 6111, "udp"},
-{"dtspcd", {NULL}, 6112, "tcp"},
-{"dtspcd", {NULL}, 6112, "udp"},
-{"dayliteserver", {NULL}, 6113, "tcp"},
-{"wrspice", {NULL}, 6114, "tcp"},
-{"xic", {NULL}, 6115, "tcp"},
-{"xtlserv", {NULL}, 6116, "tcp"},
-{"daylitetouch", {NULL}, 6117, "tcp"},
-{"spdy", {NULL}, 6121, "tcp"},
-{"bex-webadmin", {NULL}, 6122, "tcp"},
-{"bex-webadmin", {NULL}, 6122, "udp"},
-{"backup-express", {NULL}, 6123, "tcp"},
-{"backup-express", {NULL}, 6123, "udp"},
-{"pnbs", {NULL}, 6124, "tcp"},
-{"pnbs", {NULL}, 6124, "udp"},
-{"nbt-wol", {NULL}, 6133, "tcp"},
-{"nbt-wol", {NULL}, 6133, "udp"},
-{"pulsonixnls", {NULL}, 6140, "tcp"},
-{"pulsonixnls", {NULL}, 6140, "udp"},
-{"meta-corp", {NULL}, 6141, "tcp"},
-{"meta-corp", {NULL}, 6141, "udp"},
-{"aspentec-lm", {NULL}, 6142, "tcp"},
-{"aspentec-lm", {NULL}, 6142, "udp"},
-{"watershed-lm", {NULL}, 6143, "tcp"},
-{"watershed-lm", {NULL}, 6143, "udp"},
-{"statsci1-lm", {NULL}, 6144, "tcp"},
-{"statsci1-lm", {NULL}, 6144, "udp"},
-{"statsci2-lm", {NULL}, 6145, "tcp"},
-{"statsci2-lm", {NULL}, 6145, "udp"},
-{"lonewolf-lm", {NULL}, 6146, "tcp"},
-{"lonewolf-lm", {NULL}, 6146, "udp"},
-{"montage-lm", {NULL}, 6147, "tcp"},
-{"montage-lm", {NULL}, 6147, "udp"},
-{"ricardo-lm", {NULL}, 6148, "tcp"},
-{"ricardo-lm", {NULL}, 6148, "udp"},
-{"tal-pod", {NULL}, 6149, "tcp"},
-{"tal-pod", {NULL}, 6149, "udp"},
-{"efb-aci", {NULL}, 6159, "tcp"},
-{"patrol-ism", {NULL}, 6161, "tcp"},
-{"patrol-ism", {NULL}, 6161, "udp"},
-{"patrol-coll", {NULL}, 6162, "tcp"},
-{"patrol-coll", {NULL}, 6162, "udp"},
-{"pscribe", {NULL}, 6163, "tcp"},
-{"pscribe", {NULL}, 6163, "udp"},
-{"lm-x", {NULL}, 6200, "tcp"},
-{"lm-x", {NULL}, 6200, "udp"},
-{"radmind", {NULL}, 6222, "tcp"},
-{"radmind", {NULL}, 6222, "udp"},
-{"jeol-nsdtp-1", {NULL}, 6241, "tcp"},
-{"jeol-nsddp-1", {NULL}, 6241, "udp"},
-{"jeol-nsdtp-2", {NULL}, 6242, "tcp"},
-{"jeol-nsddp-2", {NULL}, 6242, "udp"},
-{"jeol-nsdtp-3", {NULL}, 6243, "tcp"},
-{"jeol-nsddp-3", {NULL}, 6243, "udp"},
-{"jeol-nsdtp-4", {NULL}, 6244, "tcp"},
-{"jeol-nsddp-4", {NULL}, 6244, "udp"},
-{"tl1-raw-ssl", {NULL}, 6251, "tcp"},
-{"tl1-raw-ssl", {NULL}, 6251, "udp"},
-{"tl1-ssh", {NULL}, 6252, "tcp"},
-{"tl1-ssh", {NULL}, 6252, "udp"},
-{"crip", {NULL}, 6253, "tcp"},
-{"crip", {NULL}, 6253, "udp"},
-{"gld", {NULL}, 6267, "tcp"},
-{"grid", {NULL}, 6268, "tcp"},
-{"grid", {NULL}, 6268, "udp"},
-{"grid-alt", {NULL}, 6269, "tcp"},
-{"grid-alt", {NULL}, 6269, "udp"},
-{"bmc-grx", {NULL}, 6300, "tcp"},
-{"bmc-grx", {NULL}, 6300, "udp"},
-{"bmc_ctd_ldap", {NULL}, 6301, "tcp"},
-{"bmc_ctd_ldap", {NULL}, 6301, "udp"},
-{"ufmp", {NULL}, 6306, "tcp"},
-{"ufmp", {NULL}, 6306, "udp"},
-{"scup", {NULL}, 6315, "tcp"},
-{"scup-disc", {NULL}, 6315, "udp"},
-{"abb-escp", {NULL}, 6316, "tcp"},
-{"abb-escp", {NULL}, 6316, "udp"},
-{"repsvc", {NULL}, 6320, "tcp"},
-{"repsvc", {NULL}, 6320, "udp"},
-{"emp-server1", {NULL}, 6321, "tcp"},
-{"emp-server1", {NULL}, 6321, "udp"},
-{"emp-server2", {NULL}, 6322, "tcp"},
-{"emp-server2", {NULL}, 6322, "udp"},
-{"sflow", {NULL}, 6343, "tcp"},
-{"sflow", {NULL}, 6343, "udp"},
-{"gnutella-svc", {NULL}, 6346, "tcp"},
-{"gnutella-svc", {NULL}, 6346, "udp"},
-{"gnutella-rtr", {NULL}, 6347, "tcp"},
-{"gnutella-rtr", {NULL}, 6347, "udp"},
-{"adap", {NULL}, 6350, "tcp"},
-{"adap", {NULL}, 6350, "udp"},
-{"pmcs", {NULL}, 6355, "tcp"},
-{"pmcs", {NULL}, 6355, "udp"},
-{"metaedit-mu", {NULL}, 6360, "tcp"},
-{"metaedit-mu", {NULL}, 6360, "udp"},
-{"metaedit-se", {NULL}, 6370, "tcp"},
-{"metaedit-se", {NULL}, 6370, "udp"},
-{"metatude-mds", {NULL}, 6382, "tcp"},
-{"metatude-mds", {NULL}, 6382, "udp"},
-{"clariion-evr01", {NULL}, 6389, "tcp"},
-{"clariion-evr01", {NULL}, 6389, "udp"},
-{"metaedit-ws", {NULL}, 6390, "tcp"},
-{"metaedit-ws", {NULL}, 6390, "udp"},
-{"faxcomservice", {NULL}, 6417, "tcp"},
-{"faxcomservice", {NULL}, 6417, "udp"},
-{"syserverremote", {NULL}, 6418, "tcp"},
-{"svdrp", {NULL}, 6419, "tcp"},
-{"nim-vdrshell", {NULL}, 6420, "tcp"},
-{"nim-vdrshell", {NULL}, 6420, "udp"},
-{"nim-wan", {NULL}, 6421, "tcp"},
-{"nim-wan", {NULL}, 6421, "udp"},
-{"pgbouncer", {NULL}, 6432, "tcp"},
-{"sun-sr-https", {NULL}, 6443, "tcp"},
-{"sun-sr-https", {NULL}, 6443, "udp"},
-{"sge_qmaster", {NULL}, 6444, "tcp"},
-{"sge_qmaster", {NULL}, 6444, "udp"},
-{"sge_execd", {NULL}, 6445, "tcp"},
-{"sge_execd", {NULL}, 6445, "udp"},
-{"mysql-proxy", {NULL}, 6446, "tcp"},
-{"mysql-proxy", {NULL}, 6446, "udp"},
-{"skip-cert-recv", {NULL}, 6455, "tcp"},
-{"skip-cert-send", {NULL}, 6456, "udp"},
-{"lvision-lm", {NULL}, 6471, "tcp"},
-{"lvision-lm", {NULL}, 6471, "udp"},
-{"sun-sr-http", {NULL}, 6480, "tcp"},
-{"sun-sr-http", {NULL}, 6480, "udp"},
-{"servicetags", {NULL}, 6481, "tcp"},
-{"servicetags", {NULL}, 6481, "udp"},
-{"ldoms-mgmt", {NULL}, 6482, "tcp"},
-{"ldoms-mgmt", {NULL}, 6482, "udp"},
-{"SunVTS-RMI", {NULL}, 6483, "tcp"},
-{"SunVTS-RMI", {NULL}, 6483, "udp"},
-{"sun-sr-jms", {NULL}, 6484, "tcp"},
-{"sun-sr-jms", {NULL}, 6484, "udp"},
-{"sun-sr-iiop", {NULL}, 6485, "tcp"},
-{"sun-sr-iiop", {NULL}, 6485, "udp"},
-{"sun-sr-iiops", {NULL}, 6486, "tcp"},
-{"sun-sr-iiops", {NULL}, 6486, "udp"},
-{"sun-sr-iiop-aut", {NULL}, 6487, "tcp"},
-{"sun-sr-iiop-aut", {NULL}, 6487, "udp"},
-{"sun-sr-jmx", {NULL}, 6488, "tcp"},
-{"sun-sr-jmx", {NULL}, 6488, "udp"},
-{"sun-sr-admin", {NULL}, 6489, "tcp"},
-{"sun-sr-admin", {NULL}, 6489, "udp"},
-{"boks", {NULL}, 6500, "tcp"},
-{"boks", {NULL}, 6500, "udp"},
-{"boks_servc", {NULL}, 6501, "tcp"},
-{"boks_servc", {NULL}, 6501, "udp"},
-{"boks_servm", {NULL}, 6502, "tcp"},
-{"boks_servm", {NULL}, 6502, "udp"},
-{"boks_clntd", {NULL}, 6503, "tcp"},
-{"boks_clntd", {NULL}, 6503, "udp"},
-{"badm_priv", {NULL}, 6505, "tcp"},
-{"badm_priv", {NULL}, 6505, "udp"},
-{"badm_pub", {NULL}, 6506, "tcp"},
-{"badm_pub", {NULL}, 6506, "udp"},
-{"bdir_priv", {NULL}, 6507, "tcp"},
-{"bdir_priv", {NULL}, 6507, "udp"},
-{"bdir_pub", {NULL}, 6508, "tcp"},
-{"bdir_pub", {NULL}, 6508, "udp"},
-{"mgcs-mfp-port", {NULL}, 6509, "tcp"},
-{"mgcs-mfp-port", {NULL}, 6509, "udp"},
-{"mcer-port", {NULL}, 6510, "tcp"},
-{"mcer-port", {NULL}, 6510, "udp"},
-{"netconf-tls", {NULL}, 6513, "tcp"},
-{"syslog-tls", {NULL}, 6514, "tcp"},
-{"syslog-tls", {NULL}, 6514, "udp"},
-{"syslog-tls", {NULL}, 6514, "dccp"},
-{"elipse-rec", {NULL}, 6515, "tcp"},
-{"elipse-rec", {NULL}, 6515, "udp"},
-{"lds-distrib", {NULL}, 6543, "tcp"},
-{"lds-distrib", {NULL}, 6543, "udp"},
-{"lds-dump", {NULL}, 6544, "tcp"},
-{"lds-dump", {NULL}, 6544, "udp"},
-{"apc-6547", {NULL}, 6547, "tcp"},
-{"apc-6547", {NULL}, 6547, "udp"},
-{"apc-6548", {NULL}, 6548, "tcp"},
-{"apc-6548", {NULL}, 6548, "udp"},
-{"apc-6549", {NULL}, 6549, "tcp"},
-{"apc-6549", {NULL}, 6549, "udp"},
-{"fg-sysupdate", {NULL}, 6550, "tcp"},
-{"fg-sysupdate", {NULL}, 6550, "udp"},
-{"sum", {NULL}, 6551, "tcp"},
-{"sum", {NULL}, 6551, "udp"},
-{"xdsxdm", {NULL}, 6558, "tcp"},
-{"xdsxdm", {NULL}, 6558, "udp"},
-{"sane-port", {NULL}, 6566, "tcp"},
-{"sane-port", {NULL}, 6566, "udp"},
-{"esp", {NULL}, 6567, "tcp"},
-{"esp", {NULL}, 6567, "udp"},
-{"canit_store", {NULL}, 6568, "tcp"},
-{"rp-reputation", {NULL}, 6568, "udp"},
-{"affiliate", {NULL}, 6579, "tcp"},
-{"affiliate", {NULL}, 6579, "udp"},
-{"parsec-master", {NULL}, 6580, "tcp"},
-{"parsec-master", {NULL}, 6580, "udp"},
-{"parsec-peer", {NULL}, 6581, "tcp"},
-{"parsec-peer", {NULL}, 6581, "udp"},
-{"parsec-game", {NULL}, 6582, "tcp"},
-{"parsec-game", {NULL}, 6582, "udp"},
-{"joaJewelSuite", {NULL}, 6583, "tcp"},
-{"joaJewelSuite", {NULL}, 6583, "udp"},
-{"mshvlm", {NULL}, 6600, "tcp"},
-{"mstmg-sstp", {NULL}, 6601, "tcp"},
-{"wsscomfrmwk", {NULL}, 6602, "tcp"},
-{"odette-ftps", {NULL}, 6619, "tcp"},
-{"odette-ftps", {NULL}, 6619, "udp"},
-{"kftp-data", {NULL}, 6620, "tcp"},
-{"kftp-data", {NULL}, 6620, "udp"},
-{"kftp", {NULL}, 6621, "tcp"},
-{"kftp", {NULL}, 6621, "udp"},
-{"mcftp", {NULL}, 6622, "tcp"},
-{"mcftp", {NULL}, 6622, "udp"},
-{"ktelnet", {NULL}, 6623, "tcp"},
-{"ktelnet", {NULL}, 6623, "udp"},
-{"datascaler-db", {NULL}, 6624, "tcp"},
-{"datascaler-ctl", {NULL}, 6625, "tcp"},
-{"wago-service", {NULL}, 6626, "tcp"},
-{"wago-service", {NULL}, 6626, "udp"},
-{"nexgen", {NULL}, 6627, "tcp"},
-{"nexgen", {NULL}, 6627, "udp"},
-{"afesc-mc", {NULL}, 6628, "tcp"},
-{"afesc-mc", {NULL}, 6628, "udp"},
-{"mxodbc-connect", {NULL}, 6632, "tcp"},
-{"pcs-sf-ui-man", {NULL}, 6655, "tcp"},
-{"emgmsg", {NULL}, 6656, "tcp"},
-{"palcom-disc", {NULL}, 6657, "udp"},
-{"vocaltec-gold", {NULL}, 6670, "tcp"},
-{"vocaltec-gold", {NULL}, 6670, "udp"},
-{"p4p-portal", {NULL}, 6671, "tcp"},
-{"p4p-portal", {NULL}, 6671, "udp"},
-{"vision_server", {NULL}, 6672, "tcp"},
-{"vision_server", {NULL}, 6672, "udp"},
-{"vision_elmd", {NULL}, 6673, "tcp"},
-{"vision_elmd", {NULL}, 6673, "udp"},
-{"vfbp", {NULL}, 6678, "tcp"},
-{"vfbp-disc", {NULL}, 6678, "udp"},
-{"osaut", {NULL}, 6679, "tcp"},
-{"osaut", {NULL}, 6679, "udp"},
-{"clever-ctrace", {NULL}, 6687, "tcp"},
-{"clever-tcpip", {NULL}, 6688, "tcp"},
-{"tsa", {NULL}, 6689, "tcp"},
-{"tsa", {NULL}, 6689, "udp"},
-{"babel", {NULL}, 6697, "udp"},
-{"kti-icad-srvr", {NULL}, 6701, "tcp"},
-{"kti-icad-srvr", {NULL}, 6701, "udp"},
-{"e-design-net", {NULL}, 6702, "tcp"},
-{"e-design-net", {NULL}, 6702, "udp"},
-{"e-design-web", {NULL}, 6703, "tcp"},
-{"e-design-web", {NULL}, 6703, "udp"},
-{"frc-hp", {NULL}, 6704, "sctp"},
-{"frc-mp", {NULL}, 6705, "sctp"},
-{"frc-lp", {NULL}, 6706, "sctp"},
-{"ibprotocol", {NULL}, 6714, "tcp"},
-{"ibprotocol", {NULL}, 6714, "udp"},
-{"fibotrader-com", {NULL}, 6715, "tcp"},
-{"fibotrader-com", {NULL}, 6715, "udp"},
-{"bmc-perf-agent", {NULL}, 6767, "tcp"},
-{"bmc-perf-agent", {NULL}, 6767, "udp"},
-{"bmc-perf-mgrd", {NULL}, 6768, "tcp"},
-{"bmc-perf-mgrd", {NULL}, 6768, "udp"},
-{"adi-gxp-srvprt", {NULL}, 6769, "tcp"},
-{"adi-gxp-srvprt", {NULL}, 6769, "udp"},
-{"plysrv-http", {NULL}, 6770, "tcp"},
-{"plysrv-http", {NULL}, 6770, "udp"},
-{"plysrv-https", {NULL}, 6771, "tcp"},
-{"plysrv-https", {NULL}, 6771, "udp"},
-{"dgpf-exchg", {NULL}, 6785, "tcp"},
-{"dgpf-exchg", {NULL}, 6785, "udp"},
-{"smc-jmx", {NULL}, 6786, "tcp"},
-{"smc-jmx", {NULL}, 6786, "udp"},
-{"smc-admin", {NULL}, 6787, "tcp"},
-{"smc-admin", {NULL}, 6787, "udp"},
-{"smc-http", {NULL}, 6788, "tcp"},
-{"smc-http", {NULL}, 6788, "udp"},
-{"smc-https", {NULL}, 6789, "tcp"},
-{"smc-https", {NULL}, 6789, "udp"},
-{"hnmp", {NULL}, 6790, "tcp"},
-{"hnmp", {NULL}, 6790, "udp"},
-{"hnm", {NULL}, 6791, "tcp"},
-{"hnm", {NULL}, 6791, "udp"},
-{"acnet", {NULL}, 6801, "tcp"},
-{"acnet", {NULL}, 6801, "udp"},
-{"pentbox-sim", {NULL}, 6817, "tcp"},
-{"ambit-lm", {NULL}, 6831, "tcp"},
-{"ambit-lm", {NULL}, 6831, "udp"},
-{"netmo-default", {NULL}, 6841, "tcp"},
-{"netmo-default", {NULL}, 6841, "udp"},
-{"netmo-http", {NULL}, 6842, "tcp"},
-{"netmo-http", {NULL}, 6842, "udp"},
-{"iccrushmore", {NULL}, 6850, "tcp"},
-{"iccrushmore", {NULL}, 6850, "udp"},
-{"acctopus-cc", {NULL}, 6868, "tcp"},
-{"acctopus-st", {NULL}, 6868, "udp"},
-{"muse", {NULL}, 6888, "tcp"},
-{"muse", {NULL}, 6888, "udp"},
-{"jetstream", {NULL}, 6901, "tcp"},
-{"xsmsvc", {NULL}, 6936, "tcp"},
-{"xsmsvc", {NULL}, 6936, "udp"},
-{"bioserver", {NULL}, 6946, "tcp"},
-{"bioserver", {NULL}, 6946, "udp"},
-{"otlp", {NULL}, 6951, "tcp"},
-{"otlp", {NULL}, 6951, "udp"},
-{"jmact3", {NULL}, 6961, "tcp"},
-{"jmact3", {NULL}, 6961, "udp"},
-{"jmevt2", {NULL}, 6962, "tcp"},
-{"jmevt2", {NULL}, 6962, "udp"},
-{"swismgr1", {NULL}, 6963, "tcp"},
-{"swismgr1", {NULL}, 6963, "udp"},
-{"swismgr2", {NULL}, 6964, "tcp"},
-{"swismgr2", {NULL}, 6964, "udp"},
-{"swistrap", {NULL}, 6965, "tcp"},
-{"swistrap", {NULL}, 6965, "udp"},
-{"swispol", {NULL}, 6966, "tcp"},
-{"swispol", {NULL}, 6966, "udp"},
-{"acmsoda", {NULL}, 6969, "tcp"},
-{"acmsoda", {NULL}, 6969, "udp"},
-{"MobilitySrv", {NULL}, 6997, "tcp"},
-{"MobilitySrv", {NULL}, 6997, "udp"},
-{"iatp-highpri", {NULL}, 6998, "tcp"},
-{"iatp-highpri", {NULL}, 6998, "udp"},
-{"iatp-normalpri", {NULL}, 6999, "tcp"},
-{"iatp-normalpri", {NULL}, 6999, "udp"},
-{"afs3-fileserver", {NULL}, 7000, "tcp"},
-{"afs3-fileserver", {NULL}, 7000, "udp"},
-{"afs3-callback", {NULL}, 7001, "tcp"},
-{"afs3-callback", {NULL}, 7001, "udp"},
-{"afs3-prserver", {NULL}, 7002, "tcp"},
-{"afs3-prserver", {NULL}, 7002, "udp"},
-{"afs3-vlserver", {NULL}, 7003, "tcp"},
-{"afs3-vlserver", {NULL}, 7003, "udp"},
-{"afs3-kaserver", {NULL}, 7004, "tcp"},
-{"afs3-kaserver", {NULL}, 7004, "udp"},
-{"afs3-volser", {NULL}, 7005, "tcp"},
-{"afs3-volser", {NULL}, 7005, "udp"},
-{"afs3-errors", {NULL}, 7006, "tcp"},
-{"afs3-errors", {NULL}, 7006, "udp"},
-{"afs3-bos", {NULL}, 7007, "tcp"},
-{"afs3-bos", {NULL}, 7007, "udp"},
-{"afs3-update", {NULL}, 7008, "tcp"},
-{"afs3-update", {NULL}, 7008, "udp"},
-{"afs3-rmtsys", {NULL}, 7009, "tcp"},
-{"afs3-rmtsys", {NULL}, 7009, "udp"},
-{"ups-onlinet", {NULL}, 7010, "tcp"},
-{"ups-onlinet", {NULL}, 7010, "udp"},
-{"talon-disc", {NULL}, 7011, "tcp"},
-{"talon-disc", {NULL}, 7011, "udp"},
-{"talon-engine", {NULL}, 7012, "tcp"},
-{"talon-engine", {NULL}, 7012, "udp"},
-{"microtalon-dis", {NULL}, 7013, "tcp"},
-{"microtalon-dis", {NULL}, 7013, "udp"},
-{"microtalon-com", {NULL}, 7014, "tcp"},
-{"microtalon-com", {NULL}, 7014, "udp"},
-{"talon-webserver", {NULL}, 7015, "tcp"},
-{"talon-webserver", {NULL}, 7015, "udp"},
-{"dpserve", {NULL}, 7020, "tcp"},
-{"dpserve", {NULL}, 7020, "udp"},
-{"dpserveadmin", {NULL}, 7021, "tcp"},
-{"dpserveadmin", {NULL}, 7021, "udp"},
-{"ctdp", {NULL}, 7022, "tcp"},
-{"ctdp", {NULL}, 7022, "udp"},
-{"ct2nmcs", {NULL}, 7023, "tcp"},
-{"ct2nmcs", {NULL}, 7023, "udp"},
-{"vmsvc", {NULL}, 7024, "tcp"},
-{"vmsvc", {NULL}, 7024, "udp"},
-{"vmsvc-2", {NULL}, 7025, "tcp"},
-{"vmsvc-2", {NULL}, 7025, "udp"},
-{"op-probe", {NULL}, 7030, "tcp"},
-{"op-probe", {NULL}, 7030, "udp"},
-{"arcp", {NULL}, 7070, "tcp"},
-{"arcp", {NULL}, 7070, "udp"},
-{"iwg1", {NULL}, 7071, "tcp"},
-{"iwg1", {NULL}, 7071, "udp"},
-{"empowerid", {NULL}, 7080, "tcp"},
-{"empowerid", {NULL}, 7080, "udp"},
-{"lazy-ptop", {NULL}, 7099, "tcp"},
-{"lazy-ptop", {NULL}, 7099, "udp"},
-{"font-service", {NULL}, 7100, "tcp"},
-{"font-service", {NULL}, 7100, "udp"},
-{"elcn", {NULL}, 7101, "tcp"},
-{"elcn", {NULL}, 7101, "udp"},
-{"aes-x170", {NULL}, 7107, "udp"},
-{"virprot-lm", {NULL}, 7121, "tcp"},
-{"virprot-lm", {NULL}, 7121, "udp"},
-{"scenidm", {NULL}, 7128, "tcp"},
-{"scenidm", {NULL}, 7128, "udp"},
-{"scenccs", {NULL}, 7129, "tcp"},
-{"scenccs", {NULL}, 7129, "udp"},
-{"cabsm-comm", {NULL}, 7161, "tcp"},
-{"cabsm-comm", {NULL}, 7161, "udp"},
-{"caistoragemgr", {NULL}, 7162, "tcp"},
-{"caistoragemgr", {NULL}, 7162, "udp"},
-{"cacsambroker", {NULL}, 7163, "tcp"},
-{"cacsambroker", {NULL}, 7163, "udp"},
-{"fsr", {NULL}, 7164, "tcp"},
-{"fsr", {NULL}, 7164, "udp"},
-{"doc-server", {NULL}, 7165, "tcp"},
-{"doc-server", {NULL}, 7165, "udp"},
-{"aruba-server", {NULL}, 7166, "tcp"},
-{"aruba-server", {NULL}, 7166, "udp"},
-{"casrmagent", {NULL}, 7167, "tcp"},
-{"cnckadserver", {NULL}, 7168, "tcp"},
-{"ccag-pib", {NULL}, 7169, "tcp"},
-{"ccag-pib", {NULL}, 7169, "udp"},
-{"nsrp", {NULL}, 7170, "tcp"},
-{"nsrp", {NULL}, 7170, "udp"},
-{"drm-production", {NULL}, 7171, "tcp"},
-{"drm-production", {NULL}, 7171, "udp"},
-{"zsecure", {NULL}, 7173, "tcp"},
-{"clutild", {NULL}, 7174, "tcp"},
-{"clutild", {NULL}, 7174, "udp"},
-{"fodms", {NULL}, 7200, "tcp"},
-{"fodms", {NULL}, 7200, "udp"},
-{"dlip", {NULL}, 7201, "tcp"},
-{"dlip", {NULL}, 7201, "udp"},
-{"ramp", {NULL}, 7227, "tcp"},
-{"ramp", {NULL}, 7227, "udp"},
-{"citrixupp", {NULL}, 7228, "tcp"},
-{"citrixuppg", {NULL}, 7229, "tcp"},
-{"pads", {NULL}, 7237, "tcp"},
-{"cnap", {NULL}, 7262, "tcp"},
-{"cnap", {NULL}, 7262, "udp"},
-{"watchme-7272", {NULL}, 7272, "tcp"},
-{"watchme-7272", {NULL}, 7272, "udp"},
-{"oma-rlp", {NULL}, 7273, "tcp"},
-{"oma-rlp", {NULL}, 7273, "udp"},
-{"oma-rlp-s", {NULL}, 7274, "tcp"},
-{"oma-rlp-s", {NULL}, 7274, "udp"},
-{"oma-ulp", {NULL}, 7275, "tcp"},
-{"oma-ulp", {NULL}, 7275, "udp"},
-{"oma-ilp", {NULL}, 7276, "tcp"},
-{"oma-ilp", {NULL}, 7276, "udp"},
-{"oma-ilp-s", {NULL}, 7277, "tcp"},
-{"oma-ilp-s", {NULL}, 7277, "udp"},
-{"oma-dcdocbs", {NULL}, 7278, "tcp"},
-{"oma-dcdocbs", {NULL}, 7278, "udp"},
-{"ctxlic", {NULL}, 7279, "tcp"},
-{"ctxlic", {NULL}, 7279, "udp"},
-{"itactionserver1", {NULL}, 7280, "tcp"},
-{"itactionserver1", {NULL}, 7280, "udp"},
-{"itactionserver2", {NULL}, 7281, "tcp"},
-{"itactionserver2", {NULL}, 7281, "udp"},
-{"mzca-action", {NULL}, 7282, "tcp"},
-{"mzca-alert", {NULL}, 7282, "udp"},
-{"lcm-server", {NULL}, 7365, "tcp"},
-{"lcm-server", {NULL}, 7365, "udp"},
-{"mindfilesys", {NULL}, 7391, "tcp"},
-{"mindfilesys", {NULL}, 7391, "udp"},
-{"mrssrendezvous", {NULL}, 7392, "tcp"},
-{"mrssrendezvous", {NULL}, 7392, "udp"},
-{"nfoldman", {NULL}, 7393, "tcp"},
-{"nfoldman", {NULL}, 7393, "udp"},
-{"fse", {NULL}, 7394, "tcp"},
-{"fse", {NULL}, 7394, "udp"},
-{"winqedit", {NULL}, 7395, "tcp"},
-{"winqedit", {NULL}, 7395, "udp"},
-{"hexarc", {NULL}, 7397, "tcp"},
-{"hexarc", {NULL}, 7397, "udp"},
-{"rtps-discovery", {NULL}, 7400, "tcp"},
-{"rtps-discovery", {NULL}, 7400, "udp"},
-{"rtps-dd-ut", {NULL}, 7401, "tcp"},
-{"rtps-dd-ut", {NULL}, 7401, "udp"},
-{"rtps-dd-mt", {NULL}, 7402, "tcp"},
-{"rtps-dd-mt", {NULL}, 7402, "udp"},
-{"ionixnetmon", {NULL}, 7410, "tcp"},
-{"ionixnetmon", {NULL}, 7410, "udp"},
-{"mtportmon", {NULL}, 7421, "tcp"},
-{"mtportmon", {NULL}, 7421, "udp"},
-{"pmdmgr", {NULL}, 7426, "tcp"},
-{"pmdmgr", {NULL}, 7426, "udp"},
-{"oveadmgr", {NULL}, 7427, "tcp"},
-{"oveadmgr", {NULL}, 7427, "udp"},
-{"ovladmgr", {NULL}, 7428, "tcp"},
-{"ovladmgr", {NULL}, 7428, "udp"},
-{"opi-sock", {NULL}, 7429, "tcp"},
-{"opi-sock", {NULL}, 7429, "udp"},
-{"xmpv7", {NULL}, 7430, "tcp"},
-{"xmpv7", {NULL}, 7430, "udp"},
-{"pmd", {NULL}, 7431, "tcp"},
-{"pmd", {NULL}, 7431, "udp"},
-{"faximum", {NULL}, 7437, "tcp"},
-{"faximum", {NULL}, 7437, "udp"},
-{"oracleas-https", {NULL}, 7443, "tcp"},
-{"oracleas-https", {NULL}, 7443, "udp"},
-{"rise", {NULL}, 7473, "tcp"},
-{"rise", {NULL}, 7473, "udp"},
-{"telops-lmd", {NULL}, 7491, "tcp"},
-{"telops-lmd", {NULL}, 7491, "udp"},
-{"silhouette", {NULL}, 7500, "tcp"},
-{"silhouette", {NULL}, 7500, "udp"},
-{"ovbus", {NULL}, 7501, "tcp"},
-{"ovbus", {NULL}, 7501, "udp"},
-{"acplt", {NULL}, 7509, "tcp"},
-{"ovhpas", {NULL}, 7510, "tcp"},
-{"ovhpas", {NULL}, 7510, "udp"},
-{"pafec-lm", {NULL}, 7511, "tcp"},
-{"pafec-lm", {NULL}, 7511, "udp"},
-{"saratoga", {NULL}, 7542, "tcp"},
-{"saratoga", {NULL}, 7542, "udp"},
-{"atul", {NULL}, 7543, "tcp"},
-{"atul", {NULL}, 7543, "udp"},
-{"nta-ds", {NULL}, 7544, "tcp"},
-{"nta-ds", {NULL}, 7544, "udp"},
-{"nta-us", {NULL}, 7545, "tcp"},
-{"nta-us", {NULL}, 7545, "udp"},
-{"cfs", {NULL}, 7546, "tcp"},
-{"cfs", {NULL}, 7546, "udp"},
-{"cwmp", {NULL}, 7547, "tcp"},
-{"cwmp", {NULL}, 7547, "udp"},
-{"tidp", {NULL}, 7548, "tcp"},
-{"tidp", {NULL}, 7548, "udp"},
-{"nls-tl", {NULL}, 7549, "tcp"},
-{"nls-tl", {NULL}, 7549, "udp"},
-{"sncp", {NULL}, 7560, "tcp"},
-{"sncp", {NULL}, 7560, "udp"},
-{"cfw", {NULL}, 7563, "tcp"},
-{"vsi-omega", {NULL}, 7566, "tcp"},
-{"vsi-omega", {NULL}, 7566, "udp"},
-{"dell-eql-asm", {NULL}, 7569, "tcp"},
-{"aries-kfinder", {NULL}, 7570, "tcp"},
-{"aries-kfinder", {NULL}, 7570, "udp"},
-{"sun-lm", {NULL}, 7588, "tcp"},
-{"sun-lm", {NULL}, 7588, "udp"},
-{"indi", {NULL}, 7624, "tcp"},
-{"indi", {NULL}, 7624, "udp"},
-{"simco", {NULL}, 7626, "tcp"},
-{"simco", {NULL}, 7626, "sctp"},
-{"soap-http", {NULL}, 7627, "tcp"},
-{"soap-http", {NULL}, 7627, "udp"},
-{"zen-pawn", {NULL}, 7628, "tcp"},
-{"zen-pawn", {NULL}, 7628, "udp"},
-{"xdas", {NULL}, 7629, "tcp"},
-{"xdas", {NULL}, 7629, "udp"},
-{"hawk", {NULL}, 7630, "tcp"},
-{"tesla-sys-msg", {NULL}, 7631, "tcp"},
-{"pmdfmgt", {NULL}, 7633, "tcp"},
-{"pmdfmgt", {NULL}, 7633, "udp"},
-{"cuseeme", {NULL}, 7648, "tcp"},
-{"cuseeme", {NULL}, 7648, "udp"},
-{"imqstomp", {NULL}, 7672, "tcp"},
-{"imqstomps", {NULL}, 7673, "tcp"},
-{"imqtunnels", {NULL}, 7674, "tcp"},
-{"imqtunnels", {NULL}, 7674, "udp"},
-{"imqtunnel", {NULL}, 7675, "tcp"},
-{"imqtunnel", {NULL}, 7675, "udp"},
-{"imqbrokerd", {NULL}, 7676, "tcp"},
-{"imqbrokerd", {NULL}, 7676, "udp"},
-{"sun-user-https", {NULL}, 7677, "tcp"},
-{"sun-user-https", {NULL}, 7677, "udp"},
-{"pando-pub", {NULL}, 7680, "tcp"},
-{"pando-pub", {NULL}, 7680, "udp"},
-{"collaber", {NULL}, 7689, "tcp"},
-{"collaber", {NULL}, 7689, "udp"},
-{"klio", {NULL}, 7697, "tcp"},
-{"klio", {NULL}, 7697, "udp"},
-{"em7-secom", {NULL}, 7700, "tcp"},
-{"sync-em7", {NULL}, 7707, "tcp"},
-{"sync-em7", {NULL}, 7707, "udp"},
-{"scinet", {NULL}, 7708, "tcp"},
-{"scinet", {NULL}, 7708, "udp"},
-{"medimageportal", {NULL}, 7720, "tcp"},
-{"medimageportal", {NULL}, 7720, "udp"},
-{"nsdeepfreezectl", {NULL}, 7724, "tcp"},
-{"nsdeepfreezectl", {NULL}, 7724, "udp"},
-{"nitrogen", {NULL}, 7725, "tcp"},
-{"nitrogen", {NULL}, 7725, "udp"},
-{"freezexservice", {NULL}, 7726, "tcp"},
-{"freezexservice", {NULL}, 7726, "udp"},
-{"trident-data", {NULL}, 7727, "tcp"},
-{"trident-data", {NULL}, 7727, "udp"},
-{"smip", {NULL}, 7734, "tcp"},
-{"smip", {NULL}, 7734, "udp"},
-{"aiagent", {NULL}, 7738, "tcp"},
-{"aiagent", {NULL}, 7738, "udp"},
-{"scriptview", {NULL}, 7741, "tcp"},
-{"scriptview", {NULL}, 7741, "udp"},
-{"msss", {NULL}, 7742, "tcp"},
-{"sstp-1", {NULL}, 7743, "tcp"},
-{"sstp-1", {NULL}, 7743, "udp"},
-{"raqmon-pdu", {NULL}, 7744, "tcp"},
-{"raqmon-pdu", {NULL}, 7744, "udp"},
-{"prgp", {NULL}, 7747, "tcp"},
-{"prgp", {NULL}, 7747, "udp"},
-{"cbt", {NULL}, 7777, "tcp"},
-{"cbt", {NULL}, 7777, "udp"},
-{"interwise", {NULL}, 7778, "tcp"},
-{"interwise", {NULL}, 7778, "udp"},
-{"vstat", {NULL}, 7779, "tcp"},
-{"vstat", {NULL}, 7779, "udp"},
-{"accu-lmgr", {NULL}, 7781, "tcp"},
-{"accu-lmgr", {NULL}, 7781, "udp"},
-{"minivend", {NULL}, 7786, "tcp"},
-{"minivend", {NULL}, 7786, "udp"},
-{"popup-reminders", {NULL}, 7787, "tcp"},
-{"popup-reminders", {NULL}, 7787, "udp"},
-{"office-tools", {NULL}, 7789, "tcp"},
-{"office-tools", {NULL}, 7789, "udp"},
-{"q3ade", {NULL}, 7794, "tcp"},
-{"q3ade", {NULL}, 7794, "udp"},
-{"pnet-conn", {NULL}, 7797, "tcp"},
-{"pnet-conn", {NULL}, 7797, "udp"},
-{"pnet-enc", {NULL}, 7798, "tcp"},
-{"pnet-enc", {NULL}, 7798, "udp"},
-{"altbsdp", {NULL}, 7799, "tcp"},
-{"altbsdp", {NULL}, 7799, "udp"},
-{"asr", {NULL}, 7800, "tcp"},
-{"asr", {NULL}, 7800, "udp"},
-{"ssp-client", {NULL}, 7801, "tcp"},
-{"ssp-client", {NULL}, 7801, "udp"},
-{"rbt-wanopt", {NULL}, 7810, "tcp"},
-{"rbt-wanopt", {NULL}, 7810, "udp"},
-{"apc-7845", {NULL}, 7845, "tcp"},
-{"apc-7845", {NULL}, 7845, "udp"},
-{"apc-7846", {NULL}, 7846, "tcp"},
-{"apc-7846", {NULL}, 7846, "udp"},
-{"mobileanalyzer", {NULL}, 7869, "tcp"},
-{"rbt-smc", {NULL}, 7870, "tcp"},
-{"pss", {NULL}, 7880, "tcp"},
-{"pss", {NULL}, 7880, "udp"},
-{"ubroker", {NULL}, 7887, "tcp"},
-{"ubroker", {NULL}, 7887, "udp"},
-{"mevent", {NULL}, 7900, "tcp"},
-{"mevent", {NULL}, 7900, "udp"},
-{"tnos-sp", {NULL}, 7901, "tcp"},
-{"tnos-sp", {NULL}, 7901, "udp"},
-{"tnos-dp", {NULL}, 7902, "tcp"},
-{"tnos-dp", {NULL}, 7902, "udp"},
-{"tnos-dps", {NULL}, 7903, "tcp"},
-{"tnos-dps", {NULL}, 7903, "udp"},
-{"qo-secure", {NULL}, 7913, "tcp"},
-{"qo-secure", {NULL}, 7913, "udp"},
-{"t2-drm", {NULL}, 7932, "tcp"},
-{"t2-drm", {NULL}, 7932, "udp"},
-{"t2-brm", {NULL}, 7933, "tcp"},
-{"t2-brm", {NULL}, 7933, "udp"},
-{"supercell", {NULL}, 7967, "tcp"},
-{"supercell", {NULL}, 7967, "udp"},
-{"micromuse-ncps", {NULL}, 7979, "tcp"},
-{"micromuse-ncps", {NULL}, 7979, "udp"},
-{"quest-vista", {NULL}, 7980, "tcp"},
-{"quest-vista", {NULL}, 7980, "udp"},
-{"sossd-collect", {NULL}, 7981, "tcp"},
-{"sossd-agent", {NULL}, 7982, "tcp"},
-{"sossd-disc", {NULL}, 7982, "udp"},
-{"pushns", {NULL}, 7997, "tcp"},
-{"usicontentpush", {NULL}, 7998, "udp"},
-{"irdmi2", {NULL}, 7999, "tcp"},
-{"irdmi2", {NULL}, 7999, "udp"},
-{"irdmi", {NULL}, 8000, "tcp"},
-{"irdmi", {NULL}, 8000, "udp"},
-{"vcom-tunnel", {NULL}, 8001, "tcp"},
-{"vcom-tunnel", {NULL}, 8001, "udp"},
-{"teradataordbms", {NULL}, 8002, "tcp"},
-{"teradataordbms", {NULL}, 8002, "udp"},
-{"mcreport", {NULL}, 8003, "tcp"},
-{"mcreport", {NULL}, 8003, "udp"},
-{"mxi", {NULL}, 8005, "tcp"},
-{"mxi", {NULL}, 8005, "udp"},
-{"http-alt", {NULL}, 8008, "tcp"},
-{"http-alt", {NULL}, 8008, "udp"},
-{"qbdb", {NULL}, 8019, "tcp"},
-{"qbdb", {NULL}, 8019, "udp"},
-{"intu-ec-svcdisc", {NULL}, 8020, "tcp"},
-{"intu-ec-svcdisc", {NULL}, 8020, "udp"},
-{"intu-ec-client", {NULL}, 8021, "tcp"},
-{"intu-ec-client", {NULL}, 8021, "udp"},
-{"oa-system", {NULL}, 8022, "tcp"},
-{"oa-system", {NULL}, 8022, "udp"},
-{"ca-audit-da", {NULL}, 8025, "tcp"},
-{"ca-audit-da", {NULL}, 8025, "udp"},
-{"ca-audit-ds", {NULL}, 8026, "tcp"},
-{"ca-audit-ds", {NULL}, 8026, "udp"},
-{"pro-ed", {NULL}, 8032, "tcp"},
-{"pro-ed", {NULL}, 8032, "udp"},
-{"mindprint", {NULL}, 8033, "tcp"},
-{"mindprint", {NULL}, 8033, "udp"},
-{"vantronix-mgmt", {NULL}, 8034, "tcp"},
-{"vantronix-mgmt", {NULL}, 8034, "udp"},
-{"ampify", {NULL}, 8040, "tcp"},
-{"ampify", {NULL}, 8040, "udp"},
-{"fs-agent", {NULL}, 8042, "tcp"},
-{"fs-server", {NULL}, 8043, "tcp"},
-{"fs-mgmt", {NULL}, 8044, "tcp"},
-{"senomix01", {NULL}, 8052, "tcp"},
-{"senomix01", {NULL}, 8052, "udp"},
-{"senomix02", {NULL}, 8053, "tcp"},
-{"senomix02", {NULL}, 8053, "udp"},
-{"senomix03", {NULL}, 8054, "tcp"},
-{"senomix03", {NULL}, 8054, "udp"},
-{"senomix04", {NULL}, 8055, "tcp"},
-{"senomix04", {NULL}, 8055, "udp"},
-{"senomix05", {NULL}, 8056, "tcp"},
-{"senomix05", {NULL}, 8056, "udp"},
-{"senomix06", {NULL}, 8057, "tcp"},
-{"senomix06", {NULL}, 8057, "udp"},
-{"senomix07", {NULL}, 8058, "tcp"},
-{"senomix07", {NULL}, 8058, "udp"},
-{"senomix08", {NULL}, 8059, "tcp"},
-{"senomix08", {NULL}, 8059, "udp"},
-{"gadugadu", {NULL}, 8074, "tcp"},
-{"gadugadu", {NULL}, 8074, "udp"},
-{"http-alt", {NULL}, 8080, "tcp"},
-{"http-alt", {NULL}, 8080, "udp"},
-{"sunproxyadmin", {NULL}, 8081, "tcp"},
-{"sunproxyadmin", {NULL}, 8081, "udp"},
-{"us-cli", {NULL}, 8082, "tcp"},
-{"us-cli", {NULL}, 8082, "udp"},
-{"us-srv", {NULL}, 8083, "tcp"},
-{"us-srv", {NULL}, 8083, "udp"},
-{"d-s-n", {NULL}, 8086, "tcp"},
-{"d-s-n", {NULL}, 8086, "udp"},
-{"simplifymedia", {NULL}, 8087, "tcp"},
-{"simplifymedia", {NULL}, 8087, "udp"},
-{"radan-http", {NULL}, 8088, "tcp"},
-{"radan-http", {NULL}, 8088, "udp"},
-{"jamlink", {NULL}, 8091, "tcp"},
-{"sac", {NULL}, 8097, "tcp"},
-{"sac", {NULL}, 8097, "udp"},
-{"xprint-server", {NULL}, 8100, "tcp"},
-{"xprint-server", {NULL}, 8100, "udp"},
-{"ldoms-migr", {NULL}, 8101, "tcp"},
-{"mtl8000-matrix", {NULL}, 8115, "tcp"},
-{"mtl8000-matrix", {NULL}, 8115, "udp"},
-{"cp-cluster", {NULL}, 8116, "tcp"},
-{"cp-cluster", {NULL}, 8116, "udp"},
-{"privoxy", {NULL}, 8118, "tcp"},
-{"privoxy", {NULL}, 8118, "udp"},
-{"apollo-data", {NULL}, 8121, "tcp"},
-{"apollo-data", {NULL}, 8121, "udp"},
-{"apollo-admin", {NULL}, 8122, "tcp"},
-{"apollo-admin", {NULL}, 8122, "udp"},
-{"paycash-online", {NULL}, 8128, "tcp"},
-{"paycash-online", {NULL}, 8128, "udp"},
-{"paycash-wbp", {NULL}, 8129, "tcp"},
-{"paycash-wbp", {NULL}, 8129, "udp"},
-{"indigo-vrmi", {NULL}, 8130, "tcp"},
-{"indigo-vrmi", {NULL}, 8130, "udp"},
-{"indigo-vbcp", {NULL}, 8131, "tcp"},
-{"indigo-vbcp", {NULL}, 8131, "udp"},
-{"dbabble", {NULL}, 8132, "tcp"},
-{"dbabble", {NULL}, 8132, "udp"},
-{"isdd", {NULL}, 8148, "tcp"},
-{"isdd", {NULL}, 8148, "udp"},
-{"patrol", {NULL}, 8160, "tcp"},
-{"patrol", {NULL}, 8160, "udp"},
-{"patrol-snmp", {NULL}, 8161, "tcp"},
-{"patrol-snmp", {NULL}, 8161, "udp"},
-{"vmware-fdm", {NULL}, 8182, "tcp"},
-{"vmware-fdm", {NULL}, 8182, "udp"},
-{"proremote", {NULL}, 8183, "tcp"},
-{"itach", {NULL}, 8184, "tcp"},
-{"itach", {NULL}, 8184, "udp"},
-{"spytechphone", {NULL}, 8192, "tcp"},
-{"spytechphone", {NULL}, 8192, "udp"},
-{"blp1", {NULL}, 8194, "tcp"},
-{"blp1", {NULL}, 8194, "udp"},
-{"blp2", {NULL}, 8195, "tcp"},
-{"blp2", {NULL}, 8195, "udp"},
-{"vvr-data", {NULL}, 8199, "tcp"},
-{"vvr-data", {NULL}, 8199, "udp"},
-{"trivnet1", {NULL}, 8200, "tcp"},
-{"trivnet1", {NULL}, 8200, "udp"},
-{"trivnet2", {NULL}, 8201, "tcp"},
-{"trivnet2", {NULL}, 8201, "udp"},
-{"lm-perfworks", {NULL}, 8204, "tcp"},
-{"lm-perfworks", {NULL}, 8204, "udp"},
-{"lm-instmgr", {NULL}, 8205, "tcp"},
-{"lm-instmgr", {NULL}, 8205, "udp"},
-{"lm-dta", {NULL}, 8206, "tcp"},
-{"lm-dta", {NULL}, 8206, "udp"},
-{"lm-sserver", {NULL}, 8207, "tcp"},
-{"lm-sserver", {NULL}, 8207, "udp"},
-{"lm-webwatcher", {NULL}, 8208, "tcp"},
-{"lm-webwatcher", {NULL}, 8208, "udp"},
-{"rexecj", {NULL}, 8230, "tcp"},
-{"rexecj", {NULL}, 8230, "udp"},
-{"synapse-nhttps", {NULL}, 8243, "tcp"},
-{"synapse-nhttps", {NULL}, 8243, "udp"},
-{"pando-sec", {NULL}, 8276, "tcp"},
-{"pando-sec", {NULL}, 8276, "udp"},
-{"synapse-nhttp", {NULL}, 8280, "tcp"},
-{"synapse-nhttp", {NULL}, 8280, "udp"},
-{"blp3", {NULL}, 8292, "tcp"},
-{"blp3", {NULL}, 8292, "udp"},
-{"hiperscan-id", {NULL}, 8293, "tcp"},
-{"blp4", {NULL}, 8294, "tcp"},
-{"blp4", {NULL}, 8294, "udp"},
-{"tmi", {NULL}, 8300, "tcp"},
-{"tmi", {NULL}, 8300, "udp"},
-{"amberon", {NULL}, 8301, "tcp"},
-{"amberon", {NULL}, 8301, "udp"},
-{"tnp-discover", {NULL}, 8320, "tcp"},
-{"tnp-discover", {NULL}, 8320, "udp"},
-{"tnp", {NULL}, 8321, "tcp"},
-{"tnp", {NULL}, 8321, "udp"},
-{"server-find", {NULL}, 8351, "tcp"},
-{"server-find", {NULL}, 8351, "udp"},
-{"cruise-enum", {NULL}, 8376, "tcp"},
-{"cruise-enum", {NULL}, 8376, "udp"},
-{"cruise-swroute", {NULL}, 8377, "tcp"},
-{"cruise-swroute", {NULL}, 8377, "udp"},
-{"cruise-config", {NULL}, 8378, "tcp"},
-{"cruise-config", {NULL}, 8378, "udp"},
-{"cruise-diags", {NULL}, 8379, "tcp"},
-{"cruise-diags", {NULL}, 8379, "udp"},
-{"cruise-update", {NULL}, 8380, "tcp"},
-{"cruise-update", {NULL}, 8380, "udp"},
-{"m2mservices", {NULL}, 8383, "tcp"},
-{"m2mservices", {NULL}, 8383, "udp"},
-{"cvd", {NULL}, 8400, "tcp"},
-{"cvd", {NULL}, 8400, "udp"},
-{"sabarsd", {NULL}, 8401, "tcp"},
-{"sabarsd", {NULL}, 8401, "udp"},
-{"abarsd", {NULL}, 8402, "tcp"},
-{"abarsd", {NULL}, 8402, "udp"},
-{"admind", {NULL}, 8403, "tcp"},
-{"admind", {NULL}, 8403, "udp"},
-{"svcloud", {NULL}, 8404, "tcp"},
-{"svbackup", {NULL}, 8405, "tcp"},
-{"espeech", {NULL}, 8416, "tcp"},
-{"espeech", {NULL}, 8416, "udp"},
-{"espeech-rtp", {NULL}, 8417, "tcp"},
-{"espeech-rtp", {NULL}, 8417, "udp"},
-{"cybro-a-bus", {NULL}, 8442, "tcp"},
-{"cybro-a-bus", {NULL}, 8442, "udp"},
-{"pcsync-https", {NULL}, 8443, "tcp"},
-{"pcsync-https", {NULL}, 8443, "udp"},
-{"pcsync-http", {NULL}, 8444, "tcp"},
-{"pcsync-http", {NULL}, 8444, "udp"},
-{"npmp", {NULL}, 8450, "tcp"},
-{"npmp", {NULL}, 8450, "udp"},
-{"cisco-avp", {NULL}, 8470, "tcp"},
-{"pim-port", {NULL}, 8471, "tcp"},
-{"pim-port", {NULL}, 8471, "sctp"},
-{"otv", {NULL}, 8472, "tcp"},
-{"otv", {NULL}, 8472, "udp"},
-{"vp2p", {NULL}, 8473, "tcp"},
-{"vp2p", {NULL}, 8473, "udp"},
-{"noteshare", {NULL}, 8474, "tcp"},
-{"noteshare", {NULL}, 8474, "udp"},
-{"fmtp", {NULL}, 8500, "tcp"},
-{"fmtp", {NULL}, 8500, "udp"},
-{"rtsp-alt", {NULL}, 8554, "tcp"},
-{"rtsp-alt", {NULL}, 8554, "udp"},
-{"d-fence", {NULL}, 8555, "tcp"},
-{"d-fence", {NULL}, 8555, "udp"},
-{"oap-admin", {NULL}, 8567, "tcp"},
-{"oap-admin", {NULL}, 8567, "udp"},
-{"asterix", {NULL}, 8600, "tcp"},
-{"asterix", {NULL}, 8600, "udp"},
-{"canon-mfnp", {NULL}, 8610, "tcp"},
-{"canon-mfnp", {NULL}, 8610, "udp"},
-{"canon-bjnp1", {NULL}, 8611, "tcp"},
-{"canon-bjnp1", {NULL}, 8611, "udp"},
-{"canon-bjnp2", {NULL}, 8612, "tcp"},
-{"canon-bjnp2", {NULL}, 8612, "udp"},
-{"canon-bjnp3", {NULL}, 8613, "tcp"},
-{"canon-bjnp3", {NULL}, 8613, "udp"},
-{"canon-bjnp4", {NULL}, 8614, "tcp"},
-{"canon-bjnp4", {NULL}, 8614, "udp"},
-{"sun-as-jmxrmi", {NULL}, 8686, "tcp"},
-{"sun-as-jmxrmi", {NULL}, 8686, "udp"},
-{"vnyx", {NULL}, 8699, "tcp"},
-{"vnyx", {NULL}, 8699, "udp"},
-{"dtp-net", {NULL}, 8732, "udp"},
-{"ibus", {NULL}, 8733, "tcp"},
-{"ibus", {NULL}, 8733, "udp"},
-{"mc-appserver", {NULL}, 8763, "tcp"},
-{"mc-appserver", {NULL}, 8763, "udp"},
-{"openqueue", {NULL}, 8764, "tcp"},
-{"openqueue", {NULL}, 8764, "udp"},
-{"ultraseek-http", {NULL}, 8765, "tcp"},
-{"ultraseek-http", {NULL}, 8765, "udp"},
-{"dpap", {NULL}, 8770, "tcp"},
-{"dpap", {NULL}, 8770, "udp"},
-{"msgclnt", {NULL}, 8786, "tcp"},
-{"msgclnt", {NULL}, 8786, "udp"},
-{"msgsrvr", {NULL}, 8787, "tcp"},
-{"msgsrvr", {NULL}, 8787, "udp"},
-{"sunwebadmin", {NULL}, 8800, "tcp"},
-{"sunwebadmin", {NULL}, 8800, "udp"},
-{"truecm", {NULL}, 8804, "tcp"},
-{"truecm", {NULL}, 8804, "udp"},
-{"dxspider", {NULL}, 8873, "tcp"},
-{"dxspider", {NULL}, 8873, "udp"},
-{"cddbp-alt", {NULL}, 8880, "tcp"},
-{"cddbp-alt", {NULL}, 8880, "udp"},
-{"secure-mqtt", {NULL}, 8883, "tcp"},
-{"secure-mqtt", {NULL}, 8883, "udp"},
-{"ddi-tcp-1", {NULL}, 8888, "tcp"},
-{"ddi-udp-1", {NULL}, 8888, "udp"},
-{"ddi-tcp-2", {NULL}, 8889, "tcp"},
-{"ddi-udp-2", {NULL}, 8889, "udp"},
-{"ddi-tcp-3", {NULL}, 8890, "tcp"},
-{"ddi-udp-3", {NULL}, 8890, "udp"},
-{"ddi-tcp-4", {NULL}, 8891, "tcp"},
-{"ddi-udp-4", {NULL}, 8891, "udp"},
-{"ddi-tcp-5", {NULL}, 8892, "tcp"},
-{"ddi-udp-5", {NULL}, 8892, "udp"},
-{"ddi-tcp-6", {NULL}, 8893, "tcp"},
-{"ddi-udp-6", {NULL}, 8893, "udp"},
-{"ddi-tcp-7", {NULL}, 8894, "tcp"},
-{"ddi-udp-7", {NULL}, 8894, "udp"},
-{"ospf-lite", {NULL}, 8899, "tcp"},
-{"ospf-lite", {NULL}, 8899, "udp"},
-{"jmb-cds1", {NULL}, 8900, "tcp"},
-{"jmb-cds1", {NULL}, 8900, "udp"},
-{"jmb-cds2", {NULL}, 8901, "tcp"},
-{"jmb-cds2", {NULL}, 8901, "udp"},
-{"manyone-http", {NULL}, 8910, "tcp"},
-{"manyone-http", {NULL}, 8910, "udp"},
-{"manyone-xml", {NULL}, 8911, "tcp"},
-{"manyone-xml", {NULL}, 8911, "udp"},
-{"wcbackup", {NULL}, 8912, "tcp"},
-{"wcbackup", {NULL}, 8912, "udp"},
-{"dragonfly", {NULL}, 8913, "tcp"},
-{"dragonfly", {NULL}, 8913, "udp"},
-{"twds", {NULL}, 8937, "tcp"},
-{"cumulus-admin", {NULL}, 8954, "tcp"},
-{"cumulus-admin", {NULL}, 8954, "udp"},
-{"sunwebadmins", {NULL}, 8989, "tcp"},
-{"sunwebadmins", {NULL}, 8989, "udp"},
-{"http-wmap", {NULL}, 8990, "tcp"},
-{"http-wmap", {NULL}, 8990, "udp"},
-{"https-wmap", {NULL}, 8991, "tcp"},
-{"https-wmap", {NULL}, 8991, "udp"},
-{"bctp", {NULL}, 8999, "tcp"},
-{"bctp", {NULL}, 8999, "udp"},
-{"cslistener", {NULL}, 9000, "tcp"},
-{"cslistener", {NULL}, 9000, "udp"},
-{"etlservicemgr", {NULL}, 9001, "tcp"},
-{"etlservicemgr", {NULL}, 9001, "udp"},
-{"dynamid", {NULL}, 9002, "tcp"},
-{"dynamid", {NULL}, 9002, "udp"},
-{"ogs-client", {NULL}, 9007, "udp"},
-{"ogs-server", {NULL}, 9008, "tcp"},
-{"pichat", {NULL}, 9009, "tcp"},
-{"pichat", {NULL}, 9009, "udp"},
-{"sdr", {NULL}, 9010, "tcp"},
-{"tambora", {NULL}, 9020, "tcp"},
-{"tambora", {NULL}, 9020, "udp"},
-{"panagolin-ident", {NULL}, 9021, "tcp"},
-{"panagolin-ident", {NULL}, 9021, "udp"},
-{"paragent", {NULL}, 9022, "tcp"},
-{"paragent", {NULL}, 9022, "udp"},
-{"swa-1", {NULL}, 9023, "tcp"},
-{"swa-1", {NULL}, 9023, "udp"},
-{"swa-2", {NULL}, 9024, "tcp"},
-{"swa-2", {NULL}, 9024, "udp"},
-{"swa-3", {NULL}, 9025, "tcp"},
-{"swa-3", {NULL}, 9025, "udp"},
-{"swa-4", {NULL}, 9026, "tcp"},
-{"swa-4", {NULL}, 9026, "udp"},
-{"versiera", {NULL}, 9050, "tcp"},
-{"fio-cmgmt", {NULL}, 9051, "tcp"},
-{"glrpc", {NULL}, 9080, "tcp"},
-{"glrpc", {NULL}, 9080, "udp"},
-{"lcs-ap", {NULL}, 9082, "sctp"},
-{"emc-pp-mgmtsvc", {NULL}, 9083, "tcp"},
-{"aurora", {NULL}, 9084, "tcp"},
-{"aurora", {NULL}, 9084, "udp"},
-{"aurora", {NULL}, 9084, "sctp"},
-{"ibm-rsyscon", {NULL}, 9085, "tcp"},
-{"ibm-rsyscon", {NULL}, 9085, "udp"},
-{"net2display", {NULL}, 9086, "tcp"},
-{"net2display", {NULL}, 9086, "udp"},
-{"classic", {NULL}, 9087, "tcp"},
-{"classic", {NULL}, 9087, "udp"},
-{"sqlexec", {NULL}, 9088, "tcp"},
-{"sqlexec", {NULL}, 9088, "udp"},
-{"sqlexec-ssl", {NULL}, 9089, "tcp"},
-{"sqlexec-ssl", {NULL}, 9089, "udp"},
-{"websm", {NULL}, 9090, "tcp"},
-{"websm", {NULL}, 9090, "udp"},
-{"xmltec-xmlmail", {NULL}, 9091, "tcp"},
-{"xmltec-xmlmail", {NULL}, 9091, "udp"},
-{"XmlIpcRegSvc", {NULL}, 9092, "tcp"},
-{"XmlIpcRegSvc", {NULL}, 9092, "udp"},
-{"hp-pdl-datastr", {NULL}, 9100, "tcp"},
-{"hp-pdl-datastr", {NULL}, 9100, "udp"},
-{"pdl-datastream", {NULL}, 9100, "tcp"},
-{"pdl-datastream", {NULL}, 9100, "udp"},
-{"bacula-dir", {NULL}, 9101, "tcp"},
-{"bacula-dir", {NULL}, 9101, "udp"},
-{"bacula-fd", {NULL}, 9102, "tcp"},
-{"bacula-fd", {NULL}, 9102, "udp"},
-{"bacula-sd", {NULL}, 9103, "tcp"},
-{"bacula-sd", {NULL}, 9103, "udp"},
-{"peerwire", {NULL}, 9104, "tcp"},
-{"peerwire", {NULL}, 9104, "udp"},
-{"xadmin", {NULL}, 9105, "tcp"},
-{"xadmin", {NULL}, 9105, "udp"},
-{"astergate", {NULL}, 9106, "tcp"},
-{"astergate-disc", {NULL}, 9106, "udp"},
-{"astergatefax", {NULL}, 9107, "tcp"},
-{"mxit", {NULL}, 9119, "tcp"},
-{"mxit", {NULL}, 9119, "udp"},
-{"dddp", {NULL}, 9131, "tcp"},
-{"dddp", {NULL}, 9131, "udp"},
-{"apani1", {NULL}, 9160, "tcp"},
-{"apani1", {NULL}, 9160, "udp"},
-{"apani2", {NULL}, 9161, "tcp"},
-{"apani2", {NULL}, 9161, "udp"},
-{"apani3", {NULL}, 9162, "tcp"},
-{"apani3", {NULL}, 9162, "udp"},
-{"apani4", {NULL}, 9163, "tcp"},
-{"apani4", {NULL}, 9163, "udp"},
-{"apani5", {NULL}, 9164, "tcp"},
-{"apani5", {NULL}, 9164, "udp"},
-{"sun-as-jpda", {NULL}, 9191, "tcp"},
-{"sun-as-jpda", {NULL}, 9191, "udp"},
-{"wap-wsp", {NULL}, 9200, "tcp"},
-{"wap-wsp", {NULL}, 9200, "udp"},
-{"wap-wsp-wtp", {NULL}, 9201, "tcp"},
-{"wap-wsp-wtp", {NULL}, 9201, "udp"},
-{"wap-wsp-s", {NULL}, 9202, "tcp"},
-{"wap-wsp-s", {NULL}, 9202, "udp"},
-{"wap-wsp-wtp-s", {NULL}, 9203, "tcp"},
-{"wap-wsp-wtp-s", {NULL}, 9203, "udp"},
-{"wap-vcard", {NULL}, 9204, "tcp"},
-{"wap-vcard", {NULL}, 9204, "udp"},
-{"wap-vcal", {NULL}, 9205, "tcp"},
-{"wap-vcal", {NULL}, 9205, "udp"},
-{"wap-vcard-s", {NULL}, 9206, "tcp"},
-{"wap-vcard-s", {NULL}, 9206, "udp"},
-{"wap-vcal-s", {NULL}, 9207, "tcp"},
-{"wap-vcal-s", {NULL}, 9207, "udp"},
-{"rjcdb-vcards", {NULL}, 9208, "tcp"},
-{"rjcdb-vcards", {NULL}, 9208, "udp"},
-{"almobile-system", {NULL}, 9209, "tcp"},
-{"almobile-system", {NULL}, 9209, "udp"},
-{"oma-mlp", {NULL}, 9210, "tcp"},
-{"oma-mlp", {NULL}, 9210, "udp"},
-{"oma-mlp-s", {NULL}, 9211, "tcp"},
-{"oma-mlp-s", {NULL}, 9211, "udp"},
-{"serverviewdbms", {NULL}, 9212, "tcp"},
-{"serverviewdbms", {NULL}, 9212, "udp"},
-{"serverstart", {NULL}, 9213, "tcp"},
-{"serverstart", {NULL}, 9213, "udp"},
-{"ipdcesgbs", {NULL}, 9214, "tcp"},
-{"ipdcesgbs", {NULL}, 9214, "udp"},
-{"insis", {NULL}, 9215, "tcp"},
-{"insis", {NULL}, 9215, "udp"},
-{"acme", {NULL}, 9216, "tcp"},
-{"acme", {NULL}, 9216, "udp"},
-{"fsc-port", {NULL}, 9217, "tcp"},
-{"fsc-port", {NULL}, 9217, "udp"},
-{"teamcoherence", {NULL}, 9222, "tcp"},
-{"teamcoherence", {NULL}, 9222, "udp"},
-{"mon", {NULL}, 9255, "tcp"},
-{"mon", {NULL}, 9255, "udp"},
-{"pegasus", {NULL}, 9278, "tcp"},
-{"pegasus", {NULL}, 9278, "udp"},
-{"pegasus-ctl", {NULL}, 9279, "tcp"},
-{"pegasus-ctl", {NULL}, 9279, "udp"},
-{"pgps", {NULL}, 9280, "tcp"},
-{"pgps", {NULL}, 9280, "udp"},
-{"swtp-port1", {NULL}, 9281, "tcp"},
-{"swtp-port1", {NULL}, 9281, "udp"},
-{"swtp-port2", {NULL}, 9282, "tcp"},
-{"swtp-port2", {NULL}, 9282, "udp"},
-{"callwaveiam", {NULL}, 9283, "tcp"},
-{"callwaveiam", {NULL}, 9283, "udp"},
-{"visd", {NULL}, 9284, "tcp"},
-{"visd", {NULL}, 9284, "udp"},
-{"n2h2server", {NULL}, 9285, "tcp"},
-{"n2h2server", {NULL}, 9285, "udp"},
-{"n2receive", {NULL}, 9286, "udp"},
-{"cumulus", {NULL}, 9287, "tcp"},
-{"cumulus", {NULL}, 9287, "udp"},
-{"armtechdaemon", {NULL}, 9292, "tcp"},
-{"armtechdaemon", {NULL}, 9292, "udp"},
-{"storview", {NULL}, 9293, "tcp"},
-{"storview", {NULL}, 9293, "udp"},
-{"armcenterhttp", {NULL}, 9294, "tcp"},
-{"armcenterhttp", {NULL}, 9294, "udp"},
-{"armcenterhttps", {NULL}, 9295, "tcp"},
-{"armcenterhttps", {NULL}, 9295, "udp"},
-{"vrace", {NULL}, 9300, "tcp"},
-{"vrace", {NULL}, 9300, "udp"},
-{"sphinxql", {NULL}, 9306, "tcp"},
-{"sphinxapi", {NULL}, 9312, "tcp"},
-{"secure-ts", {NULL}, 9318, "tcp"},
-{"secure-ts", {NULL}, 9318, "udp"},
-{"guibase", {NULL}, 9321, "tcp"},
-{"guibase", {NULL}, 9321, "udp"},
-{"mpidcmgr", {NULL}, 9343, "tcp"},
-{"mpidcmgr", {NULL}, 9343, "udp"},
-{"mphlpdmc", {NULL}, 9344, "tcp"},
-{"mphlpdmc", {NULL}, 9344, "udp"},
-{"ctechlicensing", {NULL}, 9346, "tcp"},
-{"ctechlicensing", {NULL}, 9346, "udp"},
-{"fjdmimgr", {NULL}, 9374, "tcp"},
-{"fjdmimgr", {NULL}, 9374, "udp"},
-{"boxp", {NULL}, 9380, "tcp"},
-{"boxp", {NULL}, 9380, "udp"},
-{"d2dconfig", {NULL}, 9387, "tcp"},
-{"d2ddatatrans", {NULL}, 9388, "tcp"},
-{"adws", {NULL}, 9389, "tcp"},
-{"otp", {NULL}, 9390, "tcp"},
-{"fjinvmgr", {NULL}, 9396, "tcp"},
-{"fjinvmgr", {NULL}, 9396, "udp"},
-{"mpidcagt", {NULL}, 9397, "tcp"},
-{"mpidcagt", {NULL}, 9397, "udp"},
-{"sec-t4net-srv", {NULL}, 9400, "tcp"},
-{"sec-t4net-srv", {NULL}, 9400, "udp"},
-{"sec-t4net-clt", {NULL}, 9401, "tcp"},
-{"sec-t4net-clt", {NULL}, 9401, "udp"},
-{"sec-pc2fax-srv", {NULL}, 9402, "tcp"},
-{"sec-pc2fax-srv", {NULL}, 9402, "udp"},
-{"git", {NULL}, 9418, "tcp"},
-{"git", {NULL}, 9418, "udp"},
-{"tungsten-https", {NULL}, 9443, "tcp"},
-{"tungsten-https", {NULL}, 9443, "udp"},
-{"wso2esb-console", {NULL}, 9444, "tcp"},
-{"wso2esb-console", {NULL}, 9444, "udp"},
-{"sntlkeyssrvr", {NULL}, 9450, "tcp"},
-{"sntlkeyssrvr", {NULL}, 9450, "udp"},
-{"ismserver", {NULL}, 9500, "tcp"},
-{"ismserver", {NULL}, 9500, "udp"},
-{"sma-spw", {NULL}, 9522, "udp"},
-{"mngsuite", {NULL}, 9535, "tcp"},
-{"mngsuite", {NULL}, 9535, "udp"},
-{"laes-bf", {NULL}, 9536, "tcp"},
-{"laes-bf", {NULL}, 9536, "udp"},
-{"trispen-sra", {NULL}, 9555, "tcp"},
-{"trispen-sra", {NULL}, 9555, "udp"},
-{"ldgateway", {NULL}, 9592, "tcp"},
-{"ldgateway", {NULL}, 9592, "udp"},
-{"cba8", {NULL}, 9593, "tcp"},
-{"cba8", {NULL}, 9593, "udp"},
-{"msgsys", {NULL}, 9594, "tcp"},
-{"msgsys", {NULL}, 9594, "udp"},
-{"pds", {NULL}, 9595, "tcp"},
-{"pds", {NULL}, 9595, "udp"},
-{"mercury-disc", {NULL}, 9596, "tcp"},
-{"mercury-disc", {NULL}, 9596, "udp"},
-{"pd-admin", {NULL}, 9597, "tcp"},
-{"pd-admin", {NULL}, 9597, "udp"},
-{"vscp", {NULL}, 9598, "tcp"},
-{"vscp", {NULL}, 9598, "udp"},
-{"robix", {NULL}, 9599, "tcp"},
-{"robix", {NULL}, 9599, "udp"},
-{"micromuse-ncpw", {NULL}, 9600, "tcp"},
-{"micromuse-ncpw", {NULL}, 9600, "udp"},
-{"streamcomm-ds", {NULL}, 9612, "tcp"},
-{"streamcomm-ds", {NULL}, 9612, "udp"},
-{"iadt-tls", {NULL}, 9614, "tcp"},
-{"erunbook_agent", {NULL}, 9616, "tcp"},
-{"erunbook_server", {NULL}, 9617, "tcp"},
-{"condor", {NULL}, 9618, "tcp"},
-{"condor", {NULL}, 9618, "udp"},
-{"odbcpathway", {NULL}, 9628, "tcp"},
-{"odbcpathway", {NULL}, 9628, "udp"},
-{"uniport", {NULL}, 9629, "tcp"},
-{"uniport", {NULL}, 9629, "udp"},
-{"peoctlr", {NULL}, 9630, "tcp"},
-{"peocoll", {NULL}, 9631, "tcp"},
-{"mc-comm", {NULL}, 9632, "udp"},
-{"pqsflows", {NULL}, 9640, "tcp"},
-{"xmms2", {NULL}, 9667, "tcp"},
-{"xmms2", {NULL}, 9667, "udp"},
-{"tec5-sdctp", {NULL}, 9668, "tcp"},
-{"tec5-sdctp", {NULL}, 9668, "udp"},
-{"client-wakeup", {NULL}, 9694, "tcp"},
-{"client-wakeup", {NULL}, 9694, "udp"},
-{"ccnx", {NULL}, 9695, "tcp"},
-{"ccnx", {NULL}, 9695, "udp"},
-{"board-roar", {NULL}, 9700, "tcp"},
-{"board-roar", {NULL}, 9700, "udp"},
-{"l5nas-parchan", {NULL}, 9747, "tcp"},
-{"l5nas-parchan", {NULL}, 9747, "udp"},
-{"board-voip", {NULL}, 9750, "tcp"},
-{"board-voip", {NULL}, 9750, "udp"},
-{"rasadv", {NULL}, 9753, "tcp"},
-{"rasadv", {NULL}, 9753, "udp"},
-{"tungsten-http", {NULL}, 9762, "tcp"},
-{"tungsten-http", {NULL}, 9762, "udp"},
-{"davsrc", {NULL}, 9800, "tcp"},
-{"davsrc", {NULL}, 9800, "udp"},
-{"sstp-2", {NULL}, 9801, "tcp"},
-{"sstp-2", {NULL}, 9801, "udp"},
-{"davsrcs", {NULL}, 9802, "tcp"},
-{"davsrcs", {NULL}, 9802, "udp"},
-{"sapv1", {NULL}, 9875, "tcp"},
-{"sapv1", {NULL}, 9875, "udp"},
-{"sd", {NULL}, 9876, "tcp"},
-{"sd", {NULL}, 9876, "udp"},
-{"cyborg-systems", {NULL}, 9888, "tcp"},
-{"cyborg-systems", {NULL}, 9888, "udp"},
-{"gt-proxy", {NULL}, 9889, "tcp"},
-{"gt-proxy", {NULL}, 9889, "udp"},
-{"monkeycom", {NULL}, 9898, "tcp"},
-{"monkeycom", {NULL}, 9898, "udp"},
-{"sctp-tunneling", {NULL}, 9899, "tcp"},
-{"sctp-tunneling", {NULL}, 9899, "udp"},
-{"iua", {NULL}, 9900, "tcp"},
-{"iua", {NULL}, 9900, "udp"},
-{"iua", {NULL}, 9900, "sctp"},
-{"enrp", {NULL}, 9901, "udp"},
-{"enrp-sctp", {NULL}, 9901, "sctp"},
-{"enrp-sctp-tls", {NULL}, 9902, "sctp"},
-{"domaintime", {NULL}, 9909, "tcp"},
-{"domaintime", {NULL}, 9909, "udp"},
-{"sype-transport", {NULL}, 9911, "tcp"},
-{"sype-transport", {NULL}, 9911, "udp"},
-{"apc-9950", {NULL}, 9950, "tcp"},
-{"apc-9950", {NULL}, 9950, "udp"},
-{"apc-9951", {NULL}, 9951, "tcp"},
-{"apc-9951", {NULL}, 9951, "udp"},
-{"apc-9952", {NULL}, 9952, "tcp"},
-{"apc-9952", {NULL}, 9952, "udp"},
-{"acis", {NULL}, 9953, "tcp"},
-{"acis", {NULL}, 9953, "udp"},
-{"odnsp", {NULL}, 9966, "tcp"},
-{"odnsp", {NULL}, 9966, "udp"},
-{"dsm-scm-target", {NULL}, 9987, "tcp"},
-{"dsm-scm-target", {NULL}, 9987, "udp"},
-{"nsesrvr", {NULL}, 9988, "tcp"},
-{"osm-appsrvr", {NULL}, 9990, "tcp"},
-{"osm-appsrvr", {NULL}, 9990, "udp"},
-{"osm-oev", {NULL}, 9991, "tcp"},
-{"osm-oev", {NULL}, 9991, "udp"},
-{"palace-1", {NULL}, 9992, "tcp"},
-{"palace-1", {NULL}, 9992, "udp"},
-{"palace-2", {NULL}, 9993, "tcp"},
-{"palace-2", {NULL}, 9993, "udp"},
-{"palace-3", {NULL}, 9994, "tcp"},
-{"palace-3", {NULL}, 9994, "udp"},
-{"palace-4", {NULL}, 9995, "tcp"},
-{"palace-4", {NULL}, 9995, "udp"},
-{"palace-5", {NULL}, 9996, "tcp"},
-{"palace-5", {NULL}, 9996, "udp"},
-{"palace-6", {NULL}, 9997, "tcp"},
-{"palace-6", {NULL}, 9997, "udp"},
-{"distinct32", {NULL}, 9998, "tcp"},
-{"distinct32", {NULL}, 9998, "udp"},
-{"distinct", {NULL}, 9999, "tcp"},
-{"distinct", {NULL}, 9999, "udp"},
-{"ndmp", {NULL}, 10000, "tcp"},
-{"ndmp", {NULL}, 10000, "udp"},
-{"scp-config", {NULL}, 10001, "tcp"},
-{"scp-config", {NULL}, 10001, "udp"},
-{"documentum", {NULL}, 10002, "tcp"},
-{"documentum", {NULL}, 10002, "udp"},
-{"documentum_s", {NULL}, 10003, "tcp"},
-{"documentum_s", {NULL}, 10003, "udp"},
-{"emcrmirccd", {NULL}, 10004, "tcp"},
-{"emcrmird", {NULL}, 10005, "tcp"},
-{"mvs-capacity", {NULL}, 10007, "tcp"},
-{"mvs-capacity", {NULL}, 10007, "udp"},
-{"octopus", {NULL}, 10008, "tcp"},
-{"octopus", {NULL}, 10008, "udp"},
-{"swdtp-sv", {NULL}, 10009, "tcp"},
-{"swdtp-sv", {NULL}, 10009, "udp"},
-{"rxapi", {NULL}, 10010, "tcp"},
-{"zabbix-agent", {NULL}, 10050, "tcp"},
-{"zabbix-agent", {NULL}, 10050, "udp"},
-{"zabbix-trapper", {NULL}, 10051, "tcp"},
-{"zabbix-trapper", {NULL}, 10051, "udp"},
-{"qptlmd", {NULL}, 10055, "tcp"},
-{"amanda", {NULL}, 10080, "tcp"},
-{"amanda", {NULL}, 10080, "udp"},
-{"famdc", {NULL}, 10081, "tcp"},
-{"famdc", {NULL}, 10081, "udp"},
-{"itap-ddtp", {NULL}, 10100, "tcp"},
-{"itap-ddtp", {NULL}, 10100, "udp"},
-{"ezmeeting-2", {NULL}, 10101, "tcp"},
-{"ezmeeting-2", {NULL}, 10101, "udp"},
-{"ezproxy-2", {NULL}, 10102, "tcp"},
-{"ezproxy-2", {NULL}, 10102, "udp"},
-{"ezrelay", {NULL}, 10103, "tcp"},
-{"ezrelay", {NULL}, 10103, "udp"},
-{"swdtp", {NULL}, 10104, "tcp"},
-{"swdtp", {NULL}, 10104, "udp"},
-{"bctp-server", {NULL}, 10107, "tcp"},
-{"bctp-server", {NULL}, 10107, "udp"},
-{"nmea-0183", {NULL}, 10110, "tcp"},
-{"nmea-0183", {NULL}, 10110, "udp"},
-{"netiq-endpoint", {NULL}, 10113, "tcp"},
-{"netiq-endpoint", {NULL}, 10113, "udp"},
-{"netiq-qcheck", {NULL}, 10114, "tcp"},
-{"netiq-qcheck", {NULL}, 10114, "udp"},
-{"netiq-endpt", {NULL}, 10115, "tcp"},
-{"netiq-endpt", {NULL}, 10115, "udp"},
-{"netiq-voipa", {NULL}, 10116, "tcp"},
-{"netiq-voipa", {NULL}, 10116, "udp"},
-{"iqrm", {NULL}, 10117, "tcp"},
-{"iqrm", {NULL}, 10117, "udp"},
-{"bmc-perf-sd", {NULL}, 10128, "tcp"},
-{"bmc-perf-sd", {NULL}, 10128, "udp"},
-{"bmc-gms", {NULL}, 10129, "tcp"},
-{"qb-db-server", {NULL}, 10160, "tcp"},
-{"qb-db-server", {NULL}, 10160, "udp"},
-{"snmptls", {NULL}, 10161, "tcp"},
-{"snmpdtls", {NULL}, 10161, "udp"},
-{"snmptls-trap", {NULL}, 10162, "tcp"},
-{"snmpdtls-trap", {NULL}, 10162, "udp"},
-{"trisoap", {NULL}, 10200, "tcp"},
-{"trisoap", {NULL}, 10200, "udp"},
-{"rsms", {NULL}, 10201, "tcp"},
-{"rscs", {NULL}, 10201, "udp"},
-{"apollo-relay", {NULL}, 10252, "tcp"},
-{"apollo-relay", {NULL}, 10252, "udp"},
-{"axis-wimp-port", {NULL}, 10260, "tcp"},
-{"axis-wimp-port", {NULL}, 10260, "udp"},
-{"blocks", {NULL}, 10288, "tcp"},
-{"blocks", {NULL}, 10288, "udp"},
-{"cosir", {NULL}, 10321, "tcp"},
-{"hip-nat-t", {NULL}, 10500, "udp"},
-{"MOS-lower", {NULL}, 10540, "tcp"},
-{"MOS-lower", {NULL}, 10540, "udp"},
-{"MOS-upper", {NULL}, 10541, "tcp"},
-{"MOS-upper", {NULL}, 10541, "udp"},
-{"MOS-aux", {NULL}, 10542, "tcp"},
-{"MOS-aux", {NULL}, 10542, "udp"},
-{"MOS-soap", {NULL}, 10543, "tcp"},
-{"MOS-soap", {NULL}, 10543, "udp"},
-{"MOS-soap-opt", {NULL}, 10544, "tcp"},
-{"MOS-soap-opt", {NULL}, 10544, "udp"},
-{"gap", {NULL}, 10800, "tcp"},
-{"gap", {NULL}, 10800, "udp"},
-{"lpdg", {NULL}, 10805, "tcp"},
-{"lpdg", {NULL}, 10805, "udp"},
-{"nbd", {NULL}, 10809, "tcp"},
-{"nmc-disc", {NULL}, 10810, "udp"},
-{"helix", {NULL}, 10860, "tcp"},
-{"helix", {NULL}, 10860, "udp"},
-{"rmiaux", {NULL}, 10990, "tcp"},
-{"rmiaux", {NULL}, 10990, "udp"},
-{"irisa", {NULL}, 11000, "tcp"},
-{"irisa", {NULL}, 11000, "udp"},
-{"metasys", {NULL}, 11001, "tcp"},
-{"metasys", {NULL}, 11001, "udp"},
-{"netapp-icmgmt", {NULL}, 11104, "tcp"},
-{"netapp-icdata", {NULL}, 11105, "tcp"},
-{"sgi-lk", {NULL}, 11106, "tcp"},
-{"sgi-lk", {NULL}, 11106, "udp"},
-{"vce", {NULL}, 11111, "tcp"},
-{"vce", {NULL}, 11111, "udp"},
-{"dicom", {NULL}, 11112, "tcp"},
-{"dicom", {NULL}, 11112, "udp"},
-{"suncacao-snmp", {NULL}, 11161, "tcp"},
-{"suncacao-snmp", {NULL}, 11161, "udp"},
-{"suncacao-jmxmp", {NULL}, 11162, "tcp"},
-{"suncacao-jmxmp", {NULL}, 11162, "udp"},
-{"suncacao-rmi", {NULL}, 11163, "tcp"},
-{"suncacao-rmi", {NULL}, 11163, "udp"},
-{"suncacao-csa", {NULL}, 11164, "tcp"},
-{"suncacao-csa", {NULL}, 11164, "udp"},
-{"suncacao-websvc", {NULL}, 11165, "tcp"},
-{"suncacao-websvc", {NULL}, 11165, "udp"},
-{"snss", {NULL}, 11171, "udp"},
-{"oemcacao-jmxmp", {NULL}, 11172, "tcp"},
-{"oemcacao-rmi", {NULL}, 11174, "tcp"},
-{"oemcacao-websvc", {NULL}, 11175, "tcp"},
-{"smsqp", {NULL}, 11201, "tcp"},
-{"smsqp", {NULL}, 11201, "udp"},
-{"wifree", {NULL}, 11208, "tcp"},
-{"wifree", {NULL}, 11208, "udp"},
-{"memcache", {NULL}, 11211, "tcp"},
-{"memcache", {NULL}, 11211, "udp"},
-{"imip", {NULL}, 11319, "tcp"},
-{"imip", {NULL}, 11319, "udp"},
-{"imip-channels", {NULL}, 11320, "tcp"},
-{"imip-channels", {NULL}, 11320, "udp"},
-{"arena-server", {NULL}, 11321, "tcp"},
-{"arena-server", {NULL}, 11321, "udp"},
-{"atm-uhas", {NULL}, 11367, "tcp"},
-{"atm-uhas", {NULL}, 11367, "udp"},
-{"hkp", {NULL}, 11371, "tcp"},
-{"hkp", {NULL}, 11371, "udp"},
-{"asgcypresstcps", {NULL}, 11489, "tcp"},
-{"tempest-port", {NULL}, 11600, "tcp"},
-{"tempest-port", {NULL}, 11600, "udp"},
-{"h323callsigalt", {NULL}, 11720, "tcp"},
-{"h323callsigalt", {NULL}, 11720, "udp"},
-{"intrepid-ssl", {NULL}, 11751, "tcp"},
-{"intrepid-ssl", {NULL}, 11751, "udp"},
-{"xoraya", {NULL}, 11876, "tcp"},
-{"xoraya", {NULL}, 11876, "udp"},
-{"x2e-disc", {NULL}, 11877, "udp"},
-{"sysinfo-sp", {NULL}, 11967, "tcp"},
-{"sysinfo-sp", {NULL}, 11967, "udp"},
-{"wmereceiving", {NULL}, 11997, "sctp"},
-{"wmedistribution", {NULL}, 11998, "sctp"},
-{"wmereporting", {NULL}, 11999, "sctp"},
-{"entextxid", {NULL}, 12000, "tcp"},
-{"entextxid", {NULL}, 12000, "udp"},
-{"entextnetwk", {NULL}, 12001, "tcp"},
-{"entextnetwk", {NULL}, 12001, "udp"},
-{"entexthigh", {NULL}, 12002, "tcp"},
-{"entexthigh", {NULL}, 12002, "udp"},
-{"entextmed", {NULL}, 12003, "tcp"},
-{"entextmed", {NULL}, 12003, "udp"},
-{"entextlow", {NULL}, 12004, "tcp"},
-{"entextlow", {NULL}, 12004, "udp"},
-{"dbisamserver1", {NULL}, 12005, "tcp"},
-{"dbisamserver1", {NULL}, 12005, "udp"},
-{"dbisamserver2", {NULL}, 12006, "tcp"},
-{"dbisamserver2", {NULL}, 12006, "udp"},
-{"accuracer", {NULL}, 12007, "tcp"},
-{"accuracer", {NULL}, 12007, "udp"},
-{"accuracer-dbms", {NULL}, 12008, "tcp"},
-{"accuracer-dbms", {NULL}, 12008, "udp"},
-{"edbsrvr", {NULL}, 12010, "tcp"},
-{"vipera", {NULL}, 12012, "tcp"},
-{"vipera", {NULL}, 12012, "udp"},
-{"vipera-ssl", {NULL}, 12013, "tcp"},
-{"vipera-ssl", {NULL}, 12013, "udp"},
-{"rets-ssl", {NULL}, 12109, "tcp"},
-{"rets-ssl", {NULL}, 12109, "udp"},
-{"nupaper-ss", {NULL}, 12121, "tcp"},
-{"nupaper-ss", {NULL}, 12121, "udp"},
-{"cawas", {NULL}, 12168, "tcp"},
-{"cawas", {NULL}, 12168, "udp"},
-{"hivep", {NULL}, 12172, "tcp"},
-{"hivep", {NULL}, 12172, "udp"},
-{"linogridengine", {NULL}, 12300, "tcp"},
-{"linogridengine", {NULL}, 12300, "udp"},
-{"warehouse-sss", {NULL}, 12321, "tcp"},
-{"warehouse-sss", {NULL}, 12321, "udp"},
-{"warehouse", {NULL}, 12322, "tcp"},
-{"warehouse", {NULL}, 12322, "udp"},
-{"italk", {NULL}, 12345, "tcp"},
-{"italk", {NULL}, 12345, "udp"},
-{"tsaf", {NULL}, 12753, "tcp"},
-{"tsaf", {NULL}, 12753, "udp"},
-{"i-zipqd", {NULL}, 13160, "tcp"},
-{"i-zipqd", {NULL}, 13160, "udp"},
-{"bcslogc", {NULL}, 13216, "tcp"},
-{"bcslogc", {NULL}, 13216, "udp"},
-{"rs-pias", {NULL}, 13217, "tcp"},
-{"rs-pias", {NULL}, 13217, "udp"},
-{"emc-vcas-tcp", {NULL}, 13218, "tcp"},
-{"emc-vcas-udp", {NULL}, 13218, "udp"},
-{"powwow-client", {NULL}, 13223, "tcp"},
-{"powwow-client", {NULL}, 13223, "udp"},
-{"powwow-server", {NULL}, 13224, "tcp"},
-{"powwow-server", {NULL}, 13224, "udp"},
-{"doip-data", {NULL}, 13400, "tcp"},
-{"doip-disc", {NULL}, 13400, "udp"},
-{"bprd", {NULL}, 13720, "tcp"},
-{"bprd", {NULL}, 13720, "udp"},
-{"bpdbm", {NULL}, 13721, "tcp"},
-{"bpdbm", {NULL}, 13721, "udp"},
-{"bpjava-msvc", {NULL}, 13722, "tcp"},
-{"bpjava-msvc", {NULL}, 13722, "udp"},
-{"vnetd", {NULL}, 13724, "tcp"},
-{"vnetd", {NULL}, 13724, "udp"},
-{"bpcd", {NULL}, 13782, "tcp"},
-{"bpcd", {NULL}, 13782, "udp"},
-{"vopied", {NULL}, 13783, "tcp"},
-{"vopied", {NULL}, 13783, "udp"},
-{"nbdb", {NULL}, 13785, "tcp"},
-{"nbdb", {NULL}, 13785, "udp"},
-{"nomdb", {NULL}, 13786, "tcp"},
-{"nomdb", {NULL}, 13786, "udp"},
-{"dsmcc-config", {NULL}, 13818, "tcp"},
-{"dsmcc-config", {NULL}, 13818, "udp"},
-{"dsmcc-session", {NULL}, 13819, "tcp"},
-{"dsmcc-session", {NULL}, 13819, "udp"},
-{"dsmcc-passthru", {NULL}, 13820, "tcp"},
-{"dsmcc-passthru", {NULL}, 13820, "udp"},
-{"dsmcc-download", {NULL}, 13821, "tcp"},
-{"dsmcc-download", {NULL}, 13821, "udp"},
-{"dsmcc-ccp", {NULL}, 13822, "tcp"},
-{"dsmcc-ccp", {NULL}, 13822, "udp"},
-{"bmdss", {NULL}, 13823, "tcp"},
-{"dta-systems", {NULL}, 13929, "tcp"},
-{"dta-systems", {NULL}, 13929, "udp"},
-{"medevolve", {NULL}, 13930, "tcp"},
-{"scotty-ft", {NULL}, 14000, "tcp"},
-{"scotty-ft", {NULL}, 14000, "udp"},
-{"sua", {NULL}, 14001, "tcp"},
-{"sua", {NULL}, 14001, "udp"},
-{"sua", {NULL}, 14001, "sctp"},
-{"sage-best-com1", {NULL}, 14033, "tcp"},
-{"sage-best-com1", {NULL}, 14033, "udp"},
-{"sage-best-com2", {NULL}, 14034, "tcp"},
-{"sage-best-com2", {NULL}, 14034, "udp"},
-{"vcs-app", {NULL}, 14141, "tcp"},
-{"vcs-app", {NULL}, 14141, "udp"},
-{"icpp", {NULL}, 14142, "tcp"},
-{"icpp", {NULL}, 14142, "udp"},
-{"gcm-app", {NULL}, 14145, "tcp"},
-{"gcm-app", {NULL}, 14145, "udp"},
-{"vrts-tdd", {NULL}, 14149, "tcp"},
-{"vrts-tdd", {NULL}, 14149, "udp"},
-{"vcscmd", {NULL}, 14150, "tcp"},
-{"vad", {NULL}, 14154, "tcp"},
-{"vad", {NULL}, 14154, "udp"},
-{"cps", {NULL}, 14250, "tcp"},
-{"cps", {NULL}, 14250, "udp"},
-{"ca-web-update", {NULL}, 14414, "tcp"},
-{"ca-web-update", {NULL}, 14414, "udp"},
-{"hde-lcesrvr-1", {NULL}, 14936, "tcp"},
-{"hde-lcesrvr-1", {NULL}, 14936, "udp"},
-{"hde-lcesrvr-2", {NULL}, 14937, "tcp"},
-{"hde-lcesrvr-2", {NULL}, 14937, "udp"},
-{"hydap", {NULL}, 15000, "tcp"},
-{"hydap", {NULL}, 15000, "udp"},
-{"xpilot", {NULL}, 15345, "tcp"},
-{"xpilot", {NULL}, 15345, "udp"},
-{"3link", {NULL}, 15363, "tcp"},
-{"3link", {NULL}, 15363, "udp"},
-{"cisco-snat", {NULL}, 15555, "tcp"},
-{"cisco-snat", {NULL}, 15555, "udp"},
-{"bex-xr", {NULL}, 15660, "tcp"},
-{"bex-xr", {NULL}, 15660, "udp"},
-{"ptp", {NULL}, 15740, "tcp"},
-{"ptp", {NULL}, 15740, "udp"},
-{"2ping", {NULL}, 15998, "udp"},
-{"programmar", {NULL}, 15999, "tcp"},
-{"fmsas", {NULL}, 16000, "tcp"},
-{"fmsascon", {NULL}, 16001, "tcp"},
-{"gsms", {NULL}, 16002, "tcp"},
-{"alfin", {NULL}, 16003, "udp"},
-{"jwpc", {NULL}, 16020, "tcp"},
-{"jwpc-bin", {NULL}, 16021, "tcp"},
-{"sun-sea-port", {NULL}, 16161, "tcp"},
-{"sun-sea-port", {NULL}, 16161, "udp"},
-{"solaris-audit", {NULL}, 16162, "tcp"},
-{"etb4j", {NULL}, 16309, "tcp"},
-{"etb4j", {NULL}, 16309, "udp"},
-{"pduncs", {NULL}, 16310, "tcp"},
-{"pduncs", {NULL}, 16310, "udp"},
-{"pdefmns", {NULL}, 16311, "tcp"},
-{"pdefmns", {NULL}, 16311, "udp"},
-{"netserialext1", {NULL}, 16360, "tcp"},
-{"netserialext1", {NULL}, 16360, "udp"},
-{"netserialext2", {NULL}, 16361, "tcp"},
-{"netserialext2", {NULL}, 16361, "udp"},
-{"netserialext3", {NULL}, 16367, "tcp"},
-{"netserialext3", {NULL}, 16367, "udp"},
-{"netserialext4", {NULL}, 16368, "tcp"},
-{"netserialext4", {NULL}, 16368, "udp"},
-{"connected", {NULL}, 16384, "tcp"},
-{"connected", {NULL}, 16384, "udp"},
-{"xoms", {NULL}, 16619, "tcp"},
-{"newbay-snc-mc", {NULL}, 16900, "tcp"},
-{"newbay-snc-mc", {NULL}, 16900, "udp"},
-{"sgcip", {NULL}, 16950, "tcp"},
-{"sgcip", {NULL}, 16950, "udp"},
-{"intel-rci-mp", {NULL}, 16991, "tcp"},
-{"intel-rci-mp", {NULL}, 16991, "udp"},
-{"amt-soap-http", {NULL}, 16992, "tcp"},
-{"amt-soap-http", {NULL}, 16992, "udp"},
-{"amt-soap-https", {NULL}, 16993, "tcp"},
-{"amt-soap-https", {NULL}, 16993, "udp"},
-{"amt-redir-tcp", {NULL}, 16994, "tcp"},
-{"amt-redir-tcp", {NULL}, 16994, "udp"},
-{"amt-redir-tls", {NULL}, 16995, "tcp"},
-{"amt-redir-tls", {NULL}, 16995, "udp"},
-{"isode-dua", {NULL}, 17007, "tcp"},
-{"isode-dua", {NULL}, 17007, "udp"},
-{"soundsvirtual", {NULL}, 17185, "tcp"},
-{"soundsvirtual", {NULL}, 17185, "udp"},
-{"chipper", {NULL}, 17219, "tcp"},
-{"chipper", {NULL}, 17219, "udp"},
-{"integrius-stp", {NULL}, 17234, "tcp"},
-{"integrius-stp", {NULL}, 17234, "udp"},
-{"ssh-mgmt", {NULL}, 17235, "tcp"},
-{"ssh-mgmt", {NULL}, 17235, "udp"},
-{"db-lsp", {NULL}, 17500, "tcp"},
-{"db-lsp-disc", {NULL}, 17500, "udp"},
-{"ea", {NULL}, 17729, "tcp"},
-{"ea", {NULL}, 17729, "udp"},
-{"zep", {NULL}, 17754, "tcp"},
-{"zep", {NULL}, 17754, "udp"},
-{"zigbee-ip", {NULL}, 17755, "tcp"},
-{"zigbee-ip", {NULL}, 17755, "udp"},
-{"zigbee-ips", {NULL}, 17756, "tcp"},
-{"zigbee-ips", {NULL}, 17756, "udp"},
-{"sw-orion", {NULL}, 17777, "tcp"},
-{"biimenu", {NULL}, 18000, "tcp"},
-{"biimenu", {NULL}, 18000, "udp"},
-{"radpdf", {NULL}, 18104, "tcp"},
-{"racf", {NULL}, 18136, "tcp"},
-{"opsec-cvp", {NULL}, 18181, "tcp"},
-{"opsec-cvp", {NULL}, 18181, "udp"},
-{"opsec-ufp", {NULL}, 18182, "tcp"},
-{"opsec-ufp", {NULL}, 18182, "udp"},
-{"opsec-sam", {NULL}, 18183, "tcp"},
-{"opsec-sam", {NULL}, 18183, "udp"},
-{"opsec-lea", {NULL}, 18184, "tcp"},
-{"opsec-lea", {NULL}, 18184, "udp"},
-{"opsec-omi", {NULL}, 18185, "tcp"},
-{"opsec-omi", {NULL}, 18185, "udp"},
-{"ohsc", {NULL}, 18186, "tcp"},
-{"ohsc", {NULL}, 18186, "udp"},
-{"opsec-ela", {NULL}, 18187, "tcp"},
-{"opsec-ela", {NULL}, 18187, "udp"},
-{"checkpoint-rtm", {NULL}, 18241, "tcp"},
-{"checkpoint-rtm", {NULL}, 18241, "udp"},
-{"gv-pf", {NULL}, 18262, "tcp"},
-{"gv-pf", {NULL}, 18262, "udp"},
-{"ac-cluster", {NULL}, 18463, "tcp"},
-{"ac-cluster", {NULL}, 18463, "udp"},
-{"rds-ib", {NULL}, 18634, "tcp"},
-{"rds-ib", {NULL}, 18634, "udp"},
-{"rds-ip", {NULL}, 18635, "tcp"},
-{"rds-ip", {NULL}, 18635, "udp"},
-{"ique", {NULL}, 18769, "tcp"},
-{"ique", {NULL}, 18769, "udp"},
-{"infotos", {NULL}, 18881, "tcp"},
-{"infotos", {NULL}, 18881, "udp"},
-{"apc-necmp", {NULL}, 18888, "tcp"},
-{"apc-necmp", {NULL}, 18888, "udp"},
-{"igrid", {NULL}, 19000, "tcp"},
-{"igrid", {NULL}, 19000, "udp"},
-{"j-link", {NULL}, 19020, "tcp"},
-{"opsec-uaa", {NULL}, 19191, "tcp"},
-{"opsec-uaa", {NULL}, 19191, "udp"},
-{"ua-secureagent", {NULL}, 19194, "tcp"},
-{"ua-secureagent", {NULL}, 19194, "udp"},
-{"keysrvr", {NULL}, 19283, "tcp"},
-{"keysrvr", {NULL}, 19283, "udp"},
-{"keyshadow", {NULL}, 19315, "tcp"},
-{"keyshadow", {NULL}, 19315, "udp"},
-{"mtrgtrans", {NULL}, 19398, "tcp"},
-{"mtrgtrans", {NULL}, 19398, "udp"},
-{"hp-sco", {NULL}, 19410, "tcp"},
-{"hp-sco", {NULL}, 19410, "udp"},
-{"hp-sca", {NULL}, 19411, "tcp"},
-{"hp-sca", {NULL}, 19411, "udp"},
-{"hp-sessmon", {NULL}, 19412, "tcp"},
-{"hp-sessmon", {NULL}, 19412, "udp"},
-{"fxuptp", {NULL}, 19539, "tcp"},
-{"fxuptp", {NULL}, 19539, "udp"},
-{"sxuptp", {NULL}, 19540, "tcp"},
-{"sxuptp", {NULL}, 19540, "udp"},
-{"jcp", {NULL}, 19541, "tcp"},
-{"jcp", {NULL}, 19541, "udp"},
-{"iec-104-sec", {NULL}, 19998, "tcp"},
-{"dnp-sec", {NULL}, 19999, "tcp"},
-{"dnp-sec", {NULL}, 19999, "udp"},
-{"dnp", {NULL}, 20000, "tcp"},
-{"dnp", {NULL}, 20000, "udp"},
-{"microsan", {NULL}, 20001, "tcp"},
-{"microsan", {NULL}, 20001, "udp"},
-{"commtact-http", {NULL}, 20002, "tcp"},
-{"commtact-http", {NULL}, 20002, "udp"},
-{"commtact-https", {NULL}, 20003, "tcp"},
-{"commtact-https", {NULL}, 20003, "udp"},
-{"openwebnet", {NULL}, 20005, "tcp"},
-{"openwebnet", {NULL}, 20005, "udp"},
-{"ss-idi-disc", {NULL}, 20012, "udp"},
-{"ss-idi", {NULL}, 20013, "tcp"},
-{"opendeploy", {NULL}, 20014, "tcp"},
-{"opendeploy", {NULL}, 20014, "udp"},
-{"nburn_id", {NULL}, 20034, "tcp"},
-{"nburn_id", {NULL}, 20034, "udp"},
-{"tmophl7mts", {NULL}, 20046, "tcp"},
-{"tmophl7mts", {NULL}, 20046, "udp"},
-{"mountd", {NULL}, 20048, "tcp"},
-{"mountd", {NULL}, 20048, "udp"},
-{"nfsrdma", {NULL}, 20049, "tcp"},
-{"nfsrdma", {NULL}, 20049, "udp"},
-{"nfsrdma", {NULL}, 20049, "sctp"},
-{"tolfab", {NULL}, 20167, "tcp"},
-{"tolfab", {NULL}, 20167, "udp"},
-{"ipdtp-port", {NULL}, 20202, "tcp"},
-{"ipdtp-port", {NULL}, 20202, "udp"},
-{"ipulse-ics", {NULL}, 20222, "tcp"},
-{"ipulse-ics", {NULL}, 20222, "udp"},
-{"emwavemsg", {NULL}, 20480, "tcp"},
-{"emwavemsg", {NULL}, 20480, "udp"},
-{"track", {NULL}, 20670, "tcp"},
-{"track", {NULL}, 20670, "udp"},
-{"athand-mmp", {NULL}, 20999, "tcp"},
-{"athand-mmp", {NULL}, 20999, "udp"},
-{"irtrans", {NULL}, 21000, "tcp"},
-{"irtrans", {NULL}, 21000, "udp"},
-{"dfserver", {NULL}, 21554, "tcp"},
-{"dfserver", {NULL}, 21554, "udp"},
-{"vofr-gateway", {NULL}, 21590, "tcp"},
-{"vofr-gateway", {NULL}, 21590, "udp"},
-{"tvpm", {NULL}, 21800, "tcp"},
-{"tvpm", {NULL}, 21800, "udp"},
-{"webphone", {NULL}, 21845, "tcp"},
-{"webphone", {NULL}, 21845, "udp"},
-{"netspeak-is", {NULL}, 21846, "tcp"},
-{"netspeak-is", {NULL}, 21846, "udp"},
-{"netspeak-cs", {NULL}, 21847, "tcp"},
-{"netspeak-cs", {NULL}, 21847, "udp"},
-{"netspeak-acd", {NULL}, 21848, "tcp"},
-{"netspeak-acd", {NULL}, 21848, "udp"},
-{"netspeak-cps", {NULL}, 21849, "tcp"},
-{"netspeak-cps", {NULL}, 21849, "udp"},
-{"snapenetio", {NULL}, 22000, "tcp"},
-{"snapenetio", {NULL}, 22000, "udp"},
-{"optocontrol", {NULL}, 22001, "tcp"},
-{"optocontrol", {NULL}, 22001, "udp"},
-{"optohost002", {NULL}, 22002, "tcp"},
-{"optohost002", {NULL}, 22002, "udp"},
-{"optohost003", {NULL}, 22003, "tcp"},
-{"optohost003", {NULL}, 22003, "udp"},
-{"optohost004", {NULL}, 22004, "tcp"},
-{"optohost004", {NULL}, 22004, "udp"},
-{"optohost004", {NULL}, 22005, "tcp"},
-{"optohost004", {NULL}, 22005, "udp"},
-{"dcap", {NULL}, 22125, "tcp"},
-{"gsidcap", {NULL}, 22128, "tcp"},
-{"wnn6", {NULL}, 22273, "tcp"},
-{"wnn6", {NULL}, 22273, "udp"},
-{"cis", {NULL}, 22305, "tcp"},
-{"cis", {NULL}, 22305, "udp"},
-{"cis-secure", {NULL}, 22343, "tcp"},
-{"cis-secure", {NULL}, 22343, "udp"},
-{"WibuKey", {NULL}, 22347, "tcp"},
-{"WibuKey", {NULL}, 22347, "udp"},
-{"CodeMeter", {NULL}, 22350, "tcp"},
-{"CodeMeter", {NULL}, 22350, "udp"},
-{"vocaltec-wconf", {NULL}, 22555, "tcp"},
-{"vocaltec-phone", {NULL}, 22555, "udp"},
-{"talikaserver", {NULL}, 22763, "tcp"},
-{"talikaserver", {NULL}, 22763, "udp"},
-{"aws-brf", {NULL}, 22800, "tcp"},
-{"aws-brf", {NULL}, 22800, "udp"},
-{"brf-gw", {NULL}, 22951, "tcp"},
-{"brf-gw", {NULL}, 22951, "udp"},
-{"inovaport1", {NULL}, 23000, "tcp"},
-{"inovaport1", {NULL}, 23000, "udp"},
-{"inovaport2", {NULL}, 23001, "tcp"},
-{"inovaport2", {NULL}, 23001, "udp"},
-{"inovaport3", {NULL}, 23002, "tcp"},
-{"inovaport3", {NULL}, 23002, "udp"},
-{"inovaport4", {NULL}, 23003, "tcp"},
-{"inovaport4", {NULL}, 23003, "udp"},
-{"inovaport5", {NULL}, 23004, "tcp"},
-{"inovaport5", {NULL}, 23004, "udp"},
-{"inovaport6", {NULL}, 23005, "tcp"},
-{"inovaport6", {NULL}, 23005, "udp"},
-{"s102", {NULL}, 23272, "udp"},
-{"elxmgmt", {NULL}, 23333, "tcp"},
-{"elxmgmt", {NULL}, 23333, "udp"},
-{"novar-dbase", {NULL}, 23400, "tcp"},
-{"novar-dbase", {NULL}, 23400, "udp"},
-{"novar-alarm", {NULL}, 23401, "tcp"},
-{"novar-alarm", {NULL}, 23401, "udp"},
-{"novar-global", {NULL}, 23402, "tcp"},
-{"novar-global", {NULL}, 23402, "udp"},
-{"aequus", {NULL}, 23456, "tcp"},
-{"aequus-alt", {NULL}, 23457, "tcp"},
-{"med-ltp", {NULL}, 24000, "tcp"},
-{"med-ltp", {NULL}, 24000, "udp"},
-{"med-fsp-rx", {NULL}, 24001, "tcp"},
-{"med-fsp-rx", {NULL}, 24001, "udp"},
-{"med-fsp-tx", {NULL}, 24002, "tcp"},
-{"med-fsp-tx", {NULL}, 24002, "udp"},
-{"med-supp", {NULL}, 24003, "tcp"},
-{"med-supp", {NULL}, 24003, "udp"},
-{"med-ovw", {NULL}, 24004, "tcp"},
-{"med-ovw", {NULL}, 24004, "udp"},
-{"med-ci", {NULL}, 24005, "tcp"},
-{"med-ci", {NULL}, 24005, "udp"},
-{"med-net-svc", {NULL}, 24006, "tcp"},
-{"med-net-svc", {NULL}, 24006, "udp"},
-{"filesphere", {NULL}, 24242, "tcp"},
-{"filesphere", {NULL}, 24242, "udp"},
-{"vista-4gl", {NULL}, 24249, "tcp"},
-{"vista-4gl", {NULL}, 24249, "udp"},
-{"ild", {NULL}, 24321, "tcp"},
-{"ild", {NULL}, 24321, "udp"},
-{"intel_rci", {NULL}, 24386, "tcp"},
-{"intel_rci", {NULL}, 24386, "udp"},
-{"tonidods", {NULL}, 24465, "tcp"},
-{"tonidods", {NULL}, 24465, "udp"},
-{"binkp", {NULL}, 24554, "tcp"},
-{"binkp", {NULL}, 24554, "udp"},
-{"canditv", {NULL}, 24676, "tcp"},
-{"canditv", {NULL}, 24676, "udp"},
-{"flashfiler", {NULL}, 24677, "tcp"},
-{"flashfiler", {NULL}, 24677, "udp"},
-{"proactivate", {NULL}, 24678, "tcp"},
-{"proactivate", {NULL}, 24678, "udp"},
-{"tcc-http", {NULL}, 24680, "tcp"},
-{"tcc-http", {NULL}, 24680, "udp"},
-{"cslg", {NULL}, 24754, "tcp"},
-{"find", {NULL}, 24922, "tcp"},
-{"find", {NULL}, 24922, "udp"},
-{"icl-twobase1", {NULL}, 25000, "tcp"},
-{"icl-twobase1", {NULL}, 25000, "udp"},
-{"icl-twobase2", {NULL}, 25001, "tcp"},
-{"icl-twobase2", {NULL}, 25001, "udp"},
-{"icl-twobase3", {NULL}, 25002, "tcp"},
-{"icl-twobase3", {NULL}, 25002, "udp"},
-{"icl-twobase4", {NULL}, 25003, "tcp"},
-{"icl-twobase4", {NULL}, 25003, "udp"},
-{"icl-twobase5", {NULL}, 25004, "tcp"},
-{"icl-twobase5", {NULL}, 25004, "udp"},
-{"icl-twobase6", {NULL}, 25005, "tcp"},
-{"icl-twobase6", {NULL}, 25005, "udp"},
-{"icl-twobase7", {NULL}, 25006, "tcp"},
-{"icl-twobase7", {NULL}, 25006, "udp"},
-{"icl-twobase8", {NULL}, 25007, "tcp"},
-{"icl-twobase8", {NULL}, 25007, "udp"},
-{"icl-twobase9", {NULL}, 25008, "tcp"},
-{"icl-twobase9", {NULL}, 25008, "udp"},
-{"icl-twobase10", {NULL}, 25009, "tcp"},
-{"icl-twobase10", {NULL}, 25009, "udp"},
-{"rna", {NULL}, 25471, "sctp"},
-{"sauterdongle", {NULL}, 25576, "tcp"},
-{"vocaltec-hos", {NULL}, 25793, "tcp"},
-{"vocaltec-hos", {NULL}, 25793, "udp"},
-{"tasp-net", {NULL}, 25900, "tcp"},
-{"tasp-net", {NULL}, 25900, "udp"},
-{"niobserver", {NULL}, 25901, "tcp"},
-{"niobserver", {NULL}, 25901, "udp"},
-{"nilinkanalyst", {NULL}, 25902, "tcp"},
-{"nilinkanalyst", {NULL}, 25902, "udp"},
-{"niprobe", {NULL}, 25903, "tcp"},
-{"niprobe", {NULL}, 25903, "udp"},
-{"quake", {NULL}, 26000, "tcp"},
-{"quake", {NULL}, 26000, "udp"},
-{"scscp", {NULL}, 26133, "tcp"},
-{"scscp", {NULL}, 26133, "udp"},
-{"wnn6-ds", {NULL}, 26208, "tcp"},
-{"wnn6-ds", {NULL}, 26208, "udp"},
-{"ezproxy", {NULL}, 26260, "tcp"},
-{"ezproxy", {NULL}, 26260, "udp"},
-{"ezmeeting", {NULL}, 26261, "tcp"},
-{"ezmeeting", {NULL}, 26261, "udp"},
-{"k3software-svr", {NULL}, 26262, "tcp"},
-{"k3software-svr", {NULL}, 26262, "udp"},
-{"k3software-cli", {NULL}, 26263, "tcp"},
-{"k3software-cli", {NULL}, 26263, "udp"},
-{"exoline-tcp", {NULL}, 26486, "tcp"},
-{"exoline-udp", {NULL}, 26486, "udp"},
-{"exoconfig", {NULL}, 26487, "tcp"},
-{"exoconfig", {NULL}, 26487, "udp"},
-{"exonet", {NULL}, 26489, "tcp"},
-{"exonet", {NULL}, 26489, "udp"},
-{"imagepump", {NULL}, 27345, "tcp"},
-{"imagepump", {NULL}, 27345, "udp"},
-{"jesmsjc", {NULL}, 27442, "tcp"},
-{"jesmsjc", {NULL}, 27442, "udp"},
-{"kopek-httphead", {NULL}, 27504, "tcp"},
-{"kopek-httphead", {NULL}, 27504, "udp"},
-{"ars-vista", {NULL}, 27782, "tcp"},
-{"ars-vista", {NULL}, 27782, "udp"},
-{"tw-auth-key", {NULL}, 27999, "tcp"},
-{"tw-auth-key", {NULL}, 27999, "udp"},
-{"nxlmd", {NULL}, 28000, "tcp"},
-{"nxlmd", {NULL}, 28000, "udp"},
-{"pqsp", {NULL}, 28001, "tcp"},
-{"siemensgsm", {NULL}, 28240, "tcp"},
-{"siemensgsm", {NULL}, 28240, "udp"},
-{"sgsap", {NULL}, 29118, "sctp"},
-{"otmp", {NULL}, 29167, "tcp"},
-{"otmp", {NULL}, 29167, "udp"},
-{"sbcap", {NULL}, 29168, "sctp"},
-{"iuhsctpassoc", {NULL}, 29169, "sctp"},
-{"pago-services1", {NULL}, 30001, "tcp"},
-{"pago-services1", {NULL}, 30001, "udp"},
-{"pago-services2", {NULL}, 30002, "tcp"},
-{"pago-services2", {NULL}, 30002, "udp"},
-{"kingdomsonline", {NULL}, 30260, "tcp"},
-{"kingdomsonline", {NULL}, 30260, "udp"},
-{"ovobs", {NULL}, 30999, "tcp"},
-{"ovobs", {NULL}, 30999, "udp"},
-{"autotrac-acp", {NULL}, 31020, "tcp"},
-{"yawn", {NULL}, 31029, "udp"},
-{"xqosd", {NULL}, 31416, "tcp"},
-{"xqosd", {NULL}, 31416, "udp"},
-{"tetrinet", {NULL}, 31457, "tcp"},
-{"tetrinet", {NULL}, 31457, "udp"},
-{"lm-mon", {NULL}, 31620, "tcp"},
-{"lm-mon", {NULL}, 31620, "udp"},
-{"dsx_monitor", {NULL}, 31685, "tcp"},
-{"gamesmith-port", {NULL}, 31765, "tcp"},
-{"gamesmith-port", {NULL}, 31765, "udp"},
-{"iceedcp_tx", {NULL}, 31948, "tcp"},
-{"iceedcp_tx", {NULL}, 31948, "udp"},
-{"iceedcp_rx", {NULL}, 31949, "tcp"},
-{"iceedcp_rx", {NULL}, 31949, "udp"},
-{"iracinghelper", {NULL}, 32034, "tcp"},
-{"iracinghelper", {NULL}, 32034, "udp"},
-{"t1distproc60", {NULL}, 32249, "tcp"},
-{"t1distproc60", {NULL}, 32249, "udp"},
-{"apm-link", {NULL}, 32483, "tcp"},
-{"apm-link", {NULL}, 32483, "udp"},
-{"sec-ntb-clnt", {NULL}, 32635, "tcp"},
-{"sec-ntb-clnt", {NULL}, 32635, "udp"},
-{"DMExpress", {NULL}, 32636, "tcp"},
-{"DMExpress", {NULL}, 32636, "udp"},
-{"filenet-powsrm", {NULL}, 32767, "tcp"},
-{"filenet-powsrm", {NULL}, 32767, "udp"},
-{"filenet-tms", {NULL}, 32768, "tcp"},
-{"filenet-tms", {NULL}, 32768, "udp"},
-{"filenet-rpc", {NULL}, 32769, "tcp"},
-{"filenet-rpc", {NULL}, 32769, "udp"},
-{"filenet-nch", {NULL}, 32770, "tcp"},
-{"filenet-nch", {NULL}, 32770, "udp"},
-{"filenet-rmi", {NULL}, 32771, "tcp"},
-{"filenet-rmi", {NULL}, 32771, "udp"},
-{"filenet-pa", {NULL}, 32772, "tcp"},
-{"filenet-pa", {NULL}, 32772, "udp"},
-{"filenet-cm", {NULL}, 32773, "tcp"},
-{"filenet-cm", {NULL}, 32773, "udp"},
-{"filenet-re", {NULL}, 32774, "tcp"},
-{"filenet-re", {NULL}, 32774, "udp"},
-{"filenet-pch", {NULL}, 32775, "tcp"},
-{"filenet-pch", {NULL}, 32775, "udp"},
-{"filenet-peior", {NULL}, 32776, "tcp"},
-{"filenet-peior", {NULL}, 32776, "udp"},
-{"filenet-obrok", {NULL}, 32777, "tcp"},
-{"filenet-obrok", {NULL}, 32777, "udp"},
-{"mlsn", {NULL}, 32801, "tcp"},
-{"mlsn", {NULL}, 32801, "udp"},
-{"retp", {NULL}, 32811, "tcp"},
-{"idmgratm", {NULL}, 32896, "tcp"},
-{"idmgratm", {NULL}, 32896, "udp"},
-{"aurora-balaena", {NULL}, 33123, "tcp"},
-{"aurora-balaena", {NULL}, 33123, "udp"},
-{"diamondport", {NULL}, 33331, "tcp"},
-{"diamondport", {NULL}, 33331, "udp"},
-{"dgi-serv", {NULL}, 33333, "tcp"},
-{"traceroute", {NULL}, 33434, "tcp"},
-{"traceroute", {NULL}, 33434, "udp"},
-{"snip-slave", {NULL}, 33656, "tcp"},
-{"snip-slave", {NULL}, 33656, "udp"},
-{"turbonote-2", {NULL}, 34249, "tcp"},
-{"turbonote-2", {NULL}, 34249, "udp"},
-{"p-net-local", {NULL}, 34378, "tcp"},
-{"p-net-local", {NULL}, 34378, "udp"},
-{"p-net-remote", {NULL}, 34379, "tcp"},
-{"p-net-remote", {NULL}, 34379, "udp"},
-{"dhanalakshmi", {NULL}, 34567, "tcp"},
-{"profinet-rt", {NULL}, 34962, "tcp"},
-{"profinet-rt", {NULL}, 34962, "udp"},
-{"profinet-rtm", {NULL}, 34963, "tcp"},
-{"profinet-rtm", {NULL}, 34963, "udp"},
-{"profinet-cm", {NULL}, 34964, "tcp"},
-{"profinet-cm", {NULL}, 34964, "udp"},
-{"ethercat", {NULL}, 34980, "tcp"},
-{"ethercat", {NULL}, 34980, "udp"},
-{"allpeers", {NULL}, 36001, "tcp"},
-{"allpeers", {NULL}, 36001, "udp"},
-{"s1-control", {NULL}, 36412, "sctp"},
-{"x2-control", {NULL}, 36422, "sctp"},
-{"m2ap", {NULL}, 36443, "sctp"},
-{"m3ap", {NULL}, 36444, "sctp"},
-{"kastenxpipe", {NULL}, 36865, "tcp"},
-{"kastenxpipe", {NULL}, 36865, "udp"},
-{"neckar", {NULL}, 37475, "tcp"},
-{"neckar", {NULL}, 37475, "udp"},
-{"unisys-eportal", {NULL}, 37654, "tcp"},
-{"unisys-eportal", {NULL}, 37654, "udp"},
-{"galaxy7-data", {NULL}, 38201, "tcp"},
-{"galaxy7-data", {NULL}, 38201, "udp"},
-{"fairview", {NULL}, 38202, "tcp"},
-{"fairview", {NULL}, 38202, "udp"},
-{"agpolicy", {NULL}, 38203, "tcp"},
-{"agpolicy", {NULL}, 38203, "udp"},
-{"turbonote-1", {NULL}, 39681, "tcp"},
-{"turbonote-1", {NULL}, 39681, "udp"},
-{"safetynetp", {NULL}, 40000, "tcp"},
-{"safetynetp", {NULL}, 40000, "udp"},
-{"cscp", {NULL}, 40841, "tcp"},
-{"cscp", {NULL}, 40841, "udp"},
-{"csccredir", {NULL}, 40842, "tcp"},
-{"csccredir", {NULL}, 40842, "udp"},
-{"csccfirewall", {NULL}, 40843, "tcp"},
-{"csccfirewall", {NULL}, 40843, "udp"},
-{"ortec-disc", {NULL}, 40853, "udp"},
-{"fs-qos", {NULL}, 41111, "tcp"},
-{"fs-qos", {NULL}, 41111, "udp"},
-{"tentacle", {NULL}, 41121, "tcp"},
-{"crestron-cip", {NULL}, 41794, "tcp"},
-{"crestron-cip", {NULL}, 41794, "udp"},
-{"crestron-ctp", {NULL}, 41795, "tcp"},
-{"crestron-ctp", {NULL}, 41795, "udp"},
-{"candp", {NULL}, 42508, "tcp"},
-{"candp", {NULL}, 42508, "udp"},
-{"candrp", {NULL}, 42509, "tcp"},
-{"candrp", {NULL}, 42509, "udp"},
-{"caerpc", {NULL}, 42510, "tcp"},
-{"caerpc", {NULL}, 42510, "udp"},
-{"reachout", {NULL}, 43188, "tcp"},
-{"reachout", {NULL}, 43188, "udp"},
-{"ndm-agent-port", {NULL}, 43189, "tcp"},
-{"ndm-agent-port", {NULL}, 43189, "udp"},
-{"ip-provision", {NULL}, 43190, "tcp"},
-{"ip-provision", {NULL}, 43190, "udp"},
-{"noit-transport", {NULL}, 43191, "tcp"},
-{"ew-mgmt", {NULL}, 43440, "tcp"},
-{"ew-disc-cmd", {NULL}, 43440, "udp"},
-{"ciscocsdb", {NULL}, 43441, "tcp"},
-{"ciscocsdb", {NULL}, 43441, "udp"},
-{"pmcd", {NULL}, 44321, "tcp"},
-{"pmcd", {NULL}, 44321, "udp"},
-{"pmcdproxy", {NULL}, 44322, "tcp"},
-{"pmcdproxy", {NULL}, 44322, "udp"},
-{"pcp", {NULL}, 44323, "udp"},
-{"rbr-debug", {NULL}, 44553, "tcp"},
-{"rbr-debug", {NULL}, 44553, "udp"},
-{"EtherNet/IP-2", {NULL}, 44818, "tcp"},
-{"EtherNet/IP-2", {NULL}, 44818, "udp"},
-{"invision-ag", {NULL}, 45054, "tcp"},
-{"invision-ag", {NULL}, 45054, "udp"},
-{"eba", {NULL}, 45678, "tcp"},
-{"eba", {NULL}, 45678, "udp"},
-{"qdb2service", {NULL}, 45825, "tcp"},
-{"qdb2service", {NULL}, 45825, "udp"},
-{"ssr-servermgr", {NULL}, 45966, "tcp"},
-{"ssr-servermgr", {NULL}, 45966, "udp"},
-{"mediabox", {NULL}, 46999, "tcp"},
-{"mediabox", {NULL}, 46999, "udp"},
-{"mbus", {NULL}, 47000, "tcp"},
-{"mbus", {NULL}, 47000, "udp"},
-{"winrm", {NULL}, 47001, "tcp"},
-{"dbbrowse", {NULL}, 47557, "tcp"},
-{"dbbrowse", {NULL}, 47557, "udp"},
-{"directplaysrvr", {NULL}, 47624, "tcp"},
-{"directplaysrvr", {NULL}, 47624, "udp"},
-{"ap", {NULL}, 47806, "tcp"},
-{"ap", {NULL}, 47806, "udp"},
-{"bacnet", {NULL}, 47808, "tcp"},
-{"bacnet", {NULL}, 47808, "udp"},
-{"nimcontroller", {NULL}, 48000, "tcp"},
-{"nimcontroller", {NULL}, 48000, "udp"},
-{"nimspooler", {NULL}, 48001, "tcp"},
-{"nimspooler", {NULL}, 48001, "udp"},
-{"nimhub", {NULL}, 48002, "tcp"},
-{"nimhub", {NULL}, 48002, "udp"},
-{"nimgtw", {NULL}, 48003, "tcp"},
-{"nimgtw", {NULL}, 48003, "udp"},
-{"nimbusdb", {NULL}, 48004, "tcp"},
-{"nimbusdbctrl", {NULL}, 48005, "tcp"},
-{"3gpp-cbsp", {NULL}, 48049, "tcp"},
-{"isnetserv", {NULL}, 48128, "tcp"},
-{"isnetserv", {NULL}, 48128, "udp"},
-{"blp5", {NULL}, 48129, "tcp"},
-{"blp5", {NULL}, 48129, "udp"},
-{"com-bardac-dw", {NULL}, 48556, "tcp"},
-{"com-bardac-dw", {NULL}, 48556, "udp"},
-{"iqobject", {NULL}, 48619, "tcp"},
-{"iqobject", {NULL}, 48619, "udp"},
-#endif /* USE_IANA_REGISTERED_PORTS */
-{ NULL, {NULL}, 0, NULL }
+# ifdef USE_IANA_WELL_KNOWN_PORTS
+ {"tcpmux", { NULL }, 1, "tcp" },
+ { "tcpmux", { NULL }, 1, "udp" },
+ { "compressnet", { NULL }, 2, "tcp" },
+ { "compressnet", { NULL }, 2, "udp" },
+ { "compressnet", { NULL }, 3, "tcp" },
+ { "compressnet", { NULL }, 3, "udp" },
+ { "rje", { NULL }, 5, "tcp" },
+ { "rje", { NULL }, 5, "udp" },
+ { "echo", { NULL }, 7, "tcp" },
+ { "echo", { NULL }, 7, "udp" },
+ { "discard", { NULL }, 9, "tcp" },
+ { "discard", { NULL }, 9, "udp" },
+ { "discard", { NULL }, 9, "sctp"},
+ { "discard", { NULL }, 9, "dccp"},
+ { "systat", { NULL }, 11, "tcp" },
+ { "systat", { NULL }, 11, "udp" },
+ { "daytime", { NULL }, 13, "tcp" },
+ { "daytime", { NULL }, 13, "udp" },
+ { "qotd", { NULL }, 17, "tcp" },
+ { "qotd", { NULL }, 17, "udp" },
+ { "msp", { NULL }, 18, "tcp" },
+ { "msp", { NULL }, 18, "udp" },
+ { "chargen", { NULL }, 19, "tcp" },
+ { "chargen", { NULL }, 19, "udp" },
+ { "ftp-data", { NULL }, 20, "tcp" },
+ { "ftp-data", { NULL }, 20, "udp" },
+ { "ftp-data", { NULL }, 20, "sctp"},
+ { "ftp", { NULL }, 21, "tcp" },
+ { "ftp", { NULL }, 21, "udp" },
+ { "ftp", { NULL }, 21, "sctp"},
+ { "ssh", { NULL }, 22, "tcp" },
+ { "ssh", { NULL }, 22, "udp" },
+ { "ssh", { NULL }, 22, "sctp"},
+ { "telnet", { NULL }, 23, "tcp" },
+ { "telnet", { NULL }, 23, "udp" },
+ { "smtp", { NULL }, 25, "tcp" },
+ { "smtp", { NULL }, 25, "udp" },
+ { "nsw-fe", { NULL }, 27, "tcp" },
+ { "nsw-fe", { NULL }, 27, "udp" },
+ { "msg-icp", { NULL }, 29, "tcp" },
+ { "msg-icp", { NULL }, 29, "udp" },
+ { "msg-auth", { NULL }, 31, "tcp" },
+ { "msg-auth", { NULL }, 31, "udp" },
+ { "dsp", { NULL }, 33, "tcp" },
+ { "dsp", { NULL }, 33, "udp" },
+ { "time", { NULL }, 37, "tcp" },
+ { "time", { NULL }, 37, "udp" },
+ { "rap", { NULL }, 38, "tcp" },
+ { "rap", { NULL }, 38, "udp" },
+ { "rlp", { NULL }, 39, "tcp" },
+ { "rlp", { NULL }, 39, "udp" },
+ { "graphics", { NULL }, 41, "tcp" },
+ { "graphics", { NULL }, 41, "udp" },
+ { "name", { NULL }, 42, "tcp" },
+ { "name", { NULL }, 42, "udp" },
+ { "nameserver", { NULL }, 42, "tcp" },
+ { "nameserver", { NULL }, 42, "udp" },
+ { "nicname", { NULL }, 43, "tcp" },
+ { "nicname", { NULL }, 43, "udp" },
+ { "mpm-flags", { NULL }, 44, "tcp" },
+ { "mpm-flags", { NULL }, 44, "udp" },
+ { "mpm", { NULL }, 45, "tcp" },
+ { "mpm", { NULL }, 45, "udp" },
+ { "mpm-snd", { NULL }, 46, "tcp" },
+ { "mpm-snd", { NULL }, 46, "udp" },
+ { "ni-ftp", { NULL }, 47, "tcp" },
+ { "ni-ftp", { NULL }, 47, "udp" },
+ { "auditd", { NULL }, 48, "tcp" },
+ { "auditd", { NULL }, 48, "udp" },
+ { "tacacs", { NULL }, 49, "tcp" },
+ { "tacacs", { NULL }, 49, "udp" },
+ { "re-mail-ck", { NULL }, 50, "tcp" },
+ { "re-mail-ck", { NULL }, 50, "udp" },
+ { "la-maint", { NULL }, 51, "tcp" },
+ { "la-maint", { NULL }, 51, "udp" },
+ { "xns-time", { NULL }, 52, "tcp" },
+ { "xns-time", { NULL }, 52, "udp" },
+ { "domain", { NULL }, 53, "tcp" },
+ { "domain", { NULL }, 53, "udp" },
+ { "xns-ch", { NULL }, 54, "tcp" },
+ { "xns-ch", { NULL }, 54, "udp" },
+ { "isi-gl", { NULL }, 55, "tcp" },
+ { "isi-gl", { NULL }, 55, "udp" },
+ { "xns-auth", { NULL }, 56, "tcp" },
+ { "xns-auth", { NULL }, 56, "udp" },
+ { "xns-mail", { NULL }, 58, "tcp" },
+ { "xns-mail", { NULL }, 58, "udp" },
+ { "ni-mail", { NULL }, 61, "tcp" },
+ { "ni-mail", { NULL }, 61, "udp" },
+ { "acas", { NULL }, 62, "tcp" },
+ { "acas", { NULL }, 62, "udp" },
+ { "whois++", { NULL }, 63, "tcp" },
+ { "whois++", { NULL }, 63, "udp" },
+ { "covia", { NULL }, 64, "tcp" },
+ { "covia", { NULL }, 64, "udp" },
+ { "tacacs-ds", { NULL }, 65, "tcp" },
+ { "tacacs-ds", { NULL }, 65, "udp" },
+ { "sql*net", { NULL }, 66, "tcp" },
+ { "sql*net", { NULL }, 66, "udp" },
+ { "bootps", { NULL }, 67, "tcp" },
+ { "bootps", { NULL }, 67, "udp" },
+ { "bootpc", { NULL }, 68, "tcp" },
+ { "bootpc", { NULL }, 68, "udp" },
+ { "tftp", { NULL }, 69, "tcp" },
+ { "tftp", { NULL }, 69, "udp" },
+ { "gopher", { NULL }, 70, "tcp" },
+ { "gopher", { NULL }, 70, "udp" },
+ { "netrjs-1", { NULL }, 71, "tcp" },
+ { "netrjs-1", { NULL }, 71, "udp" },
+ { "netrjs-2", { NULL }, 72, "tcp" },
+ { "netrjs-2", { NULL }, 72, "udp" },
+ { "netrjs-3", { NULL }, 73, "tcp" },
+ { "netrjs-3", { NULL }, 73, "udp" },
+ { "netrjs-4", { NULL }, 74, "tcp" },
+ { "netrjs-4", { NULL }, 74, "udp" },
+ { "deos", { NULL }, 76, "tcp" },
+ { "deos", { NULL }, 76, "udp" },
+ { "vettcp", { NULL }, 78, "tcp" },
+ { "vettcp", { NULL }, 78, "udp" },
+ { "finger", { NULL }, 79, "tcp" },
+ { "finger", { NULL }, 79, "udp" },
+ { "http", { NULL }, 80, "tcp" },
+ { "http", { NULL }, 80, "udp" },
+ { "www", { NULL }, 80, "tcp" },
+ { "www", { NULL }, 80, "udp" },
+ { "www-http", { NULL }, 80, "tcp" },
+ { "www-http", { NULL }, 80, "udp" },
+ { "http", { NULL }, 80, "sctp"},
+ { "xfer", { NULL }, 82, "tcp" },
+ { "xfer", { NULL }, 82, "udp" },
+ { "mit-ml-dev", { NULL }, 83, "tcp" },
+ { "mit-ml-dev", { NULL }, 83, "udp" },
+ { "ctf", { NULL }, 84, "tcp" },
+ { "ctf", { NULL }, 84, "udp" },
+ { "mit-ml-dev", { NULL }, 85, "tcp" },
+ { "mit-ml-dev", { NULL }, 85, "udp" },
+ { "mfcobol", { NULL }, 86, "tcp" },
+ { "mfcobol", { NULL }, 86, "udp" },
+ { "kerberos", { NULL }, 88, "tcp" },
+ { "kerberos", { NULL }, 88, "udp" },
+ { "su-mit-tg", { NULL }, 89, "tcp" },
+ { "su-mit-tg", { NULL }, 89, "udp" },
+ { "dnsix", { NULL }, 90, "tcp" },
+ { "dnsix", { NULL }, 90, "udp" },
+ { "mit-dov", { NULL }, 91, "tcp" },
+ { "mit-dov", { NULL }, 91, "udp" },
+ { "npp", { NULL }, 92, "tcp" },
+ { "npp", { NULL }, 92, "udp" },
+ { "dcp", { NULL }, 93, "tcp" },
+ { "dcp", { NULL }, 93, "udp" },
+ { "objcall", { NULL }, 94, "tcp" },
+ { "objcall", { NULL }, 94, "udp" },
+ { "supdup", { NULL }, 95, "tcp" },
+ { "supdup", { NULL }, 95, "udp" },
+ { "dixie", { NULL }, 96, "tcp" },
+ { "dixie", { NULL }, 96, "udp" },
+ { "swift-rvf", { NULL }, 97, "tcp" },
+ { "swift-rvf", { NULL }, 97, "udp" },
+ { "tacnews", { NULL }, 98, "tcp" },
+ { "tacnews", { NULL }, 98, "udp" },
+ { "metagram", { NULL }, 99, "tcp" },
+ { "metagram", { NULL }, 99, "udp" },
+ { "newacct", { NULL }, 100, "tcp" },
+ { "hostname", { NULL }, 101, "tcp" },
+ { "hostname", { NULL }, 101, "udp" },
+ { "iso-tsap", { NULL }, 102, "tcp" },
+ { "iso-tsap", { NULL }, 102, "udp" },
+ { "gppitnp", { NULL }, 103, "tcp" },
+ { "gppitnp", { NULL }, 103, "udp" },
+ { "acr-nema", { NULL }, 104, "tcp" },
+ { "acr-nema", { NULL }, 104, "udp" },
+ { "cso", { NULL }, 105, "tcp" },
+ { "cso", { NULL }, 105, "udp" },
+ { "csnet-ns", { NULL }, 105, "tcp" },
+ { "csnet-ns", { NULL }, 105, "udp" },
+ { "3com-tsmux", { NULL }, 106, "tcp" },
+ { "3com-tsmux", { NULL }, 106, "udp" },
+ { "rtelnet", { NULL }, 107, "tcp" },
+ { "rtelnet", { NULL }, 107, "udp" },
+ { "snagas", { NULL }, 108, "tcp" },
+ { "snagas", { NULL }, 108, "udp" },
+ { "pop2", { NULL }, 109, "tcp" },
+ { "pop2", { NULL }, 109, "udp" },
+ { "pop3", { NULL }, 110, "tcp" },
+ { "pop3", { NULL }, 110, "udp" },
+ { "sunrpc", { NULL }, 111, "tcp" },
+ { "sunrpc", { NULL }, 111, "udp" },
+ { "mcidas", { NULL }, 112, "tcp" },
+ { "mcidas", { NULL }, 112, "udp" },
+ { "ident", { NULL }, 113, "tcp" },
+ { "auth", { NULL }, 113, "tcp" },
+ { "auth", { NULL }, 113, "udp" },
+ { "sftp", { NULL }, 115, "tcp" },
+ { "sftp", { NULL }, 115, "udp" },
+ { "ansanotify", { NULL }, 116, "tcp" },
+ { "ansanotify", { NULL }, 116, "udp" },
+ { "uucp-path", { NULL }, 117, "tcp" },
+ { "uucp-path", { NULL }, 117, "udp" },
+ { "sqlserv", { NULL }, 118, "tcp" },
+ { "sqlserv", { NULL }, 118, "udp" },
+ { "nntp", { NULL }, 119, "tcp" },
+ { "nntp", { NULL }, 119, "udp" },
+ { "cfdptkt", { NULL }, 120, "tcp" },
+ { "cfdptkt", { NULL }, 120, "udp" },
+ { "erpc", { NULL }, 121, "tcp" },
+ { "erpc", { NULL }, 121, "udp" },
+ { "smakynet", { NULL }, 122, "tcp" },
+ { "smakynet", { NULL }, 122, "udp" },
+ { "ntp", { NULL }, 123, "tcp" },
+ { "ntp", { NULL }, 123, "udp" },
+ { "ansatrader", { NULL }, 124, "tcp" },
+ { "ansatrader", { NULL }, 124, "udp" },
+ { "locus-map", { NULL }, 125, "tcp" },
+ { "locus-map", { NULL }, 125, "udp" },
+ { "nxedit", { NULL }, 126, "tcp" },
+ { "nxedit", { NULL }, 126, "udp" },
+ { "locus-con", { NULL }, 127, "tcp" },
+ { "locus-con", { NULL }, 127, "udp" },
+ { "gss-xlicen", { NULL }, 128, "tcp" },
+ { "gss-xlicen", { NULL }, 128, "udp" },
+ { "pwdgen", { NULL }, 129, "tcp" },
+ { "pwdgen", { NULL }, 129, "udp" },
+ { "cisco-fna", { NULL }, 130, "tcp" },
+ { "cisco-fna", { NULL }, 130, "udp" },
+ { "cisco-tna", { NULL }, 131, "tcp" },
+ { "cisco-tna", { NULL }, 131, "udp" },
+ { "cisco-sys", { NULL }, 132, "tcp" },
+ { "cisco-sys", { NULL }, 132, "udp" },
+ { "statsrv", { NULL }, 133, "tcp" },
+ { "statsrv", { NULL }, 133, "udp" },
+ { "ingres-net", { NULL }, 134, "tcp" },
+ { "ingres-net", { NULL }, 134, "udp" },
+ { "epmap", { NULL }, 135, "tcp" },
+ { "epmap", { NULL }, 135, "udp" },
+ { "profile", { NULL }, 136, "tcp" },
+ { "profile", { NULL }, 136, "udp" },
+ { "netbios-ns", { NULL }, 137, "tcp" },
+ { "netbios-ns", { NULL }, 137, "udp" },
+ { "netbios-dgm", { NULL }, 138, "tcp" },
+ { "netbios-dgm", { NULL }, 138, "udp" },
+ { "netbios-ssn", { NULL }, 139, "tcp" },
+ { "netbios-ssn", { NULL }, 139, "udp" },
+ { "emfis-data", { NULL }, 140, "tcp" },
+ { "emfis-data", { NULL }, 140, "udp" },
+ { "emfis-cntl", { NULL }, 141, "tcp" },
+ { "emfis-cntl", { NULL }, 141, "udp" },
+ { "bl-idm", { NULL }, 142, "tcp" },
+ { "bl-idm", { NULL }, 142, "udp" },
+ { "imap", { NULL }, 143, "tcp" },
+ { "imap", { NULL }, 143, "udp" },
+ { "uma", { NULL }, 144, "tcp" },
+ { "uma", { NULL }, 144, "udp" },
+ { "uaac", { NULL }, 145, "tcp" },
+ { "uaac", { NULL }, 145, "udp" },
+ { "iso-tp0", { NULL }, 146, "tcp" },
+ { "iso-tp0", { NULL }, 146, "udp" },
+ { "iso-ip", { NULL }, 147, "tcp" },
+ { "iso-ip", { NULL }, 147, "udp" },
+ { "jargon", { NULL }, 148, "tcp" },
+ { "jargon", { NULL }, 148, "udp" },
+ { "aed-512", { NULL }, 149, "tcp" },
+ { "aed-512", { NULL }, 149, "udp" },
+ { "sql-net", { NULL }, 150, "tcp" },
+ { "sql-net", { NULL }, 150, "udp" },
+ { "hems", { NULL }, 151, "tcp" },
+ { "hems", { NULL }, 151, "udp" },
+ { "bftp", { NULL }, 152, "tcp" },
+ { "bftp", { NULL }, 152, "udp" },
+ { "sgmp", { NULL }, 153, "tcp" },
+ { "sgmp", { NULL }, 153, "udp" },
+ { "netsc-prod", { NULL }, 154, "tcp" },
+ { "netsc-prod", { NULL }, 154, "udp" },
+ { "netsc-dev", { NULL }, 155, "tcp" },
+ { "netsc-dev", { NULL }, 155, "udp" },
+ { "sqlsrv", { NULL }, 156, "tcp" },
+ { "sqlsrv", { NULL }, 156, "udp" },
+ { "knet-cmp", { NULL }, 157, "tcp" },
+ { "knet-cmp", { NULL }, 157, "udp" },
+ { "pcmail-srv", { NULL }, 158, "tcp" },
+ { "pcmail-srv", { NULL }, 158, "udp" },
+ { "nss-routing", { NULL }, 159, "tcp" },
+ { "nss-routing", { NULL }, 159, "udp" },
+ { "sgmp-traps", { NULL }, 160, "tcp" },
+ { "sgmp-traps", { NULL }, 160, "udp" },
+ { "snmp", { NULL }, 161, "tcp" },
+ { "snmp", { NULL }, 161, "udp" },
+ { "snmptrap", { NULL }, 162, "tcp" },
+ { "snmptrap", { NULL }, 162, "udp" },
+ { "cmip-man", { NULL }, 163, "tcp" },
+ { "cmip-man", { NULL }, 163, "udp" },
+ { "cmip-agent", { NULL }, 164, "tcp" },
+ { "cmip-agent", { NULL }, 164, "udp" },
+ { "xns-courier", { NULL }, 165, "tcp" },
+ { "xns-courier", { NULL }, 165, "udp" },
+ { "s-net", { NULL }, 166, "tcp" },
+ { "s-net", { NULL }, 166, "udp" },
+ { "namp", { NULL }, 167, "tcp" },
+ { "namp", { NULL }, 167, "udp" },
+ { "rsvd", { NULL }, 168, "tcp" },
+ { "rsvd", { NULL }, 168, "udp" },
+ { "send", { NULL }, 169, "tcp" },
+ { "send", { NULL }, 169, "udp" },
+ { "print-srv", { NULL }, 170, "tcp" },
+ { "print-srv", { NULL }, 170, "udp" },
+ { "multiplex", { NULL }, 171, "tcp" },
+ { "multiplex", { NULL }, 171, "udp" },
+ { "cl/1", { NULL }, 172, "tcp" },
+ { "cl/1", { NULL }, 172, "udp" },
+ { "xyplex-mux", { NULL }, 173, "tcp" },
+ { "xyplex-mux", { NULL }, 173, "udp" },
+ { "mailq", { NULL }, 174, "tcp" },
+ { "mailq", { NULL }, 174, "udp" },
+ { "vmnet", { NULL }, 175, "tcp" },
+ { "vmnet", { NULL }, 175, "udp" },
+ { "genrad-mux", { NULL }, 176, "tcp" },
+ { "genrad-mux", { NULL }, 176, "udp" },
+ { "xdmcp", { NULL }, 177, "tcp" },
+ { "xdmcp", { NULL }, 177, "udp" },
+ { "nextstep", { NULL }, 178, "tcp" },
+ { "nextstep", { NULL }, 178, "udp" },
+ { "bgp", { NULL }, 179, "tcp" },
+ { "bgp", { NULL }, 179, "udp" },
+ { "bgp", { NULL }, 179, "sctp"},
+ { "ris", { NULL }, 180, "tcp" },
+ { "ris", { NULL }, 180, "udp" },
+ { "unify", { NULL }, 181, "tcp" },
+ { "unify", { NULL }, 181, "udp" },
+ { "audit", { NULL }, 182, "tcp" },
+ { "audit", { NULL }, 182, "udp" },
+ { "ocbinder", { NULL }, 183, "tcp" },
+ { "ocbinder", { NULL }, 183, "udp" },
+ { "ocserver", { NULL }, 184, "tcp" },
+ { "ocserver", { NULL }, 184, "udp" },
+ { "remote-kis", { NULL }, 185, "tcp" },
+ { "remote-kis", { NULL }, 185, "udp" },
+ { "kis", { NULL }, 186, "tcp" },
+ { "kis", { NULL }, 186, "udp" },
+ { "aci", { NULL }, 187, "tcp" },
+ { "aci", { NULL }, 187, "udp" },
+ { "mumps", { NULL }, 188, "tcp" },
+ { "mumps", { NULL }, 188, "udp" },
+ { "qft", { NULL }, 189, "tcp" },
+ { "qft", { NULL }, 189, "udp" },
+ { "gacp", { NULL }, 190, "tcp" },
+ { "gacp", { NULL }, 190, "udp" },
+ { "prospero", { NULL }, 191, "tcp" },
+ { "prospero", { NULL }, 191, "udp" },
+ { "osu-nms", { NULL }, 192, "tcp" },
+ { "osu-nms", { NULL }, 192, "udp" },
+ { "srmp", { NULL }, 193, "tcp" },
+ { "srmp", { NULL }, 193, "udp" },
+ { "irc", { NULL }, 194, "tcp" },
+ { "irc", { NULL }, 194, "udp" },
+ { "dn6-nlm-aud", { NULL }, 195, "tcp" },
+ { "dn6-nlm-aud", { NULL }, 195, "udp" },
+ { "dn6-smm-red", { NULL }, 196, "tcp" },
+ { "dn6-smm-red", { NULL }, 196, "udp" },
+ { "dls", { NULL }, 197, "tcp" },
+ { "dls", { NULL }, 197, "udp" },
+ { "dls-mon", { NULL }, 198, "tcp" },
+ { "dls-mon", { NULL }, 198, "udp" },
+ { "smux", { NULL }, 199, "tcp" },
+ { "smux", { NULL }, 199, "udp" },
+ { "src", { NULL }, 200, "tcp" },
+ { "src", { NULL }, 200, "udp" },
+ { "at-rtmp", { NULL }, 201, "tcp" },
+ { "at-rtmp", { NULL }, 201, "udp" },
+ { "at-nbp", { NULL }, 202, "tcp" },
+ { "at-nbp", { NULL }, 202, "udp" },
+ { "at-3", { NULL }, 203, "tcp" },
+ { "at-3", { NULL }, 203, "udp" },
+ { "at-echo", { NULL }, 204, "tcp" },
+ { "at-echo", { NULL }, 204, "udp" },
+ { "at-5", { NULL }, 205, "tcp" },
+ { "at-5", { NULL }, 205, "udp" },
+ { "at-zis", { NULL }, 206, "tcp" },
+ { "at-zis", { NULL }, 206, "udp" },
+ { "at-7", { NULL }, 207, "tcp" },
+ { "at-7", { NULL }, 207, "udp" },
+ { "at-8", { NULL }, 208, "tcp" },
+ { "at-8", { NULL }, 208, "udp" },
+ { "qmtp", { NULL }, 209, "tcp" },
+ { "qmtp", { NULL }, 209, "udp" },
+ { "z39.50", { NULL }, 210, "tcp" },
+ { "z39.50", { NULL }, 210, "udp" },
+ { "914c/g", { NULL }, 211, "tcp" },
+ { "914c/g", { NULL }, 211, "udp" },
+ { "anet", { NULL }, 212, "tcp" },
+ { "anet", { NULL }, 212, "udp" },
+ { "ipx", { NULL }, 213, "tcp" },
+ { "ipx", { NULL }, 213, "udp" },
+ { "vmpwscs", { NULL }, 214, "tcp" },
+ { "vmpwscs", { NULL }, 214, "udp" },
+ { "softpc", { NULL }, 215, "tcp" },
+ { "softpc", { NULL }, 215, "udp" },
+ { "CAIlic", { NULL }, 216, "tcp" },
+ { "CAIlic", { NULL }, 216, "udp" },
+ { "dbase", { NULL }, 217, "tcp" },
+ { "dbase", { NULL }, 217, "udp" },
+ { "mpp", { NULL }, 218, "tcp" },
+ { "mpp", { NULL }, 218, "udp" },
+ { "uarps", { NULL }, 219, "tcp" },
+ { "uarps", { NULL }, 219, "udp" },
+ { "imap3", { NULL }, 220, "tcp" },
+ { "imap3", { NULL }, 220, "udp" },
+ { "fln-spx", { NULL }, 221, "tcp" },
+ { "fln-spx", { NULL }, 221, "udp" },
+ { "rsh-spx", { NULL }, 222, "tcp" },
+ { "rsh-spx", { NULL }, 222, "udp" },
+ { "cdc", { NULL }, 223, "tcp" },
+ { "cdc", { NULL }, 223, "udp" },
+ { "masqdialer", { NULL }, 224, "tcp" },
+ { "masqdialer", { NULL }, 224, "udp" },
+ { "direct", { NULL }, 242, "tcp" },
+ { "direct", { NULL }, 242, "udp" },
+ { "sur-meas", { NULL }, 243, "tcp" },
+ { "sur-meas", { NULL }, 243, "udp" },
+ { "inbusiness", { NULL }, 244, "tcp" },
+ { "inbusiness", { NULL }, 244, "udp" },
+ { "link", { NULL }, 245, "tcp" },
+ { "link", { NULL }, 245, "udp" },
+ { "dsp3270", { NULL }, 246, "tcp" },
+ { "dsp3270", { NULL }, 246, "udp" },
+ { "subntbcst_tftp", { NULL }, 247, "tcp" },
+ { "subntbcst_tftp", { NULL }, 247, "udp" },
+ { "bhfhs", { NULL }, 248, "tcp" },
+ { "bhfhs", { NULL }, 248, "udp" },
+ { "rap", { NULL }, 256, "tcp" },
+ { "rap", { NULL }, 256, "udp" },
+ { "set", { NULL }, 257, "tcp" },
+ { "set", { NULL }, 257, "udp" },
+ { "esro-gen", { NULL }, 259, "tcp" },
+ { "esro-gen", { NULL }, 259, "udp" },
+ { "openport", { NULL }, 260, "tcp" },
+ { "openport", { NULL }, 260, "udp" },
+ { "nsiiops", { NULL }, 261, "tcp" },
+ { "nsiiops", { NULL }, 261, "udp" },
+ { "arcisdms", { NULL }, 262, "tcp" },
+ { "arcisdms", { NULL }, 262, "udp" },
+ { "hdap", { NULL }, 263, "tcp" },
+ { "hdap", { NULL }, 263, "udp" },
+ { "bgmp", { NULL }, 264, "tcp" },
+ { "bgmp", { NULL }, 264, "udp" },
+ { "x-bone-ctl", { NULL }, 265, "tcp" },
+ { "x-bone-ctl", { NULL }, 265, "udp" },
+ { "sst", { NULL }, 266, "tcp" },
+ { "sst", { NULL }, 266, "udp" },
+ { "td-service", { NULL }, 267, "tcp" },
+ { "td-service", { NULL }, 267, "udp" },
+ { "td-replica", { NULL }, 268, "tcp" },
+ { "td-replica", { NULL }, 268, "udp" },
+ { "manet", { NULL }, 269, "tcp" },
+ { "manet", { NULL }, 269, "udp" },
+ { "gist", { NULL }, 270, "udp" },
+ { "http-mgmt", { NULL }, 280, "tcp" },
+ { "http-mgmt", { NULL }, 280, "udp" },
+ { "personal-link", { NULL }, 281, "tcp" },
+ { "personal-link", { NULL }, 281, "udp" },
+ { "cableport-ax", { NULL }, 282, "tcp" },
+ { "cableport-ax", { NULL }, 282, "udp" },
+ { "rescap", { NULL }, 283, "tcp" },
+ { "rescap", { NULL }, 283, "udp" },
+ { "corerjd", { NULL }, 284, "tcp" },
+ { "corerjd", { NULL }, 284, "udp" },
+ { "fxp", { NULL }, 286, "tcp" },
+ { "fxp", { NULL }, 286, "udp" },
+ { "k-block", { NULL }, 287, "tcp" },
+ { "k-block", { NULL }, 287, "udp" },
+ { "novastorbakcup", { NULL }, 308, "tcp" },
+ { "novastorbakcup", { NULL }, 308, "udp" },
+ { "entrusttime", { NULL }, 309, "tcp" },
+ { "entrusttime", { NULL }, 309, "udp" },
+ { "bhmds", { NULL }, 310, "tcp" },
+ { "bhmds", { NULL }, 310, "udp" },
+ { "asip-webadmin", { NULL }, 311, "tcp" },
+ { "asip-webadmin", { NULL }, 311, "udp" },
+ { "vslmp", { NULL }, 312, "tcp" },
+ { "vslmp", { NULL }, 312, "udp" },
+ { "magenta-logic", { NULL }, 313, "tcp" },
+ { "magenta-logic", { NULL }, 313, "udp" },
+ { "opalis-robot", { NULL }, 314, "tcp" },
+ { "opalis-robot", { NULL }, 314, "udp" },
+ { "dpsi", { NULL }, 315, "tcp" },
+ { "dpsi", { NULL }, 315, "udp" },
+ { "decauth", { NULL }, 316, "tcp" },
+ { "decauth", { NULL }, 316, "udp" },
+ { "zannet", { NULL }, 317, "tcp" },
+ { "zannet", { NULL }, 317, "udp" },
+ { "pkix-timestamp", { NULL }, 318, "tcp" },
+ { "pkix-timestamp", { NULL }, 318, "udp" },
+ { "ptp-event", { NULL }, 319, "tcp" },
+ { "ptp-event", { NULL }, 319, "udp" },
+ { "ptp-general", { NULL }, 320, "tcp" },
+ { "ptp-general", { NULL }, 320, "udp" },
+ { "pip", { NULL }, 321, "tcp" },
+ { "pip", { NULL }, 321, "udp" },
+ { "rtsps", { NULL }, 322, "tcp" },
+ { "rtsps", { NULL }, 322, "udp" },
+ { "texar", { NULL }, 333, "tcp" },
+ { "texar", { NULL }, 333, "udp" },
+ { "pdap", { NULL }, 344, "tcp" },
+ { "pdap", { NULL }, 344, "udp" },
+ { "pawserv", { NULL }, 345, "tcp" },
+ { "pawserv", { NULL }, 345, "udp" },
+ { "zserv", { NULL }, 346, "tcp" },
+ { "zserv", { NULL }, 346, "udp" },
+ { "fatserv", { NULL }, 347, "tcp" },
+ { "fatserv", { NULL }, 347, "udp" },
+ { "csi-sgwp", { NULL }, 348, "tcp" },
+ { "csi-sgwp", { NULL }, 348, "udp" },
+ { "mftp", { NULL }, 349, "tcp" },
+ { "mftp", { NULL }, 349, "udp" },
+ { "matip-type-a", { NULL }, 350, "tcp" },
+ { "matip-type-a", { NULL }, 350, "udp" },
+ { "matip-type-b", { NULL }, 351, "tcp" },
+ { "matip-type-b", { NULL }, 351, "udp" },
+ { "bhoetty", { NULL }, 351, "tcp" },
+ { "bhoetty", { NULL }, 351, "udp" },
+ { "dtag-ste-sb", { NULL }, 352, "tcp" },
+ { "dtag-ste-sb", { NULL }, 352, "udp" },
+ { "bhoedap4", { NULL }, 352, "tcp" },
+ { "bhoedap4", { NULL }, 352, "udp" },
+ { "ndsauth", { NULL }, 353, "tcp" },
+ { "ndsauth", { NULL }, 353, "udp" },
+ { "bh611", { NULL }, 354, "tcp" },
+ { "bh611", { NULL }, 354, "udp" },
+ { "datex-asn", { NULL }, 355, "tcp" },
+ { "datex-asn", { NULL }, 355, "udp" },
+ { "cloanto-net-1", { NULL }, 356, "tcp" },
+ { "cloanto-net-1", { NULL }, 356, "udp" },
+ { "bhevent", { NULL }, 357, "tcp" },
+ { "bhevent", { NULL }, 357, "udp" },
+ { "shrinkwrap", { NULL }, 358, "tcp" },
+ { "shrinkwrap", { NULL }, 358, "udp" },
+ { "nsrmp", { NULL }, 359, "tcp" },
+ { "nsrmp", { NULL }, 359, "udp" },
+ { "scoi2odialog", { NULL }, 360, "tcp" },
+ { "scoi2odialog", { NULL }, 360, "udp" },
+ { "semantix", { NULL }, 361, "tcp" },
+ { "semantix", { NULL }, 361, "udp" },
+ { "srssend", { NULL }, 362, "tcp" },
+ { "srssend", { NULL }, 362, "udp" },
+ { "rsvp_tunnel", { NULL }, 363, "tcp" },
+ { "rsvp_tunnel", { NULL }, 363, "udp" },
+ { "aurora-cmgr", { NULL }, 364, "tcp" },
+ { "aurora-cmgr", { NULL }, 364, "udp" },
+ { "dtk", { NULL }, 365, "tcp" },
+ { "dtk", { NULL }, 365, "udp" },
+ { "odmr", { NULL }, 366, "tcp" },
+ { "odmr", { NULL }, 366, "udp" },
+ { "mortgageware", { NULL }, 367, "tcp" },
+ { "mortgageware", { NULL }, 367, "udp" },
+ { "qbikgdp", { NULL }, 368, "tcp" },
+ { "qbikgdp", { NULL }, 368, "udp" },
+ { "rpc2portmap", { NULL }, 369, "tcp" },
+ { "rpc2portmap", { NULL }, 369, "udp" },
+ { "codaauth2", { NULL }, 370, "tcp" },
+ { "codaauth2", { NULL }, 370, "udp" },
+ { "clearcase", { NULL }, 371, "tcp" },
+ { "clearcase", { NULL }, 371, "udp" },
+ { "ulistproc", { NULL }, 372, "tcp" },
+ { "ulistproc", { NULL }, 372, "udp" },
+ { "legent-1", { NULL }, 373, "tcp" },
+ { "legent-1", { NULL }, 373, "udp" },
+ { "legent-2", { NULL }, 374, "tcp" },
+ { "legent-2", { NULL }, 374, "udp" },
+ { "hassle", { NULL }, 375, "tcp" },
+ { "hassle", { NULL }, 375, "udp" },
+ { "nip", { NULL }, 376, "tcp" },
+ { "nip", { NULL }, 376, "udp" },
+ { "tnETOS", { NULL }, 377, "tcp" },
+ { "tnETOS", { NULL }, 377, "udp" },
+ { "dsETOS", { NULL }, 378, "tcp" },
+ { "dsETOS", { NULL }, 378, "udp" },
+ { "is99c", { NULL }, 379, "tcp" },
+ { "is99c", { NULL }, 379, "udp" },
+ { "is99s", { NULL }, 380, "tcp" },
+ { "is99s", { NULL }, 380, "udp" },
+ { "hp-collector", { NULL }, 381, "tcp" },
+ { "hp-collector", { NULL }, 381, "udp" },
+ { "hp-managed-node", { NULL }, 382, "tcp" },
+ { "hp-managed-node", { NULL }, 382, "udp" },
+ { "hp-alarm-mgr", { NULL }, 383, "tcp" },
+ { "hp-alarm-mgr", { NULL }, 383, "udp" },
+ { "arns", { NULL }, 384, "tcp" },
+ { "arns", { NULL }, 384, "udp" },
+ { "ibm-app", { NULL }, 385, "tcp" },
+ { "ibm-app", { NULL }, 385, "udp" },
+ { "asa", { NULL }, 386, "tcp" },
+ { "asa", { NULL }, 386, "udp" },
+ { "aurp", { NULL }, 387, "tcp" },
+ { "aurp", { NULL }, 387, "udp" },
+ { "unidata-ldm", { NULL }, 388, "tcp" },
+ { "unidata-ldm", { NULL }, 388, "udp" },
+ { "ldap", { NULL }, 389, "tcp" },
+ { "ldap", { NULL }, 389, "udp" },
+ { "uis", { NULL }, 390, "tcp" },
+ { "uis", { NULL }, 390, "udp" },
+ { "synotics-relay", { NULL }, 391, "tcp" },
+ { "synotics-relay", { NULL }, 391, "udp" },
+ { "synotics-broker", { NULL }, 392, "tcp" },
+ { "synotics-broker", { NULL }, 392, "udp" },
+ { "meta5", { NULL }, 393, "tcp" },
+ { "meta5", { NULL }, 393, "udp" },
+ { "embl-ndt", { NULL }, 394, "tcp" },
+ { "embl-ndt", { NULL }, 394, "udp" },
+ { "netcp", { NULL }, 395, "tcp" },
+ { "netcp", { NULL }, 395, "udp" },
+ { "netware-ip", { NULL }, 396, "tcp" },
+ { "netware-ip", { NULL }, 396, "udp" },
+ { "mptn", { NULL }, 397, "tcp" },
+ { "mptn", { NULL }, 397, "udp" },
+ { "kryptolan", { NULL }, 398, "tcp" },
+ { "kryptolan", { NULL }, 398, "udp" },
+ { "iso-tsap-c2", { NULL }, 399, "tcp" },
+ { "iso-tsap-c2", { NULL }, 399, "udp" },
+ { "osb-sd", { NULL }, 400, "tcp" },
+ { "osb-sd", { NULL }, 400, "udp" },
+ { "ups", { NULL }, 401, "tcp" },
+ { "ups", { NULL }, 401, "udp" },
+ { "genie", { NULL }, 402, "tcp" },
+ { "genie", { NULL }, 402, "udp" },
+ { "decap", { NULL }, 403, "tcp" },
+ { "decap", { NULL }, 403, "udp" },
+ { "nced", { NULL }, 404, "tcp" },
+ { "nced", { NULL }, 404, "udp" },
+ { "ncld", { NULL }, 405, "tcp" },
+ { "ncld", { NULL }, 405, "udp" },
+ { "imsp", { NULL }, 406, "tcp" },
+ { "imsp", { NULL }, 406, "udp" },
+ { "timbuktu", { NULL }, 407, "tcp" },
+ { "timbuktu", { NULL }, 407, "udp" },
+ { "prm-sm", { NULL }, 408, "tcp" },
+ { "prm-sm", { NULL }, 408, "udp" },
+ { "prm-nm", { NULL }, 409, "tcp" },
+ { "prm-nm", { NULL }, 409, "udp" },
+ { "decladebug", { NULL }, 410, "tcp" },
+ { "decladebug", { NULL }, 410, "udp" },
+ { "rmt", { NULL }, 411, "tcp" },
+ { "rmt", { NULL }, 411, "udp" },
+ { "synoptics-trap", { NULL }, 412, "tcp" },
+ { "synoptics-trap", { NULL }, 412, "udp" },
+ { "smsp", { NULL }, 413, "tcp" },
+ { "smsp", { NULL }, 413, "udp" },
+ { "infoseek", { NULL }, 414, "tcp" },
+ { "infoseek", { NULL }, 414, "udp" },
+ { "bnet", { NULL }, 415, "tcp" },
+ { "bnet", { NULL }, 415, "udp" },
+ { "silverplatter", { NULL }, 416, "tcp" },
+ { "silverplatter", { NULL }, 416, "udp" },
+ { "onmux", { NULL }, 417, "tcp" },
+ { "onmux", { NULL }, 417, "udp" },
+ { "hyper-g", { NULL }, 418, "tcp" },
+ { "hyper-g", { NULL }, 418, "udp" },
+ { "ariel1", { NULL }, 419, "tcp" },
+ { "ariel1", { NULL }, 419, "udp" },
+ { "smpte", { NULL }, 420, "tcp" },
+ { "smpte", { NULL }, 420, "udp" },
+ { "ariel2", { NULL }, 421, "tcp" },
+ { "ariel2", { NULL }, 421, "udp" },
+ { "ariel3", { NULL }, 422, "tcp" },
+ { "ariel3", { NULL }, 422, "udp" },
+ { "opc-job-start", { NULL }, 423, "tcp" },
+ { "opc-job-start", { NULL }, 423, "udp" },
+ { "opc-job-track", { NULL }, 424, "tcp" },
+ { "opc-job-track", { NULL }, 424, "udp" },
+ { "icad-el", { NULL }, 425, "tcp" },
+ { "icad-el", { NULL }, 425, "udp" },
+ { "smartsdp", { NULL }, 426, "tcp" },
+ { "smartsdp", { NULL }, 426, "udp" },
+ { "svrloc", { NULL }, 427, "tcp" },
+ { "svrloc", { NULL }, 427, "udp" },
+ { "ocs_cmu", { NULL }, 428, "tcp" },
+ { "ocs_cmu", { NULL }, 428, "udp" },
+ { "ocs_amu", { NULL }, 429, "tcp" },
+ { "ocs_amu", { NULL }, 429, "udp" },
+ { "utmpsd", { NULL }, 430, "tcp" },
+ { "utmpsd", { NULL }, 430, "udp" },
+ { "utmpcd", { NULL }, 431, "tcp" },
+ { "utmpcd", { NULL }, 431, "udp" },
+ { "iasd", { NULL }, 432, "tcp" },
+ { "iasd", { NULL }, 432, "udp" },
+ { "nnsp", { NULL }, 433, "tcp" },
+ { "nnsp", { NULL }, 433, "udp" },
+ { "mobileip-agent", { NULL }, 434, "tcp" },
+ { "mobileip-agent", { NULL }, 434, "udp" },
+ { "mobilip-mn", { NULL }, 435, "tcp" },
+ { "mobilip-mn", { NULL }, 435, "udp" },
+ { "dna-cml", { NULL }, 436, "tcp" },
+ { "dna-cml", { NULL }, 436, "udp" },
+ { "comscm", { NULL }, 437, "tcp" },
+ { "comscm", { NULL }, 437, "udp" },
+ { "dsfgw", { NULL }, 438, "tcp" },
+ { "dsfgw", { NULL }, 438, "udp" },
+ { "dasp", { NULL }, 439, "tcp" },
+ { "dasp", { NULL }, 439, "udp" },
+ { "sgcp", { NULL }, 440, "tcp" },
+ { "sgcp", { NULL }, 440, "udp" },
+ { "decvms-sysmgt", { NULL }, 441, "tcp" },
+ { "decvms-sysmgt", { NULL }, 441, "udp" },
+ { "cvc_hostd", { NULL }, 442, "tcp" },
+ { "cvc_hostd", { NULL }, 442, "udp" },
+ { "https", { NULL }, 443, "tcp" },
+ { "https", { NULL }, 443, "udp" },
+ { "https", { NULL }, 443, "sctp"},
+ { "snpp", { NULL }, 444, "tcp" },
+ { "snpp", { NULL }, 444, "udp" },
+ { "microsoft-ds", { NULL }, 445, "tcp" },
+ { "microsoft-ds", { NULL }, 445, "udp" },
+ { "ddm-rdb", { NULL }, 446, "tcp" },
+ { "ddm-rdb", { NULL }, 446, "udp" },
+ { "ddm-dfm", { NULL }, 447, "tcp" },
+ { "ddm-dfm", { NULL }, 447, "udp" },
+ { "ddm-ssl", { NULL }, 448, "tcp" },
+ { "ddm-ssl", { NULL }, 448, "udp" },
+ { "as-servermap", { NULL }, 449, "tcp" },
+ { "as-servermap", { NULL }, 449, "udp" },
+ { "tserver", { NULL }, 450, "tcp" },
+ { "tserver", { NULL }, 450, "udp" },
+ { "sfs-smp-net", { NULL }, 451, "tcp" },
+ { "sfs-smp-net", { NULL }, 451, "udp" },
+ { "sfs-config", { NULL }, 452, "tcp" },
+ { "sfs-config", { NULL }, 452, "udp" },
+ { "creativeserver", { NULL }, 453, "tcp" },
+ { "creativeserver", { NULL }, 453, "udp" },
+ { "contentserver", { NULL }, 454, "tcp" },
+ { "contentserver", { NULL }, 454, "udp" },
+ { "creativepartnr", { NULL }, 455, "tcp" },
+ { "creativepartnr", { NULL }, 455, "udp" },
+ { "macon-tcp", { NULL }, 456, "tcp" },
+ { "macon-udp", { NULL }, 456, "udp" },
+ { "scohelp", { NULL }, 457, "tcp" },
+ { "scohelp", { NULL }, 457, "udp" },
+ { "appleqtc", { NULL }, 458, "tcp" },
+ { "appleqtc", { NULL }, 458, "udp" },
+ { "ampr-rcmd", { NULL }, 459, "tcp" },
+ { "ampr-rcmd", { NULL }, 459, "udp" },
+ { "skronk", { NULL }, 460, "tcp" },
+ { "skronk", { NULL }, 460, "udp" },
+ { "datasurfsrv", { NULL }, 461, "tcp" },
+ { "datasurfsrv", { NULL }, 461, "udp" },
+ { "datasurfsrvsec", { NULL }, 462, "tcp" },
+ { "datasurfsrvsec", { NULL }, 462, "udp" },
+ { "alpes", { NULL }, 463, "tcp" },
+ { "alpes", { NULL }, 463, "udp" },
+ { "kpasswd", { NULL }, 464, "tcp" },
+ { "kpasswd", { NULL }, 464, "udp" },
+ { "urd", { NULL }, 465, "tcp" },
+ { "igmpv3lite", { NULL }, 465, "udp" },
+ { "digital-vrc", { NULL }, 466, "tcp" },
+ { "digital-vrc", { NULL }, 466, "udp" },
+ { "mylex-mapd", { NULL }, 467, "tcp" },
+ { "mylex-mapd", { NULL }, 467, "udp" },
+ { "photuris", { NULL }, 468, "tcp" },
+ { "photuris", { NULL }, 468, "udp" },
+ { "rcp", { NULL }, 469, "tcp" },
+ { "rcp", { NULL }, 469, "udp" },
+ { "scx-proxy", { NULL }, 470, "tcp" },
+ { "scx-proxy", { NULL }, 470, "udp" },
+ { "mondex", { NULL }, 471, "tcp" },
+ { "mondex", { NULL }, 471, "udp" },
+ { "ljk-login", { NULL }, 472, "tcp" },
+ { "ljk-login", { NULL }, 472, "udp" },
+ { "hybrid-pop", { NULL }, 473, "tcp" },
+ { "hybrid-pop", { NULL }, 473, "udp" },
+ { "tn-tl-w1", { NULL }, 474, "tcp" },
+ { "tn-tl-w2", { NULL }, 474, "udp" },
+ { "tcpnethaspsrv", { NULL }, 475, "tcp" },
+ { "tcpnethaspsrv", { NULL }, 475, "udp" },
+ { "tn-tl-fd1", { NULL }, 476, "tcp" },
+ { "tn-tl-fd1", { NULL }, 476, "udp" },
+ { "ss7ns", { NULL }, 477, "tcp" },
+ { "ss7ns", { NULL }, 477, "udp" },
+ { "spsc", { NULL }, 478, "tcp" },
+ { "spsc", { NULL }, 478, "udp" },
+ { "iafserver", { NULL }, 479, "tcp" },
+ { "iafserver", { NULL }, 479, "udp" },
+ { "iafdbase", { NULL }, 480, "tcp" },
+ { "iafdbase", { NULL }, 480, "udp" },
+ { "ph", { NULL }, 481, "tcp" },
+ { "ph", { NULL }, 481, "udp" },
+ { "bgs-nsi", { NULL }, 482, "tcp" },
+ { "bgs-nsi", { NULL }, 482, "udp" },
+ { "ulpnet", { NULL }, 483, "tcp" },
+ { "ulpnet", { NULL }, 483, "udp" },
+ { "integra-sme", { NULL }, 484, "tcp" },
+ { "integra-sme", { NULL }, 484, "udp" },
+ { "powerburst", { NULL }, 485, "tcp" },
+ { "powerburst", { NULL }, 485, "udp" },
+ { "avian", { NULL }, 486, "tcp" },
+ { "avian", { NULL }, 486, "udp" },
+ { "saft", { NULL }, 487, "tcp" },
+ { "saft", { NULL }, 487, "udp" },
+ { "gss-http", { NULL }, 488, "tcp" },
+ { "gss-http", { NULL }, 488, "udp" },
+ { "nest-protocol", { NULL }, 489, "tcp" },
+ { "nest-protocol", { NULL }, 489, "udp" },
+ { "micom-pfs", { NULL }, 490, "tcp" },
+ { "micom-pfs", { NULL }, 490, "udp" },
+ { "go-login", { NULL }, 491, "tcp" },
+ { "go-login", { NULL }, 491, "udp" },
+ { "ticf-1", { NULL }, 492, "tcp" },
+ { "ticf-1", { NULL }, 492, "udp" },
+ { "ticf-2", { NULL }, 493, "tcp" },
+ { "ticf-2", { NULL }, 493, "udp" },
+ { "pov-ray", { NULL }, 494, "tcp" },
+ { "pov-ray", { NULL }, 494, "udp" },
+ { "intecourier", { NULL }, 495, "tcp" },
+ { "intecourier", { NULL }, 495, "udp" },
+ { "pim-rp-disc", { NULL }, 496, "tcp" },
+ { "pim-rp-disc", { NULL }, 496, "udp" },
+ { "dantz", { NULL }, 497, "tcp" },
+ { "dantz", { NULL }, 497, "udp" },
+ { "siam", { NULL }, 498, "tcp" },
+ { "siam", { NULL }, 498, "udp" },
+ { "iso-ill", { NULL }, 499, "tcp" },
+ { "iso-ill", { NULL }, 499, "udp" },
+ { "isakmp", { NULL }, 500, "tcp" },
+ { "isakmp", { NULL }, 500, "udp" },
+ { "stmf", { NULL }, 501, "tcp" },
+ { "stmf", { NULL }, 501, "udp" },
+ { "asa-appl-proto", { NULL }, 502, "tcp" },
+ { "asa-appl-proto", { NULL }, 502, "udp" },
+ { "intrinsa", { NULL }, 503, "tcp" },
+ { "intrinsa", { NULL }, 503, "udp" },
+ { "citadel", { NULL }, 504, "tcp" },
+ { "citadel", { NULL }, 504, "udp" },
+ { "mailbox-lm", { NULL }, 505, "tcp" },
+ { "mailbox-lm", { NULL }, 505, "udp" },
+ { "ohimsrv", { NULL }, 506, "tcp" },
+ { "ohimsrv", { NULL }, 506, "udp" },
+ { "crs", { NULL }, 507, "tcp" },
+ { "crs", { NULL }, 507, "udp" },
+ { "xvttp", { NULL }, 508, "tcp" },
+ { "xvttp", { NULL }, 508, "udp" },
+ { "snare", { NULL }, 509, "tcp" },
+ { "snare", { NULL }, 509, "udp" },
+ { "fcp", { NULL }, 510, "tcp" },
+ { "fcp", { NULL }, 510, "udp" },
+ { "passgo", { NULL }, 511, "tcp" },
+ { "passgo", { NULL }, 511, "udp" },
+ { "exec", { NULL }, 512, "tcp" },
+ { "comsat", { NULL }, 512, "udp" },
+ { "biff", { NULL }, 512, "udp" },
+ { "login", { NULL }, 513, "tcp" },
+ { "who", { NULL }, 513, "udp" },
+ { "shell", { NULL }, 514, "tcp" },
+ { "syslog", { NULL }, 514, "udp" },
+ { "printer", { NULL }, 515, "tcp" },
+ { "printer", { NULL }, 515, "udp" },
+ { "videotex", { NULL }, 516, "tcp" },
+ { "videotex", { NULL }, 516, "udp" },
+ { "talk", { NULL }, 517, "tcp" },
+ { "talk", { NULL }, 517, "udp" },
+ { "ntalk", { NULL }, 518, "tcp" },
+ { "ntalk", { NULL }, 518, "udp" },
+ { "utime", { NULL }, 519, "tcp" },
+ { "utime", { NULL }, 519, "udp" },
+ { "efs", { NULL }, 520, "tcp" },
+ { "router", { NULL }, 520, "udp" },
+ { "ripng", { NULL }, 521, "tcp" },
+ { "ripng", { NULL }, 521, "udp" },
+ { "ulp", { NULL }, 522, "tcp" },
+ { "ulp", { NULL }, 522, "udp" },
+ { "ibm-db2", { NULL }, 523, "tcp" },
+ { "ibm-db2", { NULL }, 523, "udp" },
+ { "ncp", { NULL }, 524, "tcp" },
+ { "ncp", { NULL }, 524, "udp" },
+ { "timed", { NULL }, 525, "tcp" },
+ { "timed", { NULL }, 525, "udp" },
+ { "tempo", { NULL }, 526, "tcp" },
+ { "tempo", { NULL }, 526, "udp" },
+ { "stx", { NULL }, 527, "tcp" },
+ { "stx", { NULL }, 527, "udp" },
+ { "custix", { NULL }, 528, "tcp" },
+ { "custix", { NULL }, 528, "udp" },
+ { "irc-serv", { NULL }, 529, "tcp" },
+ { "irc-serv", { NULL }, 529, "udp" },
+ { "courier", { NULL }, 530, "tcp" },
+ { "courier", { NULL }, 530, "udp" },
+ { "conference", { NULL }, 531, "tcp" },
+ { "conference", { NULL }, 531, "udp" },
+ { "netnews", { NULL }, 532, "tcp" },
+ { "netnews", { NULL }, 532, "udp" },
+ { "netwall", { NULL }, 533, "tcp" },
+ { "netwall", { NULL }, 533, "udp" },
+ { "windream", { NULL }, 534, "tcp" },
+ { "windream", { NULL }, 534, "udp" },
+ { "iiop", { NULL }, 535, "tcp" },
+ { "iiop", { NULL }, 535, "udp" },
+ { "opalis-rdv", { NULL }, 536, "tcp" },
+ { "opalis-rdv", { NULL }, 536, "udp" },
+ { "nmsp", { NULL }, 537, "tcp" },
+ { "nmsp", { NULL }, 537, "udp" },
+ { "gdomap", { NULL }, 538, "tcp" },
+ { "gdomap", { NULL }, 538, "udp" },
+ { "apertus-ldp", { NULL }, 539, "tcp" },
+ { "apertus-ldp", { NULL }, 539, "udp" },
+ { "uucp", { NULL }, 540, "tcp" },
+ { "uucp", { NULL }, 540, "udp" },
+ { "uucp-rlogin", { NULL }, 541, "tcp" },
+ { "uucp-rlogin", { NULL }, 541, "udp" },
+ { "commerce", { NULL }, 542, "tcp" },
+ { "commerce", { NULL }, 542, "udp" },
+ { "klogin", { NULL }, 543, "tcp" },
+ { "klogin", { NULL }, 543, "udp" },
+ { "kshell", { NULL }, 544, "tcp" },
+ { "kshell", { NULL }, 544, "udp" },
+ { "appleqtcsrvr", { NULL }, 545, "tcp" },
+ { "appleqtcsrvr", { NULL }, 545, "udp" },
+ { "dhcpv6-client", { NULL }, 546, "tcp" },
+ { "dhcpv6-client", { NULL }, 546, "udp" },
+ { "dhcpv6-server", { NULL }, 547, "tcp" },
+ { "dhcpv6-server", { NULL }, 547, "udp" },
+ { "afpovertcp", { NULL }, 548, "tcp" },
+ { "afpovertcp", { NULL }, 548, "udp" },
+ { "idfp", { NULL }, 549, "tcp" },
+ { "idfp", { NULL }, 549, "udp" },
+ { "new-rwho", { NULL }, 550, "tcp" },
+ { "new-rwho", { NULL }, 550, "udp" },
+ { "cybercash", { NULL }, 551, "tcp" },
+ { "cybercash", { NULL }, 551, "udp" },
+ { "devshr-nts", { NULL }, 552, "tcp" },
+ { "devshr-nts", { NULL }, 552, "udp" },
+ { "pirp", { NULL }, 553, "tcp" },
+ { "pirp", { NULL }, 553, "udp" },
+ { "rtsp", { NULL }, 554, "tcp" },
+ { "rtsp", { NULL }, 554, "udp" },
+ { "dsf", { NULL }, 555, "tcp" },
+ { "dsf", { NULL }, 555, "udp" },
+ { "remotefs", { NULL }, 556, "tcp" },
+ { "remotefs", { NULL }, 556, "udp" },
+ { "openvms-sysipc", { NULL }, 557, "tcp" },
+ { "openvms-sysipc", { NULL }, 557, "udp" },
+ { "sdnskmp", { NULL }, 558, "tcp" },
+ { "sdnskmp", { NULL }, 558, "udp" },
+ { "teedtap", { NULL }, 559, "tcp" },
+ { "teedtap", { NULL }, 559, "udp" },
+ { "rmonitor", { NULL }, 560, "tcp" },
+ { "rmonitor", { NULL }, 560, "udp" },
+ { "monitor", { NULL }, 561, "tcp" },
+ { "monitor", { NULL }, 561, "udp" },
+ { "chshell", { NULL }, 562, "tcp" },
+ { "chshell", { NULL }, 562, "udp" },
+ { "nntps", { NULL }, 563, "tcp" },
+ { "nntps", { NULL }, 563, "udp" },
+ { "9pfs", { NULL }, 564, "tcp" },
+ { "9pfs", { NULL }, 564, "udp" },
+ { "whoami", { NULL }, 565, "tcp" },
+ { "whoami", { NULL }, 565, "udp" },
+ { "streettalk", { NULL }, 566, "tcp" },
+ { "streettalk", { NULL }, 566, "udp" },
+ { "banyan-rpc", { NULL }, 567, "tcp" },
+ { "banyan-rpc", { NULL }, 567, "udp" },
+ { "ms-shuttle", { NULL }, 568, "tcp" },
+ { "ms-shuttle", { NULL }, 568, "udp" },
+ { "ms-rome", { NULL }, 569, "tcp" },
+ { "ms-rome", { NULL }, 569, "udp" },
+ { "meter", { NULL }, 570, "tcp" },
+ { "meter", { NULL }, 570, "udp" },
+ { "meter", { NULL }, 571, "tcp" },
+ { "meter", { NULL }, 571, "udp" },
+ { "sonar", { NULL }, 572, "tcp" },
+ { "sonar", { NULL }, 572, "udp" },
+ { "banyan-vip", { NULL }, 573, "tcp" },
+ { "banyan-vip", { NULL }, 573, "udp" },
+ { "ftp-agent", { NULL }, 574, "tcp" },
+ { "ftp-agent", { NULL }, 574, "udp" },
+ { "vemmi", { NULL }, 575, "tcp" },
+ { "vemmi", { NULL }, 575, "udp" },
+ { "ipcd", { NULL }, 576, "tcp" },
+ { "ipcd", { NULL }, 576, "udp" },
+ { "vnas", { NULL }, 577, "tcp" },
+ { "vnas", { NULL }, 577, "udp" },
+ { "ipdd", { NULL }, 578, "tcp" },
+ { "ipdd", { NULL }, 578, "udp" },
+ { "decbsrv", { NULL }, 579, "tcp" },
+ { "decbsrv", { NULL }, 579, "udp" },
+ { "sntp-heartbeat", { NULL }, 580, "tcp" },
+ { "sntp-heartbeat", { NULL }, 580, "udp" },
+ { "bdp", { NULL }, 581, "tcp" },
+ { "bdp", { NULL }, 581, "udp" },
+ { "scc-security", { NULL }, 582, "tcp" },
+ { "scc-security", { NULL }, 582, "udp" },
+ { "philips-vc", { NULL }, 583, "tcp" },
+ { "philips-vc", { NULL }, 583, "udp" },
+ { "keyserver", { NULL }, 584, "tcp" },
+ { "keyserver", { NULL }, 584, "udp" },
+ { "password-chg", { NULL }, 586, "tcp" },
+ { "password-chg", { NULL }, 586, "udp" },
+ { "submission", { NULL }, 587, "tcp" },
+ { "submission", { NULL }, 587, "udp" },
+ { "cal", { NULL }, 588, "tcp" },
+ { "cal", { NULL }, 588, "udp" },
+ { "eyelink", { NULL }, 589, "tcp" },
+ { "eyelink", { NULL }, 589, "udp" },
+ { "tns-cml", { NULL }, 590, "tcp" },
+ { "tns-cml", { NULL }, 590, "udp" },
+ { "http-alt", { NULL }, 591, "tcp" },
+ { "http-alt", { NULL }, 591, "udp" },
+ { "eudora-set", { NULL }, 592, "tcp" },
+ { "eudora-set", { NULL }, 592, "udp" },
+ { "http-rpc-epmap", { NULL }, 593, "tcp" },
+ { "http-rpc-epmap", { NULL }, 593, "udp" },
+ { "tpip", { NULL }, 594, "tcp" },
+ { "tpip", { NULL }, 594, "udp" },
+ { "cab-protocol", { NULL }, 595, "tcp" },
+ { "cab-protocol", { NULL }, 595, "udp" },
+ { "smsd", { NULL }, 596, "tcp" },
+ { "smsd", { NULL }, 596, "udp" },
+ { "ptcnameservice", { NULL }, 597, "tcp" },
+ { "ptcnameservice", { NULL }, 597, "udp" },
+ { "sco-websrvrmg3", { NULL }, 598, "tcp" },
+ { "sco-websrvrmg3", { NULL }, 598, "udp" },
+ { "acp", { NULL }, 599, "tcp" },
+ { "acp", { NULL }, 599, "udp" },
+ { "ipcserver", { NULL }, 600, "tcp" },
+ { "ipcserver", { NULL }, 600, "udp" },
+ { "syslog-conn", { NULL }, 601, "tcp" },
+ { "syslog-conn", { NULL }, 601, "udp" },
+ { "xmlrpc-beep", { NULL }, 602, "tcp" },
+ { "xmlrpc-beep", { NULL }, 602, "udp" },
+ { "idxp", { NULL }, 603, "tcp" },
+ { "idxp", { NULL }, 603, "udp" },
+ { "tunnel", { NULL }, 604, "tcp" },
+ { "tunnel", { NULL }, 604, "udp" },
+ { "soap-beep", { NULL }, 605, "tcp" },
+ { "soap-beep", { NULL }, 605, "udp" },
+ { "urm", { NULL }, 606, "tcp" },
+ { "urm", { NULL }, 606, "udp" },
+ { "nqs", { NULL }, 607, "tcp" },
+ { "nqs", { NULL }, 607, "udp" },
+ { "sift-uft", { NULL }, 608, "tcp" },
+ { "sift-uft", { NULL }, 608, "udp" },
+ { "npmp-trap", { NULL }, 609, "tcp" },
+ { "npmp-trap", { NULL }, 609, "udp" },
+ { "npmp-local", { NULL }, 610, "tcp" },
+ { "npmp-local", { NULL }, 610, "udp" },
+ { "npmp-gui", { NULL }, 611, "tcp" },
+ { "npmp-gui", { NULL }, 611, "udp" },
+ { "hmmp-ind", { NULL }, 612, "tcp" },
+ { "hmmp-ind", { NULL }, 612, "udp" },
+ { "hmmp-op", { NULL }, 613, "tcp" },
+ { "hmmp-op", { NULL }, 613, "udp" },
+ { "sshell", { NULL }, 614, "tcp" },
+ { "sshell", { NULL }, 614, "udp" },
+ { "sco-inetmgr", { NULL }, 615, "tcp" },
+ { "sco-inetmgr", { NULL }, 615, "udp" },
+ { "sco-sysmgr", { NULL }, 616, "tcp" },
+ { "sco-sysmgr", { NULL }, 616, "udp" },
+ { "sco-dtmgr", { NULL }, 617, "tcp" },
+ { "sco-dtmgr", { NULL }, 617, "udp" },
+ { "dei-icda", { NULL }, 618, "tcp" },
+ { "dei-icda", { NULL }, 618, "udp" },
+ { "compaq-evm", { NULL }, 619, "tcp" },
+ { "compaq-evm", { NULL }, 619, "udp" },
+ { "sco-websrvrmgr", { NULL }, 620, "tcp" },
+ { "sco-websrvrmgr", { NULL }, 620, "udp" },
+ { "escp-ip", { NULL }, 621, "tcp" },
+ { "escp-ip", { NULL }, 621, "udp" },
+ { "collaborator", { NULL }, 622, "tcp" },
+ { "collaborator", { NULL }, 622, "udp" },
+ { "oob-ws-http", { NULL }, 623, "tcp" },
+ { "asf-rmcp", { NULL }, 623, "udp" },
+ { "cryptoadmin", { NULL }, 624, "tcp" },
+ { "cryptoadmin", { NULL }, 624, "udp" },
+ { "dec_dlm", { NULL }, 625, "tcp" },
+ { "dec_dlm", { NULL }, 625, "udp" },
+ { "asia", { NULL }, 626, "tcp" },
+ { "asia", { NULL }, 626, "udp" },
+ { "passgo-tivoli", { NULL }, 627, "tcp" },
+ { "passgo-tivoli", { NULL }, 627, "udp" },
+ { "qmqp", { NULL }, 628, "tcp" },
+ { "qmqp", { NULL }, 628, "udp" },
+ { "3com-amp3", { NULL }, 629, "tcp" },
+ { "3com-amp3", { NULL }, 629, "udp" },
+ { "rda", { NULL }, 630, "tcp" },
+ { "rda", { NULL }, 630, "udp" },
+ { "ipp", { NULL }, 631, "tcp" },
+ { "ipp", { NULL }, 631, "udp" },
+ { "bmpp", { NULL }, 632, "tcp" },
+ { "bmpp", { NULL }, 632, "udp" },
+ { "servstat", { NULL }, 633, "tcp" },
+ { "servstat", { NULL }, 633, "udp" },
+ { "ginad", { NULL }, 634, "tcp" },
+ { "ginad", { NULL }, 634, "udp" },
+ { "rlzdbase", { NULL }, 635, "tcp" },
+ { "rlzdbase", { NULL }, 635, "udp" },
+ { "ldaps", { NULL }, 636, "tcp" },
+ { "ldaps", { NULL }, 636, "udp" },
+ { "lanserver", { NULL }, 637, "tcp" },
+ { "lanserver", { NULL }, 637, "udp" },
+ { "mcns-sec", { NULL }, 638, "tcp" },
+ { "mcns-sec", { NULL }, 638, "udp" },
+ { "msdp", { NULL }, 639, "tcp" },
+ { "msdp", { NULL }, 639, "udp" },
+ { "entrust-sps", { NULL }, 640, "tcp" },
+ { "entrust-sps", { NULL }, 640, "udp" },
+ { "repcmd", { NULL }, 641, "tcp" },
+ { "repcmd", { NULL }, 641, "udp" },
+ { "esro-emsdp", { NULL }, 642, "tcp" },
+ { "esro-emsdp", { NULL }, 642, "udp" },
+ { "sanity", { NULL }, 643, "tcp" },
+ { "sanity", { NULL }, 643, "udp" },
+ { "dwr", { NULL }, 644, "tcp" },
+ { "dwr", { NULL }, 644, "udp" },
+ { "pssc", { NULL }, 645, "tcp" },
+ { "pssc", { NULL }, 645, "udp" },
+ { "ldp", { NULL }, 646, "tcp" },
+ { "ldp", { NULL }, 646, "udp" },
+ { "dhcp-failover", { NULL }, 647, "tcp" },
+ { "dhcp-failover", { NULL }, 647, "udp" },
+ { "rrp", { NULL }, 648, "tcp" },
+ { "rrp", { NULL }, 648, "udp" },
+ { "cadview-3d", { NULL }, 649, "tcp" },
+ { "cadview-3d", { NULL }, 649, "udp" },
+ { "obex", { NULL }, 650, "tcp" },
+ { "obex", { NULL }, 650, "udp" },
+ { "ieee-mms", { NULL }, 651, "tcp" },
+ { "ieee-mms", { NULL }, 651, "udp" },
+ { "hello-port", { NULL }, 652, "tcp" },
+ { "hello-port", { NULL }, 652, "udp" },
+ { "repscmd", { NULL }, 653, "tcp" },
+ { "repscmd", { NULL }, 653, "udp" },
+ { "aodv", { NULL }, 654, "tcp" },
+ { "aodv", { NULL }, 654, "udp" },
+ { "tinc", { NULL }, 655, "tcp" },
+ { "tinc", { NULL }, 655, "udp" },
+ { "spmp", { NULL }, 656, "tcp" },
+ { "spmp", { NULL }, 656, "udp" },
+ { "rmc", { NULL }, 657, "tcp" },
+ { "rmc", { NULL }, 657, "udp" },
+ { "tenfold", { NULL }, 658, "tcp" },
+ { "tenfold", { NULL }, 658, "udp" },
+ { "mac-srvr-admin", { NULL }, 660, "tcp" },
+ { "mac-srvr-admin", { NULL }, 660, "udp" },
+ { "hap", { NULL }, 661, "tcp" },
+ { "hap", { NULL }, 661, "udp" },
+ { "pftp", { NULL }, 662, "tcp" },
+ { "pftp", { NULL }, 662, "udp" },
+ { "purenoise", { NULL }, 663, "tcp" },
+ { "purenoise", { NULL }, 663, "udp" },
+ { "oob-ws-https", { NULL }, 664, "tcp" },
+ { "asf-secure-rmcp", { NULL }, 664, "udp" },
+ { "sun-dr", { NULL }, 665, "tcp" },
+ { "sun-dr", { NULL }, 665, "udp" },
+ { "mdqs", { NULL }, 666, "tcp" },
+ { "mdqs", { NULL }, 666, "udp" },
+ { "doom", { NULL }, 666, "tcp" },
+ { "doom", { NULL }, 666, "udp" },
+ { "disclose", { NULL }, 667, "tcp" },
+ { "disclose", { NULL }, 667, "udp" },
+ { "mecomm", { NULL }, 668, "tcp" },
+ { "mecomm", { NULL }, 668, "udp" },
+ { "meregister", { NULL }, 669, "tcp" },
+ { "meregister", { NULL }, 669, "udp" },
+ { "vacdsm-sws", { NULL }, 670, "tcp" },
+ { "vacdsm-sws", { NULL }, 670, "udp" },
+ { "vacdsm-app", { NULL }, 671, "tcp" },
+ { "vacdsm-app", { NULL }, 671, "udp" },
+ { "vpps-qua", { NULL }, 672, "tcp" },
+ { "vpps-qua", { NULL }, 672, "udp" },
+ { "cimplex", { NULL }, 673, "tcp" },
+ { "cimplex", { NULL }, 673, "udp" },
+ { "acap", { NULL }, 674, "tcp" },
+ { "acap", { NULL }, 674, "udp" },
+ { "dctp", { NULL }, 675, "tcp" },
+ { "dctp", { NULL }, 675, "udp" },
+ { "vpps-via", { NULL }, 676, "tcp" },
+ { "vpps-via", { NULL }, 676, "udp" },
+ { "vpp", { NULL }, 677, "tcp" },
+ { "vpp", { NULL }, 677, "udp" },
+ { "ggf-ncp", { NULL }, 678, "tcp" },
+ { "ggf-ncp", { NULL }, 678, "udp" },
+ { "mrm", { NULL }, 679, "tcp" },
+ { "mrm", { NULL }, 679, "udp" },
+ { "entrust-aaas", { NULL }, 680, "tcp" },
+ { "entrust-aaas", { NULL }, 680, "udp" },
+ { "entrust-aams", { NULL }, 681, "tcp" },
+ { "entrust-aams", { NULL }, 681, "udp" },
+ { "xfr", { NULL }, 682, "tcp" },
+ { "xfr", { NULL }, 682, "udp" },
+ { "corba-iiop", { NULL }, 683, "tcp" },
+ { "corba-iiop", { NULL }, 683, "udp" },
+ { "corba-iiop-ssl", { NULL }, 684, "tcp" },
+ { "corba-iiop-ssl", { NULL }, 684, "udp" },
+ { "mdc-portmapper", { NULL }, 685, "tcp" },
+ { "mdc-portmapper", { NULL }, 685, "udp" },
+ { "hcp-wismar", { NULL }, 686, "tcp" },
+ { "hcp-wismar", { NULL }, 686, "udp" },
+ { "asipregistry", { NULL }, 687, "tcp" },
+ { "asipregistry", { NULL }, 687, "udp" },
+ { "realm-rusd", { NULL }, 688, "tcp" },
+ { "realm-rusd", { NULL }, 688, "udp" },
+ { "nmap", { NULL }, 689, "tcp" },
+ { "nmap", { NULL }, 689, "udp" },
+ { "vatp", { NULL }, 690, "tcp" },
+ { "vatp", { NULL }, 690, "udp" },
+ { "msexch-routing", { NULL }, 691, "tcp" },
+ { "msexch-routing", { NULL }, 691, "udp" },
+ { "hyperwave-isp", { NULL }, 692, "tcp" },
+ { "hyperwave-isp", { NULL }, 692, "udp" },
+ { "connendp", { NULL }, 693, "tcp" },
+ { "connendp", { NULL }, 693, "udp" },
+ { "ha-cluster", { NULL }, 694, "tcp" },
+ { "ha-cluster", { NULL }, 694, "udp" },
+ { "ieee-mms-ssl", { NULL }, 695, "tcp" },
+ { "ieee-mms-ssl", { NULL }, 695, "udp" },
+ { "rushd", { NULL }, 696, "tcp" },
+ { "rushd", { NULL }, 696, "udp" },
+ { "uuidgen", { NULL }, 697, "tcp" },
+ { "uuidgen", { NULL }, 697, "udp" },
+ { "olsr", { NULL }, 698, "tcp" },
+ { "olsr", { NULL }, 698, "udp" },
+ { "accessnetwork", { NULL }, 699, "tcp" },
+ { "accessnetwork", { NULL }, 699, "udp" },
+ { "epp", { NULL }, 700, "tcp" },
+ { "epp", { NULL }, 700, "udp" },
+ { "lmp", { NULL }, 701, "tcp" },
+ { "lmp", { NULL }, 701, "udp" },
+ { "iris-beep", { NULL }, 702, "tcp" },
+ { "iris-beep", { NULL }, 702, "udp" },
+ { "elcsd", { NULL }, 704, "tcp" },
+ { "elcsd", { NULL }, 704, "udp" },
+ { "agentx", { NULL }, 705, "tcp" },
+ { "agentx", { NULL }, 705, "udp" },
+ { "silc", { NULL }, 706, "tcp" },
+ { "silc", { NULL }, 706, "udp" },
+ { "borland-dsj", { NULL }, 707, "tcp" },
+ { "borland-dsj", { NULL }, 707, "udp" },
+ { "entrust-kmsh", { NULL }, 709, "tcp" },
+ { "entrust-kmsh", { NULL }, 709, "udp" },
+ { "entrust-ash", { NULL }, 710, "tcp" },
+ { "entrust-ash", { NULL }, 710, "udp" },
+ { "cisco-tdp", { NULL }, 711, "tcp" },
+ { "cisco-tdp", { NULL }, 711, "udp" },
+ { "tbrpf", { NULL }, 712, "tcp" },
+ { "tbrpf", { NULL }, 712, "udp" },
+ { "iris-xpc", { NULL }, 713, "tcp" },
+ { "iris-xpc", { NULL }, 713, "udp" },
+ { "iris-xpcs", { NULL }, 714, "tcp" },
+ { "iris-xpcs", { NULL }, 714, "udp" },
+ { "iris-lwz", { NULL }, 715, "tcp" },
+ { "iris-lwz", { NULL }, 715, "udp" },
+ { "pana", { NULL }, 716, "udp" },
+ { "netviewdm1", { NULL }, 729, "tcp" },
+ { "netviewdm1", { NULL }, 729, "udp" },
+ { "netviewdm2", { NULL }, 730, "tcp" },
+ { "netviewdm2", { NULL }, 730, "udp" },
+ { "netviewdm3", { NULL }, 731, "tcp" },
+ { "netviewdm3", { NULL }, 731, "udp" },
+ { "netgw", { NULL }, 741, "tcp" },
+ { "netgw", { NULL }, 741, "udp" },
+ { "netrcs", { NULL }, 742, "tcp" },
+ { "netrcs", { NULL }, 742, "udp" },
+ { "flexlm", { NULL }, 744, "tcp" },
+ { "flexlm", { NULL }, 744, "udp" },
+ { "fujitsu-dev", { NULL }, 747, "tcp" },
+ { "fujitsu-dev", { NULL }, 747, "udp" },
+ { "ris-cm", { NULL }, 748, "tcp" },
+ { "ris-cm", { NULL }, 748, "udp" },
+ { "kerberos-adm", { NULL }, 749, "tcp" },
+ { "kerberos-adm", { NULL }, 749, "udp" },
+ { "rfile", { NULL }, 750, "tcp" },
+ { "loadav", { NULL }, 750, "udp" },
+ { "kerberos-iv", { NULL }, 750, "udp" },
+ { "pump", { NULL }, 751, "tcp" },
+ { "pump", { NULL }, 751, "udp" },
+ { "qrh", { NULL }, 752, "tcp" },
+ { "qrh", { NULL }, 752, "udp" },
+ { "rrh", { NULL }, 753, "tcp" },
+ { "rrh", { NULL }, 753, "udp" },
+ { "tell", { NULL }, 754, "tcp" },
+ { "tell", { NULL }, 754, "udp" },
+ { "nlogin", { NULL }, 758, "tcp" },
+ { "nlogin", { NULL }, 758, "udp" },
+ { "con", { NULL }, 759, "tcp" },
+ { "con", { NULL }, 759, "udp" },
+ { "ns", { NULL }, 760, "tcp" },
+ { "ns", { NULL }, 760, "udp" },
+ { "rxe", { NULL }, 761, "tcp" },
+ { "rxe", { NULL }, 761, "udp" },
+ { "quotad", { NULL }, 762, "tcp" },
+ { "quotad", { NULL }, 762, "udp" },
+ { "cycleserv", { NULL }, 763, "tcp" },
+ { "cycleserv", { NULL }, 763, "udp" },
+ { "omserv", { NULL }, 764, "tcp" },
+ { "omserv", { NULL }, 764, "udp" },
+ { "webster", { NULL }, 765, "tcp" },
+ { "webster", { NULL }, 765, "udp" },
+ { "phonebook", { NULL }, 767, "tcp" },
+ { "phonebook", { NULL }, 767, "udp" },
+ { "vid", { NULL }, 769, "tcp" },
+ { "vid", { NULL }, 769, "udp" },
+ { "cadlock", { NULL }, 770, "tcp" },
+ { "cadlock", { NULL }, 770, "udp" },
+ { "rtip", { NULL }, 771, "tcp" },
+ { "rtip", { NULL }, 771, "udp" },
+ { "cycleserv2", { NULL }, 772, "tcp" },
+ { "cycleserv2", { NULL }, 772, "udp" },
+ { "submit", { NULL }, 773, "tcp" },
+ { "notify", { NULL }, 773, "udp" },
+ { "rpasswd", { NULL }, 774, "tcp" },
+ { "acmaint_dbd", { NULL }, 774, "udp" },
+ { "entomb", { NULL }, 775, "tcp" },
+ { "acmaint_transd", { NULL }, 775, "udp" },
+ { "wpages", { NULL }, 776, "tcp" },
+ { "wpages", { NULL }, 776, "udp" },
+ { "multiling-http", { NULL }, 777, "tcp" },
+ { "multiling-http", { NULL }, 777, "udp" },
+ { "wpgs", { NULL }, 780, "tcp" },
+ { "wpgs", { NULL }, 780, "udp" },
+ { "mdbs_daemon", { NULL }, 800, "tcp" },
+ { "mdbs_daemon", { NULL }, 800, "udp" },
+ { "device", { NULL }, 801, "tcp" },
+ { "device", { NULL }, 801, "udp" },
+ { "fcp-udp", { NULL }, 810, "tcp" },
+ { "fcp-udp", { NULL }, 810, "udp" },
+ { "itm-mcell-s", { NULL }, 828, "tcp" },
+ { "itm-mcell-s", { NULL }, 828, "udp" },
+ { "pkix-3-ca-ra", { NULL }, 829, "tcp" },
+ { "pkix-3-ca-ra", { NULL }, 829, "udp" },
+ { "netconf-ssh", { NULL }, 830, "tcp" },
+ { "netconf-ssh", { NULL }, 830, "udp" },
+ { "netconf-beep", { NULL }, 831, "tcp" },
+ { "netconf-beep", { NULL }, 831, "udp" },
+ { "netconfsoaphttp", { NULL }, 832, "tcp" },
+ { "netconfsoaphttp", { NULL }, 832, "udp" },
+ { "netconfsoapbeep", { NULL }, 833, "tcp" },
+ { "netconfsoapbeep", { NULL }, 833, "udp" },
+ { "dhcp-failover2", { NULL }, 847, "tcp" },
+ { "dhcp-failover2", { NULL }, 847, "udp" },
+ { "gdoi", { NULL }, 848, "tcp" },
+ { "gdoi", { NULL }, 848, "udp" },
+ { "iscsi", { NULL }, 860, "tcp" },
+ { "iscsi", { NULL }, 860, "udp" },
+ { "owamp-control", { NULL }, 861, "tcp" },
+ { "owamp-control", { NULL }, 861, "udp" },
+ { "twamp-control", { NULL }, 862, "tcp" },
+ { "twamp-control", { NULL }, 862, "udp" },
+ { "rsync", { NULL }, 873, "tcp" },
+ { "rsync", { NULL }, 873, "udp" },
+ { "iclcnet-locate", { NULL }, 886, "tcp" },
+ { "iclcnet-locate", { NULL }, 886, "udp" },
+ { "iclcnet_svinfo", { NULL }, 887, "tcp" },
+ { "iclcnet_svinfo", { NULL }, 887, "udp" },
+ { "accessbuilder", { NULL }, 888, "tcp" },
+ { "accessbuilder", { NULL }, 888, "udp" },
+ { "cddbp", { NULL }, 888, "tcp" },
+ { "omginitialrefs", { NULL }, 900, "tcp" },
+ { "omginitialrefs", { NULL }, 900, "udp" },
+ { "smpnameres", { NULL }, 901, "tcp" },
+ { "smpnameres", { NULL }, 901, "udp" },
+ { "ideafarm-door", { NULL }, 902, "tcp" },
+ { "ideafarm-door", { NULL }, 902, "udp" },
+ { "ideafarm-panic", { NULL }, 903, "tcp" },
+ { "ideafarm-panic", { NULL }, 903, "udp" },
+ { "kink", { NULL }, 910, "tcp" },
+ { "kink", { NULL }, 910, "udp" },
+ { "xact-backup", { NULL }, 911, "tcp" },
+ { "xact-backup", { NULL }, 911, "udp" },
+ { "apex-mesh", { NULL }, 912, "tcp" },
+ { "apex-mesh", { NULL }, 912, "udp" },
+ { "apex-edge", { NULL }, 913, "tcp" },
+ { "apex-edge", { NULL }, 913, "udp" },
+ { "ftps-data", { NULL }, 989, "tcp" },
+ { "ftps-data", { NULL }, 989, "udp" },
+ { "ftps", { NULL }, 990, "tcp" },
+ { "ftps", { NULL }, 990, "udp" },
+ { "nas", { NULL }, 991, "tcp" },
+ { "nas", { NULL }, 991, "udp" },
+ { "telnets", { NULL }, 992, "tcp" },
+ { "telnets", { NULL }, 992, "udp" },
+ { "imaps", { NULL }, 993, "tcp" },
+ { "imaps", { NULL }, 993, "udp" },
+ { "ircs", { NULL }, 994, "tcp" },
+ { "ircs", { NULL }, 994, "udp" },
+ { "pop3s", { NULL }, 995, "tcp" },
+ { "pop3s", { NULL }, 995, "udp" },
+ { "vsinet", { NULL }, 996, "tcp" },
+ { "vsinet", { NULL }, 996, "udp" },
+ { "maitrd", { NULL }, 997, "tcp" },
+ { "maitrd", { NULL }, 997, "udp" },
+ { "busboy", { NULL }, 998, "tcp" },
+ { "puparp", { NULL }, 998, "udp" },
+ { "garcon", { NULL }, 999, "tcp" },
+ { "applix", { NULL }, 999, "udp" },
+ { "puprouter", { NULL }, 999, "tcp" },
+ { "puprouter", { NULL }, 999, "udp" },
+ { "cadlock2", { NULL }, 1000, "tcp" },
+ { "cadlock2", { NULL }, 1000, "udp" },
+ { "surf", { NULL }, 1010, "tcp" },
+ { "surf", { NULL }, 1010, "udp" },
+ { "exp1", { NULL }, 1021, "tcp" },
+ { "exp1", { NULL }, 1021, "udp" },
+ { "exp2", { NULL }, 1022, "tcp" },
+ { "exp2", { NULL }, 1022, "udp" },
+# endif /* USE_IANA_WELL_KNOWN_PORTS */
+# ifdef USE_IANA_REGISTERED_PORTS
+ { "blackjack", { NULL }, 1025, "tcp" },
+ { "blackjack", { NULL }, 1025, "udp" },
+ { "cap", { NULL }, 1026, "tcp" },
+ { "cap", { NULL }, 1026, "udp" },
+ { "solid-mux", { NULL }, 1029, "tcp" },
+ { "solid-mux", { NULL }, 1029, "udp" },
+ { "iad1", { NULL }, 1030, "tcp" },
+ { "iad1", { NULL }, 1030, "udp" },
+ { "iad2", { NULL }, 1031, "tcp" },
+ { "iad2", { NULL }, 1031, "udp" },
+ { "iad3", { NULL }, 1032, "tcp" },
+ { "iad3", { NULL }, 1032, "udp" },
+ { "netinfo-local", { NULL }, 1033, "tcp" },
+ { "netinfo-local", { NULL }, 1033, "udp" },
+ { "activesync", { NULL }, 1034, "tcp" },
+ { "activesync", { NULL }, 1034, "udp" },
+ { "mxxrlogin", { NULL }, 1035, "tcp" },
+ { "mxxrlogin", { NULL }, 1035, "udp" },
+ { "nsstp", { NULL }, 1036, "tcp" },
+ { "nsstp", { NULL }, 1036, "udp" },
+ { "ams", { NULL }, 1037, "tcp" },
+ { "ams", { NULL }, 1037, "udp" },
+ { "mtqp", { NULL }, 1038, "tcp" },
+ { "mtqp", { NULL }, 1038, "udp" },
+ { "sbl", { NULL }, 1039, "tcp" },
+ { "sbl", { NULL }, 1039, "udp" },
+ { "netarx", { NULL }, 1040, "tcp" },
+ { "netarx", { NULL }, 1040, "udp" },
+ { "danf-ak2", { NULL }, 1041, "tcp" },
+ { "danf-ak2", { NULL }, 1041, "udp" },
+ { "afrog", { NULL }, 1042, "tcp" },
+ { "afrog", { NULL }, 1042, "udp" },
+ { "boinc-client", { NULL }, 1043, "tcp" },
+ { "boinc-client", { NULL }, 1043, "udp" },
+ { "dcutility", { NULL }, 1044, "tcp" },
+ { "dcutility", { NULL }, 1044, "udp" },
+ { "fpitp", { NULL }, 1045, "tcp" },
+ { "fpitp", { NULL }, 1045, "udp" },
+ { "wfremotertm", { NULL }, 1046, "tcp" },
+ { "wfremotertm", { NULL }, 1046, "udp" },
+ { "neod1", { NULL }, 1047, "tcp" },
+ { "neod1", { NULL }, 1047, "udp" },
+ { "neod2", { NULL }, 1048, "tcp" },
+ { "neod2", { NULL }, 1048, "udp" },
+ { "td-postman", { NULL }, 1049, "tcp" },
+ { "td-postman", { NULL }, 1049, "udp" },
+ { "cma", { NULL }, 1050, "tcp" },
+ { "cma", { NULL }, 1050, "udp" },
+ { "optima-vnet", { NULL }, 1051, "tcp" },
+ { "optima-vnet", { NULL }, 1051, "udp" },
+ { "ddt", { NULL }, 1052, "tcp" },
+ { "ddt", { NULL }, 1052, "udp" },
+ { "remote-as", { NULL }, 1053, "tcp" },
+ { "remote-as", { NULL }, 1053, "udp" },
+ { "brvread", { NULL }, 1054, "tcp" },
+ { "brvread", { NULL }, 1054, "udp" },
+ { "ansyslmd", { NULL }, 1055, "tcp" },
+ { "ansyslmd", { NULL }, 1055, "udp" },
+ { "vfo", { NULL }, 1056, "tcp" },
+ { "vfo", { NULL }, 1056, "udp" },
+ { "startron", { NULL }, 1057, "tcp" },
+ { "startron", { NULL }, 1057, "udp" },
+ { "nim", { NULL }, 1058, "tcp" },
+ { "nim", { NULL }, 1058, "udp" },
+ { "nimreg", { NULL }, 1059, "tcp" },
+ { "nimreg", { NULL }, 1059, "udp" },
+ { "polestar", { NULL }, 1060, "tcp" },
+ { "polestar", { NULL }, 1060, "udp" },
+ { "kiosk", { NULL }, 1061, "tcp" },
+ { "kiosk", { NULL }, 1061, "udp" },
+ { "veracity", { NULL }, 1062, "tcp" },
+ { "veracity", { NULL }, 1062, "udp" },
+ { "kyoceranetdev", { NULL }, 1063, "tcp" },
+ { "kyoceranetdev", { NULL }, 1063, "udp" },
+ { "jstel", { NULL }, 1064, "tcp" },
+ { "jstel", { NULL }, 1064, "udp" },
+ { "syscomlan", { NULL }, 1065, "tcp" },
+ { "syscomlan", { NULL }, 1065, "udp" },
+ { "fpo-fns", { NULL }, 1066, "tcp" },
+ { "fpo-fns", { NULL }, 1066, "udp" },
+ { "instl_boots", { NULL }, 1067, "tcp" },
+ { "instl_boots", { NULL }, 1067, "udp" },
+ { "instl_bootc", { NULL }, 1068, "tcp" },
+ { "instl_bootc", { NULL }, 1068, "udp" },
+ { "cognex-insight", { NULL }, 1069, "tcp" },
+ { "cognex-insight", { NULL }, 1069, "udp" },
+ { "gmrupdateserv", { NULL }, 1070, "tcp" },
+ { "gmrupdateserv", { NULL }, 1070, "udp" },
+ { "bsquare-voip", { NULL }, 1071, "tcp" },
+ { "bsquare-voip", { NULL }, 1071, "udp" },
+ { "cardax", { NULL }, 1072, "tcp" },
+ { "cardax", { NULL }, 1072, "udp" },
+ { "bridgecontrol", { NULL }, 1073, "tcp" },
+ { "bridgecontrol", { NULL }, 1073, "udp" },
+ { "warmspotMgmt", { NULL }, 1074, "tcp" },
+ { "warmspotMgmt", { NULL }, 1074, "udp" },
+ { "rdrmshc", { NULL }, 1075, "tcp" },
+ { "rdrmshc", { NULL }, 1075, "udp" },
+ { "dab-sti-c", { NULL }, 1076, "tcp" },
+ { "dab-sti-c", { NULL }, 1076, "udp" },
+ { "imgames", { NULL }, 1077, "tcp" },
+ { "imgames", { NULL }, 1077, "udp" },
+ { "avocent-proxy", { NULL }, 1078, "tcp" },
+ { "avocent-proxy", { NULL }, 1078, "udp" },
+ { "asprovatalk", { NULL }, 1079, "tcp" },
+ { "asprovatalk", { NULL }, 1079, "udp" },
+ { "socks", { NULL }, 1080, "tcp" },
+ { "socks", { NULL }, 1080, "udp" },
+ { "pvuniwien", { NULL }, 1081, "tcp" },
+ { "pvuniwien", { NULL }, 1081, "udp" },
+ { "amt-esd-prot", { NULL }, 1082, "tcp" },
+ { "amt-esd-prot", { NULL }, 1082, "udp" },
+ { "ansoft-lm-1", { NULL }, 1083, "tcp" },
+ { "ansoft-lm-1", { NULL }, 1083, "udp" },
+ { "ansoft-lm-2", { NULL }, 1084, "tcp" },
+ { "ansoft-lm-2", { NULL }, 1084, "udp" },
+ { "webobjects", { NULL }, 1085, "tcp" },
+ { "webobjects", { NULL }, 1085, "udp" },
+ { "cplscrambler-lg", { NULL }, 1086, "tcp" },
+ { "cplscrambler-lg", { NULL }, 1086, "udp" },
+ { "cplscrambler-in", { NULL }, 1087, "tcp" },
+ { "cplscrambler-in", { NULL }, 1087, "udp" },
+ { "cplscrambler-al", { NULL }, 1088, "tcp" },
+ { "cplscrambler-al", { NULL }, 1088, "udp" },
+ { "ff-annunc", { NULL }, 1089, "tcp" },
+ { "ff-annunc", { NULL }, 1089, "udp" },
+ { "ff-fms", { NULL }, 1090, "tcp" },
+ { "ff-fms", { NULL }, 1090, "udp" },
+ { "ff-sm", { NULL }, 1091, "tcp" },
+ { "ff-sm", { NULL }, 1091, "udp" },
+ { "obrpd", { NULL }, 1092, "tcp" },
+ { "obrpd", { NULL }, 1092, "udp" },
+ { "proofd", { NULL }, 1093, "tcp" },
+ { "proofd", { NULL }, 1093, "udp" },
+ { "rootd", { NULL }, 1094, "tcp" },
+ { "rootd", { NULL }, 1094, "udp" },
+ { "nicelink", { NULL }, 1095, "tcp" },
+ { "nicelink", { NULL }, 1095, "udp" },
+ { "cnrprotocol", { NULL }, 1096, "tcp" },
+ { "cnrprotocol", { NULL }, 1096, "udp" },
+ { "sunclustermgr", { NULL }, 1097, "tcp" },
+ { "sunclustermgr", { NULL }, 1097, "udp" },
+ { "rmiactivation", { NULL }, 1098, "tcp" },
+ { "rmiactivation", { NULL }, 1098, "udp" },
+ { "rmiregistry", { NULL }, 1099, "tcp" },
+ { "rmiregistry", { NULL }, 1099, "udp" },
+ { "mctp", { NULL }, 1100, "tcp" },
+ { "mctp", { NULL }, 1100, "udp" },
+ { "pt2-discover", { NULL }, 1101, "tcp" },
+ { "pt2-discover", { NULL }, 1101, "udp" },
+ { "adobeserver-1", { NULL }, 1102, "tcp" },
+ { "adobeserver-1", { NULL }, 1102, "udp" },
+ { "adobeserver-2", { NULL }, 1103, "tcp" },
+ { "adobeserver-2", { NULL }, 1103, "udp" },
+ { "xrl", { NULL }, 1104, "tcp" },
+ { "xrl", { NULL }, 1104, "udp" },
+ { "ftranhc", { NULL }, 1105, "tcp" },
+ { "ftranhc", { NULL }, 1105, "udp" },
+ { "isoipsigport-1", { NULL }, 1106, "tcp" },
+ { "isoipsigport-1", { NULL }, 1106, "udp" },
+ { "isoipsigport-2", { NULL }, 1107, "tcp" },
+ { "isoipsigport-2", { NULL }, 1107, "udp" },
+ { "ratio-adp", { NULL }, 1108, "tcp" },
+ { "ratio-adp", { NULL }, 1108, "udp" },
+ { "webadmstart", { NULL }, 1110, "tcp" },
+ { "nfsd-keepalive", { NULL }, 1110, "udp" },
+ { "lmsocialserver", { NULL }, 1111, "tcp" },
+ { "lmsocialserver", { NULL }, 1111, "udp" },
+ { "icp", { NULL }, 1112, "tcp" },
+ { "icp", { NULL }, 1112, "udp" },
+ { "ltp-deepspace", { NULL }, 1113, "tcp" },
+ { "ltp-deepspace", { NULL }, 1113, "udp" },
+ { "mini-sql", { NULL }, 1114, "tcp" },
+ { "mini-sql", { NULL }, 1114, "udp" },
+ { "ardus-trns", { NULL }, 1115, "tcp" },
+ { "ardus-trns", { NULL }, 1115, "udp" },
+ { "ardus-cntl", { NULL }, 1116, "tcp" },
+ { "ardus-cntl", { NULL }, 1116, "udp" },
+ { "ardus-mtrns", { NULL }, 1117, "tcp" },
+ { "ardus-mtrns", { NULL }, 1117, "udp" },
+ { "sacred", { NULL }, 1118, "tcp" },
+ { "sacred", { NULL }, 1118, "udp" },
+ { "bnetgame", { NULL }, 1119, "tcp" },
+ { "bnetgame", { NULL }, 1119, "udp" },
+ { "bnetfile", { NULL }, 1120, "tcp" },
+ { "bnetfile", { NULL }, 1120, "udp" },
+ { "rmpp", { NULL }, 1121, "tcp" },
+ { "rmpp", { NULL }, 1121, "udp" },
+ { "availant-mgr", { NULL }, 1122, "tcp" },
+ { "availant-mgr", { NULL }, 1122, "udp" },
+ { "murray", { NULL }, 1123, "tcp" },
+ { "murray", { NULL }, 1123, "udp" },
+ { "hpvmmcontrol", { NULL }, 1124, "tcp" },
+ { "hpvmmcontrol", { NULL }, 1124, "udp" },
+ { "hpvmmagent", { NULL }, 1125, "tcp" },
+ { "hpvmmagent", { NULL }, 1125, "udp" },
+ { "hpvmmdata", { NULL }, 1126, "tcp" },
+ { "hpvmmdata", { NULL }, 1126, "udp" },
+ { "kwdb-commn", { NULL }, 1127, "tcp" },
+ { "kwdb-commn", { NULL }, 1127, "udp" },
+ { "saphostctrl", { NULL }, 1128, "tcp" },
+ { "saphostctrl", { NULL }, 1128, "udp" },
+ { "saphostctrls", { NULL }, 1129, "tcp" },
+ { "saphostctrls", { NULL }, 1129, "udp" },
+ { "casp", { NULL }, 1130, "tcp" },
+ { "casp", { NULL }, 1130, "udp" },
+ { "caspssl", { NULL }, 1131, "tcp" },
+ { "caspssl", { NULL }, 1131, "udp" },
+ { "kvm-via-ip", { NULL }, 1132, "tcp" },
+ { "kvm-via-ip", { NULL }, 1132, "udp" },
+ { "dfn", { NULL }, 1133, "tcp" },
+ { "dfn", { NULL }, 1133, "udp" },
+ { "aplx", { NULL }, 1134, "tcp" },
+ { "aplx", { NULL }, 1134, "udp" },
+ { "omnivision", { NULL }, 1135, "tcp" },
+ { "omnivision", { NULL }, 1135, "udp" },
+ { "hhb-gateway", { NULL }, 1136, "tcp" },
+ { "hhb-gateway", { NULL }, 1136, "udp" },
+ { "trim", { NULL }, 1137, "tcp" },
+ { "trim", { NULL }, 1137, "udp" },
+ { "encrypted_admin", { NULL }, 1138, "tcp" },
+ { "encrypted_admin", { NULL }, 1138, "udp" },
+ { "evm", { NULL }, 1139, "tcp" },
+ { "evm", { NULL }, 1139, "udp" },
+ { "autonoc", { NULL }, 1140, "tcp" },
+ { "autonoc", { NULL }, 1140, "udp" },
+ { "mxomss", { NULL }, 1141, "tcp" },
+ { "mxomss", { NULL }, 1141, "udp" },
+ { "edtools", { NULL }, 1142, "tcp" },
+ { "edtools", { NULL }, 1142, "udp" },
+ { "imyx", { NULL }, 1143, "tcp" },
+ { "imyx", { NULL }, 1143, "udp" },
+ { "fuscript", { NULL }, 1144, "tcp" },
+ { "fuscript", { NULL }, 1144, "udp" },
+ { "x9-icue", { NULL }, 1145, "tcp" },
+ { "x9-icue", { NULL }, 1145, "udp" },
+ { "audit-transfer", { NULL }, 1146, "tcp" },
+ { "audit-transfer", { NULL }, 1146, "udp" },
+ { "capioverlan", { NULL }, 1147, "tcp" },
+ { "capioverlan", { NULL }, 1147, "udp" },
+ { "elfiq-repl", { NULL }, 1148, "tcp" },
+ { "elfiq-repl", { NULL }, 1148, "udp" },
+ { "bvtsonar", { NULL }, 1149, "tcp" },
+ { "bvtsonar", { NULL }, 1149, "udp" },
+ { "blaze", { NULL }, 1150, "tcp" },
+ { "blaze", { NULL }, 1150, "udp" },
+ { "unizensus", { NULL }, 1151, "tcp" },
+ { "unizensus", { NULL }, 1151, "udp" },
+ { "winpoplanmess", { NULL }, 1152, "tcp" },
+ { "winpoplanmess", { NULL }, 1152, "udp" },
+ { "c1222-acse", { NULL }, 1153, "tcp" },
+ { "c1222-acse", { NULL }, 1153, "udp" },
+ { "resacommunity", { NULL }, 1154, "tcp" },
+ { "resacommunity", { NULL }, 1154, "udp" },
+ { "nfa", { NULL }, 1155, "tcp" },
+ { "nfa", { NULL }, 1155, "udp" },
+ { "iascontrol-oms", { NULL }, 1156, "tcp" },
+ { "iascontrol-oms", { NULL }, 1156, "udp" },
+ { "iascontrol", { NULL }, 1157, "tcp" },
+ { "iascontrol", { NULL }, 1157, "udp" },
+ { "dbcontrol-oms", { NULL }, 1158, "tcp" },
+ { "dbcontrol-oms", { NULL }, 1158, "udp" },
+ { "oracle-oms", { NULL }, 1159, "tcp" },
+ { "oracle-oms", { NULL }, 1159, "udp" },
+ { "olsv", { NULL }, 1160, "tcp" },
+ { "olsv", { NULL }, 1160, "udp" },
+ { "health-polling", { NULL }, 1161, "tcp" },
+ { "health-polling", { NULL }, 1161, "udp" },
+ { "health-trap", { NULL }, 1162, "tcp" },
+ { "health-trap", { NULL }, 1162, "udp" },
+ { "sddp", { NULL }, 1163, "tcp" },
+ { "sddp", { NULL }, 1163, "udp" },
+ { "qsm-proxy", { NULL }, 1164, "tcp" },
+ { "qsm-proxy", { NULL }, 1164, "udp" },
+ { "qsm-gui", { NULL }, 1165, "tcp" },
+ { "qsm-gui", { NULL }, 1165, "udp" },
+ { "qsm-remote", { NULL }, 1166, "tcp" },
+ { "qsm-remote", { NULL }, 1166, "udp" },
+ { "cisco-ipsla", { NULL }, 1167, "tcp" },
+ { "cisco-ipsla", { NULL }, 1167, "udp" },
+ { "cisco-ipsla", { NULL }, 1167, "sctp"},
+ { "vchat", { NULL }, 1168, "tcp" },
+ { "vchat", { NULL }, 1168, "udp" },
+ { "tripwire", { NULL }, 1169, "tcp" },
+ { "tripwire", { NULL }, 1169, "udp" },
+ { "atc-lm", { NULL }, 1170, "tcp" },
+ { "atc-lm", { NULL }, 1170, "udp" },
+ { "atc-appserver", { NULL }, 1171, "tcp" },
+ { "atc-appserver", { NULL }, 1171, "udp" },
+ { "dnap", { NULL }, 1172, "tcp" },
+ { "dnap", { NULL }, 1172, "udp" },
+ { "d-cinema-rrp", { NULL }, 1173, "tcp" },
+ { "d-cinema-rrp", { NULL }, 1173, "udp" },
+ { "fnet-remote-ui", { NULL }, 1174, "tcp" },
+ { "fnet-remote-ui", { NULL }, 1174, "udp" },
+ { "dossier", { NULL }, 1175, "tcp" },
+ { "dossier", { NULL }, 1175, "udp" },
+ { "indigo-server", { NULL }, 1176, "tcp" },
+ { "indigo-server", { NULL }, 1176, "udp" },
+ { "dkmessenger", { NULL }, 1177, "tcp" },
+ { "dkmessenger", { NULL }, 1177, "udp" },
+ { "sgi-storman", { NULL }, 1178, "tcp" },
+ { "sgi-storman", { NULL }, 1178, "udp" },
+ { "b2n", { NULL }, 1179, "tcp" },
+ { "b2n", { NULL }, 1179, "udp" },
+ { "mc-client", { NULL }, 1180, "tcp" },
+ { "mc-client", { NULL }, 1180, "udp" },
+ { "3comnetman", { NULL }, 1181, "tcp" },
+ { "3comnetman", { NULL }, 1181, "udp" },
+ { "accelenet", { NULL }, 1182, "tcp" },
+ { "accelenet-data", { NULL }, 1182, "udp" },
+ { "llsurfup-http", { NULL }, 1183, "tcp" },
+ { "llsurfup-http", { NULL }, 1183, "udp" },
+ { "llsurfup-https", { NULL }, 1184, "tcp" },
+ { "llsurfup-https", { NULL }, 1184, "udp" },
+ { "catchpole", { NULL }, 1185, "tcp" },
+ { "catchpole", { NULL }, 1185, "udp" },
+ { "mysql-cluster", { NULL }, 1186, "tcp" },
+ { "mysql-cluster", { NULL }, 1186, "udp" },
+ { "alias", { NULL }, 1187, "tcp" },
+ { "alias", { NULL }, 1187, "udp" },
+ { "hp-webadmin", { NULL }, 1188, "tcp" },
+ { "hp-webadmin", { NULL }, 1188, "udp" },
+ { "unet", { NULL }, 1189, "tcp" },
+ { "unet", { NULL }, 1189, "udp" },
+ { "commlinx-avl", { NULL }, 1190, "tcp" },
+ { "commlinx-avl", { NULL }, 1190, "udp" },
+ { "gpfs", { NULL }, 1191, "tcp" },
+ { "gpfs", { NULL }, 1191, "udp" },
+ { "caids-sensor", { NULL }, 1192, "tcp" },
+ { "caids-sensor", { NULL }, 1192, "udp" },
+ { "fiveacross", { NULL }, 1193, "tcp" },
+ { "fiveacross", { NULL }, 1193, "udp" },
+ { "openvpn", { NULL }, 1194, "tcp" },
+ { "openvpn", { NULL }, 1194, "udp" },
+ { "rsf-1", { NULL }, 1195, "tcp" },
+ { "rsf-1", { NULL }, 1195, "udp" },
+ { "netmagic", { NULL }, 1196, "tcp" },
+ { "netmagic", { NULL }, 1196, "udp" },
+ { "carrius-rshell", { NULL }, 1197, "tcp" },
+ { "carrius-rshell", { NULL }, 1197, "udp" },
+ { "cajo-discovery", { NULL }, 1198, "tcp" },
+ { "cajo-discovery", { NULL }, 1198, "udp" },
+ { "dmidi", { NULL }, 1199, "tcp" },
+ { "dmidi", { NULL }, 1199, "udp" },
+ { "scol", { NULL }, 1200, "tcp" },
+ { "scol", { NULL }, 1200, "udp" },
+ { "nucleus-sand", { NULL }, 1201, "tcp" },
+ { "nucleus-sand", { NULL }, 1201, "udp" },
+ { "caiccipc", { NULL }, 1202, "tcp" },
+ { "caiccipc", { NULL }, 1202, "udp" },
+ { "ssslic-mgr", { NULL }, 1203, "tcp" },
+ { "ssslic-mgr", { NULL }, 1203, "udp" },
+ { "ssslog-mgr", { NULL }, 1204, "tcp" },
+ { "ssslog-mgr", { NULL }, 1204, "udp" },
+ { "accord-mgc", { NULL }, 1205, "tcp" },
+ { "accord-mgc", { NULL }, 1205, "udp" },
+ { "anthony-data", { NULL }, 1206, "tcp" },
+ { "anthony-data", { NULL }, 1206, "udp" },
+ { "metasage", { NULL }, 1207, "tcp" },
+ { "metasage", { NULL }, 1207, "udp" },
+ { "seagull-ais", { NULL }, 1208, "tcp" },
+ { "seagull-ais", { NULL }, 1208, "udp" },
+ { "ipcd3", { NULL }, 1209, "tcp" },
+ { "ipcd3", { NULL }, 1209, "udp" },
+ { "eoss", { NULL }, 1210, "tcp" },
+ { "eoss", { NULL }, 1210, "udp" },
+ { "groove-dpp", { NULL }, 1211, "tcp" },
+ { "groove-dpp", { NULL }, 1211, "udp" },
+ { "lupa", { NULL }, 1212, "tcp" },
+ { "lupa", { NULL }, 1212, "udp" },
+ { "mpc-lifenet", { NULL }, 1213, "tcp" },
+ { "mpc-lifenet", { NULL }, 1213, "udp" },
+ { "kazaa", { NULL }, 1214, "tcp" },
+ { "kazaa", { NULL }, 1214, "udp" },
+ { "scanstat-1", { NULL }, 1215, "tcp" },
+ { "scanstat-1", { NULL }, 1215, "udp" },
+ { "etebac5", { NULL }, 1216, "tcp" },
+ { "etebac5", { NULL }, 1216, "udp" },
+ { "hpss-ndapi", { NULL }, 1217, "tcp" },
+ { "hpss-ndapi", { NULL }, 1217, "udp" },
+ { "aeroflight-ads", { NULL }, 1218, "tcp" },
+ { "aeroflight-ads", { NULL }, 1218, "udp" },
+ { "aeroflight-ret", { NULL }, 1219, "tcp" },
+ { "aeroflight-ret", { NULL }, 1219, "udp" },
+ { "qt-serveradmin", { NULL }, 1220, "tcp" },
+ { "qt-serveradmin", { NULL }, 1220, "udp" },
+ { "sweetware-apps", { NULL }, 1221, "tcp" },
+ { "sweetware-apps", { NULL }, 1221, "udp" },
+ { "nerv", { NULL }, 1222, "tcp" },
+ { "nerv", { NULL }, 1222, "udp" },
+ { "tgp", { NULL }, 1223, "tcp" },
+ { "tgp", { NULL }, 1223, "udp" },
+ { "vpnz", { NULL }, 1224, "tcp" },
+ { "vpnz", { NULL }, 1224, "udp" },
+ { "slinkysearch", { NULL }, 1225, "tcp" },
+ { "slinkysearch", { NULL }, 1225, "udp" },
+ { "stgxfws", { NULL }, 1226, "tcp" },
+ { "stgxfws", { NULL }, 1226, "udp" },
+ { "dns2go", { NULL }, 1227, "tcp" },
+ { "dns2go", { NULL }, 1227, "udp" },
+ { "florence", { NULL }, 1228, "tcp" },
+ { "florence", { NULL }, 1228, "udp" },
+ { "zented", { NULL }, 1229, "tcp" },
+ { "zented", { NULL }, 1229, "udp" },
+ { "periscope", { NULL }, 1230, "tcp" },
+ { "periscope", { NULL }, 1230, "udp" },
+ { "menandmice-lpm", { NULL }, 1231, "tcp" },
+ { "menandmice-lpm", { NULL }, 1231, "udp" },
+ { "univ-appserver", { NULL }, 1233, "tcp" },
+ { "univ-appserver", { NULL }, 1233, "udp" },
+ { "search-agent", { NULL }, 1234, "tcp" },
+ { "search-agent", { NULL }, 1234, "udp" },
+ { "mosaicsyssvc1", { NULL }, 1235, "tcp" },
+ { "mosaicsyssvc1", { NULL }, 1235, "udp" },
+ { "bvcontrol", { NULL }, 1236, "tcp" },
+ { "bvcontrol", { NULL }, 1236, "udp" },
+ { "tsdos390", { NULL }, 1237, "tcp" },
+ { "tsdos390", { NULL }, 1237, "udp" },
+ { "hacl-qs", { NULL }, 1238, "tcp" },
+ { "hacl-qs", { NULL }, 1238, "udp" },
+ { "nmsd", { NULL }, 1239, "tcp" },
+ { "nmsd", { NULL }, 1239, "udp" },
+ { "instantia", { NULL }, 1240, "tcp" },
+ { "instantia", { NULL }, 1240, "udp" },
+ { "nessus", { NULL }, 1241, "tcp" },
+ { "nessus", { NULL }, 1241, "udp" },
+ { "nmasoverip", { NULL }, 1242, "tcp" },
+ { "nmasoverip", { NULL }, 1242, "udp" },
+ { "serialgateway", { NULL }, 1243, "tcp" },
+ { "serialgateway", { NULL }, 1243, "udp" },
+ { "isbconference1", { NULL }, 1244, "tcp" },
+ { "isbconference1", { NULL }, 1244, "udp" },
+ { "isbconference2", { NULL }, 1245, "tcp" },
+ { "isbconference2", { NULL }, 1245, "udp" },
+ { "payrouter", { NULL }, 1246, "tcp" },
+ { "payrouter", { NULL }, 1246, "udp" },
+ { "visionpyramid", { NULL }, 1247, "tcp" },
+ { "visionpyramid", { NULL }, 1247, "udp" },
+ { "hermes", { NULL }, 1248, "tcp" },
+ { "hermes", { NULL }, 1248, "udp" },
+ { "mesavistaco", { NULL }, 1249, "tcp" },
+ { "mesavistaco", { NULL }, 1249, "udp" },
+ { "swldy-sias", { NULL }, 1250, "tcp" },
+ { "swldy-sias", { NULL }, 1250, "udp" },
+ { "servergraph", { NULL }, 1251, "tcp" },
+ { "servergraph", { NULL }, 1251, "udp" },
+ { "bspne-pcc", { NULL }, 1252, "tcp" },
+ { "bspne-pcc", { NULL }, 1252, "udp" },
+ { "q55-pcc", { NULL }, 1253, "tcp" },
+ { "q55-pcc", { NULL }, 1253, "udp" },
+ { "de-noc", { NULL }, 1254, "tcp" },
+ { "de-noc", { NULL }, 1254, "udp" },
+ { "de-cache-query", { NULL }, 1255, "tcp" },
+ { "de-cache-query", { NULL }, 1255, "udp" },
+ { "de-server", { NULL }, 1256, "tcp" },
+ { "de-server", { NULL }, 1256, "udp" },
+ { "shockwave2", { NULL }, 1257, "tcp" },
+ { "shockwave2", { NULL }, 1257, "udp" },
+ { "opennl", { NULL }, 1258, "tcp" },
+ { "opennl", { NULL }, 1258, "udp" },
+ { "opennl-voice", { NULL }, 1259, "tcp" },
+ { "opennl-voice", { NULL }, 1259, "udp" },
+ { "ibm-ssd", { NULL }, 1260, "tcp" },
+ { "ibm-ssd", { NULL }, 1260, "udp" },
+ { "mpshrsv", { NULL }, 1261, "tcp" },
+ { "mpshrsv", { NULL }, 1261, "udp" },
+ { "qnts-orb", { NULL }, 1262, "tcp" },
+ { "qnts-orb", { NULL }, 1262, "udp" },
+ { "dka", { NULL }, 1263, "tcp" },
+ { "dka", { NULL }, 1263, "udp" },
+ { "prat", { NULL }, 1264, "tcp" },
+ { "prat", { NULL }, 1264, "udp" },
+ { "dssiapi", { NULL }, 1265, "tcp" },
+ { "dssiapi", { NULL }, 1265, "udp" },
+ { "dellpwrappks", { NULL }, 1266, "tcp" },
+ { "dellpwrappks", { NULL }, 1266, "udp" },
+ { "epc", { NULL }, 1267, "tcp" },
+ { "epc", { NULL }, 1267, "udp" },
+ { "propel-msgsys", { NULL }, 1268, "tcp" },
+ { "propel-msgsys", { NULL }, 1268, "udp" },
+ { "watilapp", { NULL }, 1269, "tcp" },
+ { "watilapp", { NULL }, 1269, "udp" },
+ { "opsmgr", { NULL }, 1270, "tcp" },
+ { "opsmgr", { NULL }, 1270, "udp" },
+ { "excw", { NULL }, 1271, "tcp" },
+ { "excw", { NULL }, 1271, "udp" },
+ { "cspmlockmgr", { NULL }, 1272, "tcp" },
+ { "cspmlockmgr", { NULL }, 1272, "udp" },
+ { "emc-gateway", { NULL }, 1273, "tcp" },
+ { "emc-gateway", { NULL }, 1273, "udp" },
+ { "t1distproc", { NULL }, 1274, "tcp" },
+ { "t1distproc", { NULL }, 1274, "udp" },
+ { "ivcollector", { NULL }, 1275, "tcp" },
+ { "ivcollector", { NULL }, 1275, "udp" },
+ { "ivmanager", { NULL }, 1276, "tcp" },
+ { "ivmanager", { NULL }, 1276, "udp" },
+ { "miva-mqs", { NULL }, 1277, "tcp" },
+ { "miva-mqs", { NULL }, 1277, "udp" },
+ { "dellwebadmin-1", { NULL }, 1278, "tcp" },
+ { "dellwebadmin-1", { NULL }, 1278, "udp" },
+ { "dellwebadmin-2", { NULL }, 1279, "tcp" },
+ { "dellwebadmin-2", { NULL }, 1279, "udp" },
+ { "pictrography", { NULL }, 1280, "tcp" },
+ { "pictrography", { NULL }, 1280, "udp" },
+ { "healthd", { NULL }, 1281, "tcp" },
+ { "healthd", { NULL }, 1281, "udp" },
+ { "emperion", { NULL }, 1282, "tcp" },
+ { "emperion", { NULL }, 1282, "udp" },
+ { "productinfo", { NULL }, 1283, "tcp" },
+ { "productinfo", { NULL }, 1283, "udp" },
+ { "iee-qfx", { NULL }, 1284, "tcp" },
+ { "iee-qfx", { NULL }, 1284, "udp" },
+ { "neoiface", { NULL }, 1285, "tcp" },
+ { "neoiface", { NULL }, 1285, "udp" },
+ { "netuitive", { NULL }, 1286, "tcp" },
+ { "netuitive", { NULL }, 1286, "udp" },
+ { "routematch", { NULL }, 1287, "tcp" },
+ { "routematch", { NULL }, 1287, "udp" },
+ { "navbuddy", { NULL }, 1288, "tcp" },
+ { "navbuddy", { NULL }, 1288, "udp" },
+ { "jwalkserver", { NULL }, 1289, "tcp" },
+ { "jwalkserver", { NULL }, 1289, "udp" },
+ { "winjaserver", { NULL }, 1290, "tcp" },
+ { "winjaserver", { NULL }, 1290, "udp" },
+ { "seagulllms", { NULL }, 1291, "tcp" },
+ { "seagulllms", { NULL }, 1291, "udp" },
+ { "dsdn", { NULL }, 1292, "tcp" },
+ { "dsdn", { NULL }, 1292, "udp" },
+ { "pkt-krb-ipsec", { NULL }, 1293, "tcp" },
+ { "pkt-krb-ipsec", { NULL }, 1293, "udp" },
+ { "cmmdriver", { NULL }, 1294, "tcp" },
+ { "cmmdriver", { NULL }, 1294, "udp" },
+ { "ehtp", { NULL }, 1295, "tcp" },
+ { "ehtp", { NULL }, 1295, "udp" },
+ { "dproxy", { NULL }, 1296, "tcp" },
+ { "dproxy", { NULL }, 1296, "udp" },
+ { "sdproxy", { NULL }, 1297, "tcp" },
+ { "sdproxy", { NULL }, 1297, "udp" },
+ { "lpcp", { NULL }, 1298, "tcp" },
+ { "lpcp", { NULL }, 1298, "udp" },
+ { "hp-sci", { NULL }, 1299, "tcp" },
+ { "hp-sci", { NULL }, 1299, "udp" },
+ { "h323hostcallsc", { NULL }, 1300, "tcp" },
+ { "h323hostcallsc", { NULL }, 1300, "udp" },
+ { "ci3-software-1", { NULL }, 1301, "tcp" },
+ { "ci3-software-1", { NULL }, 1301, "udp" },
+ { "ci3-software-2", { NULL }, 1302, "tcp" },
+ { "ci3-software-2", { NULL }, 1302, "udp" },
+ { "sftsrv", { NULL }, 1303, "tcp" },
+ { "sftsrv", { NULL }, 1303, "udp" },
+ { "boomerang", { NULL }, 1304, "tcp" },
+ { "boomerang", { NULL }, 1304, "udp" },
+ { "pe-mike", { NULL }, 1305, "tcp" },
+ { "pe-mike", { NULL }, 1305, "udp" },
+ { "re-conn-proto", { NULL }, 1306, "tcp" },
+ { "re-conn-proto", { NULL }, 1306, "udp" },
+ { "pacmand", { NULL }, 1307, "tcp" },
+ { "pacmand", { NULL }, 1307, "udp" },
+ { "odsi", { NULL }, 1308, "tcp" },
+ { "odsi", { NULL }, 1308, "udp" },
+ { "jtag-server", { NULL }, 1309, "tcp" },
+ { "jtag-server", { NULL }, 1309, "udp" },
+ { "husky", { NULL }, 1310, "tcp" },
+ { "husky", { NULL }, 1310, "udp" },
+ { "rxmon", { NULL }, 1311, "tcp" },
+ { "rxmon", { NULL }, 1311, "udp" },
+ { "sti-envision", { NULL }, 1312, "tcp" },
+ { "sti-envision", { NULL }, 1312, "udp" },
+ { "bmc_patroldb", { NULL }, 1313, "tcp" },
+ { "bmc_patroldb", { NULL }, 1313, "udp" },
+ { "pdps", { NULL }, 1314, "tcp" },
+ { "pdps", { NULL }, 1314, "udp" },
+ { "els", { NULL }, 1315, "tcp" },
+ { "els", { NULL }, 1315, "udp" },
+ { "exbit-escp", { NULL }, 1316, "tcp" },
+ { "exbit-escp", { NULL }, 1316, "udp" },
+ { "vrts-ipcserver", { NULL }, 1317, "tcp" },
+ { "vrts-ipcserver", { NULL }, 1317, "udp" },
+ { "krb5gatekeeper", { NULL }, 1318, "tcp" },
+ { "krb5gatekeeper", { NULL }, 1318, "udp" },
+ { "amx-icsp", { NULL }, 1319, "tcp" },
+ { "amx-icsp", { NULL }, 1319, "udp" },
+ { "amx-axbnet", { NULL }, 1320, "tcp" },
+ { "amx-axbnet", { NULL }, 1320, "udp" },
+ { "pip", { NULL }, 1321, "tcp" },
+ { "pip", { NULL }, 1321, "udp" },
+ { "novation", { NULL }, 1322, "tcp" },
+ { "novation", { NULL }, 1322, "udp" },
+ { "brcd", { NULL }, 1323, "tcp" },
+ { "brcd", { NULL }, 1323, "udp" },
+ { "delta-mcp", { NULL }, 1324, "tcp" },
+ { "delta-mcp", { NULL }, 1324, "udp" },
+ { "dx-instrument", { NULL }, 1325, "tcp" },
+ { "dx-instrument", { NULL }, 1325, "udp" },
+ { "wimsic", { NULL }, 1326, "tcp" },
+ { "wimsic", { NULL }, 1326, "udp" },
+ { "ultrex", { NULL }, 1327, "tcp" },
+ { "ultrex", { NULL }, 1327, "udp" },
+ { "ewall", { NULL }, 1328, "tcp" },
+ { "ewall", { NULL }, 1328, "udp" },
+ { "netdb-export", { NULL }, 1329, "tcp" },
+ { "netdb-export", { NULL }, 1329, "udp" },
+ { "streetperfect", { NULL }, 1330, "tcp" },
+ { "streetperfect", { NULL }, 1330, "udp" },
+ { "intersan", { NULL }, 1331, "tcp" },
+ { "intersan", { NULL }, 1331, "udp" },
+ { "pcia-rxp-b", { NULL }, 1332, "tcp" },
+ { "pcia-rxp-b", { NULL }, 1332, "udp" },
+ { "passwrd-policy", { NULL }, 1333, "tcp" },
+ { "passwrd-policy", { NULL }, 1333, "udp" },
+ { "writesrv", { NULL }, 1334, "tcp" },
+ { "writesrv", { NULL }, 1334, "udp" },
+ { "digital-notary", { NULL }, 1335, "tcp" },
+ { "digital-notary", { NULL }, 1335, "udp" },
+ { "ischat", { NULL }, 1336, "tcp" },
+ { "ischat", { NULL }, 1336, "udp" },
+ { "menandmice-dns", { NULL }, 1337, "tcp" },
+ { "menandmice-dns", { NULL }, 1337, "udp" },
+ { "wmc-log-svc", { NULL }, 1338, "tcp" },
+ { "wmc-log-svc", { NULL }, 1338, "udp" },
+ { "kjtsiteserver", { NULL }, 1339, "tcp" },
+ { "kjtsiteserver", { NULL }, 1339, "udp" },
+ { "naap", { NULL }, 1340, "tcp" },
+ { "naap", { NULL }, 1340, "udp" },
+ { "qubes", { NULL }, 1341, "tcp" },
+ { "qubes", { NULL }, 1341, "udp" },
+ { "esbroker", { NULL }, 1342, "tcp" },
+ { "esbroker", { NULL }, 1342, "udp" },
+ { "re101", { NULL }, 1343, "tcp" },
+ { "re101", { NULL }, 1343, "udp" },
+ { "icap", { NULL }, 1344, "tcp" },
+ { "icap", { NULL }, 1344, "udp" },
+ { "vpjp", { NULL }, 1345, "tcp" },
+ { "vpjp", { NULL }, 1345, "udp" },
+ { "alta-ana-lm", { NULL }, 1346, "tcp" },
+ { "alta-ana-lm", { NULL }, 1346, "udp" },
+ { "bbn-mmc", { NULL }, 1347, "tcp" },
+ { "bbn-mmc", { NULL }, 1347, "udp" },
+ { "bbn-mmx", { NULL }, 1348, "tcp" },
+ { "bbn-mmx", { NULL }, 1348, "udp" },
+ { "sbook", { NULL }, 1349, "tcp" },
+ { "sbook", { NULL }, 1349, "udp" },
+ { "editbench", { NULL }, 1350, "tcp" },
+ { "editbench", { NULL }, 1350, "udp" },
+ { "equationbuilder", { NULL }, 1351, "tcp" },
+ { "equationbuilder", { NULL }, 1351, "udp" },
+ { "lotusnote", { NULL }, 1352, "tcp" },
+ { "lotusnote", { NULL }, 1352, "udp" },
+ { "relief", { NULL }, 1353, "tcp" },
+ { "relief", { NULL }, 1353, "udp" },
+ { "XSIP-network", { NULL }, 1354, "tcp" },
+ { "XSIP-network", { NULL }, 1354, "udp" },
+ { "intuitive-edge", { NULL }, 1355, "tcp" },
+ { "intuitive-edge", { NULL }, 1355, "udp" },
+ { "cuillamartin", { NULL }, 1356, "tcp" },
+ { "cuillamartin", { NULL }, 1356, "udp" },
+ { "pegboard", { NULL }, 1357, "tcp" },
+ { "pegboard", { NULL }, 1357, "udp" },
+ { "connlcli", { NULL }, 1358, "tcp" },
+ { "connlcli", { NULL }, 1358, "udp" },
+ { "ftsrv", { NULL }, 1359, "tcp" },
+ { "ftsrv", { NULL }, 1359, "udp" },
+ { "mimer", { NULL }, 1360, "tcp" },
+ { "mimer", { NULL }, 1360, "udp" },
+ { "linx", { NULL }, 1361, "tcp" },
+ { "linx", { NULL }, 1361, "udp" },
+ { "timeflies", { NULL }, 1362, "tcp" },
+ { "timeflies", { NULL }, 1362, "udp" },
+ { "ndm-requester", { NULL }, 1363, "tcp" },
+ { "ndm-requester", { NULL }, 1363, "udp" },
+ { "ndm-server", { NULL }, 1364, "tcp" },
+ { "ndm-server", { NULL }, 1364, "udp" },
+ { "adapt-sna", { NULL }, 1365, "tcp" },
+ { "adapt-sna", { NULL }, 1365, "udp" },
+ { "netware-csp", { NULL }, 1366, "tcp" },
+ { "netware-csp", { NULL }, 1366, "udp" },
+ { "dcs", { NULL }, 1367, "tcp" },
+ { "dcs", { NULL }, 1367, "udp" },
+ { "screencast", { NULL }, 1368, "tcp" },
+ { "screencast", { NULL }, 1368, "udp" },
+ { "gv-us", { NULL }, 1369, "tcp" },
+ { "gv-us", { NULL }, 1369, "udp" },
+ { "us-gv", { NULL }, 1370, "tcp" },
+ { "us-gv", { NULL }, 1370, "udp" },
+ { "fc-cli", { NULL }, 1371, "tcp" },
+ { "fc-cli", { NULL }, 1371, "udp" },
+ { "fc-ser", { NULL }, 1372, "tcp" },
+ { "fc-ser", { NULL }, 1372, "udp" },
+ { "chromagrafx", { NULL }, 1373, "tcp" },
+ { "chromagrafx", { NULL }, 1373, "udp" },
+ { "molly", { NULL }, 1374, "tcp" },
+ { "molly", { NULL }, 1374, "udp" },
+ { "bytex", { NULL }, 1375, "tcp" },
+ { "bytex", { NULL }, 1375, "udp" },
+ { "ibm-pps", { NULL }, 1376, "tcp" },
+ { "ibm-pps", { NULL }, 1376, "udp" },
+ { "cichlid", { NULL }, 1377, "tcp" },
+ { "cichlid", { NULL }, 1377, "udp" },
+ { "elan", { NULL }, 1378, "tcp" },
+ { "elan", { NULL }, 1378, "udp" },
+ { "dbreporter", { NULL }, 1379, "tcp" },
+ { "dbreporter", { NULL }, 1379, "udp" },
+ { "telesis-licman", { NULL }, 1380, "tcp" },
+ { "telesis-licman", { NULL }, 1380, "udp" },
+ { "apple-licman", { NULL }, 1381, "tcp" },
+ { "apple-licman", { NULL }, 1381, "udp" },
+ { "udt_os", { NULL }, 1382, "tcp" },
+ { "udt_os", { NULL }, 1382, "udp" },
+ { "gwha", { NULL }, 1383, "tcp" },
+ { "gwha", { NULL }, 1383, "udp" },
+ { "os-licman", { NULL }, 1384, "tcp" },
+ { "os-licman", { NULL }, 1384, "udp" },
+ { "atex_elmd", { NULL }, 1385, "tcp" },
+ { "atex_elmd", { NULL }, 1385, "udp" },
+ { "checksum", { NULL }, 1386, "tcp" },
+ { "checksum", { NULL }, 1386, "udp" },
+ { "cadsi-lm", { NULL }, 1387, "tcp" },
+ { "cadsi-lm", { NULL }, 1387, "udp" },
+ { "objective-dbc", { NULL }, 1388, "tcp" },
+ { "objective-dbc", { NULL }, 1388, "udp" },
+ { "iclpv-dm", { NULL }, 1389, "tcp" },
+ { "iclpv-dm", { NULL }, 1389, "udp" },
+ { "iclpv-sc", { NULL }, 1390, "tcp" },
+ { "iclpv-sc", { NULL }, 1390, "udp" },
+ { "iclpv-sas", { NULL }, 1391, "tcp" },
+ { "iclpv-sas", { NULL }, 1391, "udp" },
+ { "iclpv-pm", { NULL }, 1392, "tcp" },
+ { "iclpv-pm", { NULL }, 1392, "udp" },
+ { "iclpv-nls", { NULL }, 1393, "tcp" },
+ { "iclpv-nls", { NULL }, 1393, "udp" },
+ { "iclpv-nlc", { NULL }, 1394, "tcp" },
+ { "iclpv-nlc", { NULL }, 1394, "udp" },
+ { "iclpv-wsm", { NULL }, 1395, "tcp" },
+ { "iclpv-wsm", { NULL }, 1395, "udp" },
+ { "dvl-activemail", { NULL }, 1396, "tcp" },
+ { "dvl-activemail", { NULL }, 1396, "udp" },
+ { "audio-activmail", { NULL }, 1397, "tcp" },
+ { "audio-activmail", { NULL }, 1397, "udp" },
+ { "video-activmail", { NULL }, 1398, "tcp" },
+ { "video-activmail", { NULL }, 1398, "udp" },
+ { "cadkey-licman", { NULL }, 1399, "tcp" },
+ { "cadkey-licman", { NULL }, 1399, "udp" },
+ { "cadkey-tablet", { NULL }, 1400, "tcp" },
+ { "cadkey-tablet", { NULL }, 1400, "udp" },
+ { "goldleaf-licman", { NULL }, 1401, "tcp" },
+ { "goldleaf-licman", { NULL }, 1401, "udp" },
+ { "prm-sm-np", { NULL }, 1402, "tcp" },
+ { "prm-sm-np", { NULL }, 1402, "udp" },
+ { "prm-nm-np", { NULL }, 1403, "tcp" },
+ { "prm-nm-np", { NULL }, 1403, "udp" },
+ { "igi-lm", { NULL }, 1404, "tcp" },
+ { "igi-lm", { NULL }, 1404, "udp" },
+ { "ibm-res", { NULL }, 1405, "tcp" },
+ { "ibm-res", { NULL }, 1405, "udp" },
+ { "netlabs-lm", { NULL }, 1406, "tcp" },
+ { "netlabs-lm", { NULL }, 1406, "udp" },
+ { "dbsa-lm", { NULL }, 1407, "tcp" },
+ { "dbsa-lm", { NULL }, 1407, "udp" },
+ { "sophia-lm", { NULL }, 1408, "tcp" },
+ { "sophia-lm", { NULL }, 1408, "udp" },
+ { "here-lm", { NULL }, 1409, "tcp" },
+ { "here-lm", { NULL }, 1409, "udp" },
+ { "hiq", { NULL }, 1410, "tcp" },
+ { "hiq", { NULL }, 1410, "udp" },
+ { "af", { NULL }, 1411, "tcp" },
+ { "af", { NULL }, 1411, "udp" },
+ { "innosys", { NULL }, 1412, "tcp" },
+ { "innosys", { NULL }, 1412, "udp" },
+ { "innosys-acl", { NULL }, 1413, "tcp" },
+ { "innosys-acl", { NULL }, 1413, "udp" },
+ { "ibm-mqseries", { NULL }, 1414, "tcp" },
+ { "ibm-mqseries", { NULL }, 1414, "udp" },
+ { "dbstar", { NULL }, 1415, "tcp" },
+ { "dbstar", { NULL }, 1415, "udp" },
+ { "novell-lu6.2", { NULL }, 1416, "tcp" },
+ { "novell-lu6.2", { NULL }, 1416, "udp" },
+ { "timbuktu-srv1", { NULL }, 1417, "tcp" },
+ { "timbuktu-srv1", { NULL }, 1417, "udp" },
+ { "timbuktu-srv2", { NULL }, 1418, "tcp" },
+ { "timbuktu-srv2", { NULL }, 1418, "udp" },
+ { "timbuktu-srv3", { NULL }, 1419, "tcp" },
+ { "timbuktu-srv3", { NULL }, 1419, "udp" },
+ { "timbuktu-srv4", { NULL }, 1420, "tcp" },
+ { "timbuktu-srv4", { NULL }, 1420, "udp" },
+ { "gandalf-lm", { NULL }, 1421, "tcp" },
+ { "gandalf-lm", { NULL }, 1421, "udp" },
+ { "autodesk-lm", { NULL }, 1422, "tcp" },
+ { "autodesk-lm", { NULL }, 1422, "udp" },
+ { "essbase", { NULL }, 1423, "tcp" },
+ { "essbase", { NULL }, 1423, "udp" },
+ { "hybrid", { NULL }, 1424, "tcp" },
+ { "hybrid", { NULL }, 1424, "udp" },
+ { "zion-lm", { NULL }, 1425, "tcp" },
+ { "zion-lm", { NULL }, 1425, "udp" },
+ { "sais", { NULL }, 1426, "tcp" },
+ { "sais", { NULL }, 1426, "udp" },
+ { "mloadd", { NULL }, 1427, "tcp" },
+ { "mloadd", { NULL }, 1427, "udp" },
+ { "informatik-lm", { NULL }, 1428, "tcp" },
+ { "informatik-lm", { NULL }, 1428, "udp" },
+ { "nms", { NULL }, 1429, "tcp" },
+ { "nms", { NULL }, 1429, "udp" },
+ { "tpdu", { NULL }, 1430, "tcp" },
+ { "tpdu", { NULL }, 1430, "udp" },
+ { "rgtp", { NULL }, 1431, "tcp" },
+ { "rgtp", { NULL }, 1431, "udp" },
+ { "blueberry-lm", { NULL }, 1432, "tcp" },
+ { "blueberry-lm", { NULL }, 1432, "udp" },
+ { "ms-sql-s", { NULL }, 1433, "tcp" },
+ { "ms-sql-s", { NULL }, 1433, "udp" },
+ { "ms-sql-m", { NULL }, 1434, "tcp" },
+ { "ms-sql-m", { NULL }, 1434, "udp" },
+ { "ibm-cics", { NULL }, 1435, "tcp" },
+ { "ibm-cics", { NULL }, 1435, "udp" },
+ { "saism", { NULL }, 1436, "tcp" },
+ { "saism", { NULL }, 1436, "udp" },
+ { "tabula", { NULL }, 1437, "tcp" },
+ { "tabula", { NULL }, 1437, "udp" },
+ { "eicon-server", { NULL }, 1438, "tcp" },
+ { "eicon-server", { NULL }, 1438, "udp" },
+ { "eicon-x25", { NULL }, 1439, "tcp" },
+ { "eicon-x25", { NULL }, 1439, "udp" },
+ { "eicon-slp", { NULL }, 1440, "tcp" },
+ { "eicon-slp", { NULL }, 1440, "udp" },
+ { "cadis-1", { NULL }, 1441, "tcp" },
+ { "cadis-1", { NULL }, 1441, "udp" },
+ { "cadis-2", { NULL }, 1442, "tcp" },
+ { "cadis-2", { NULL }, 1442, "udp" },
+ { "ies-lm", { NULL }, 1443, "tcp" },
+ { "ies-lm", { NULL }, 1443, "udp" },
+ { "marcam-lm", { NULL }, 1444, "tcp" },
+ { "marcam-lm", { NULL }, 1444, "udp" },
+ { "proxima-lm", { NULL }, 1445, "tcp" },
+ { "proxima-lm", { NULL }, 1445, "udp" },
+ { "ora-lm", { NULL }, 1446, "tcp" },
+ { "ora-lm", { NULL }, 1446, "udp" },
+ { "apri-lm", { NULL }, 1447, "tcp" },
+ { "apri-lm", { NULL }, 1447, "udp" },
+ { "oc-lm", { NULL }, 1448, "tcp" },
+ { "oc-lm", { NULL }, 1448, "udp" },
+ { "peport", { NULL }, 1449, "tcp" },
+ { "peport", { NULL }, 1449, "udp" },
+ { "dwf", { NULL }, 1450, "tcp" },
+ { "dwf", { NULL }, 1450, "udp" },
+ { "infoman", { NULL }, 1451, "tcp" },
+ { "infoman", { NULL }, 1451, "udp" },
+ { "gtegsc-lm", { NULL }, 1452, "tcp" },
+ { "gtegsc-lm", { NULL }, 1452, "udp" },
+ { "genie-lm", { NULL }, 1453, "tcp" },
+ { "genie-lm", { NULL }, 1453, "udp" },
+ { "interhdl_elmd", { NULL }, 1454, "tcp" },
+ { "interhdl_elmd", { NULL }, 1454, "udp" },
+ { "esl-lm", { NULL }, 1455, "tcp" },
+ { "esl-lm", { NULL }, 1455, "udp" },
+ { "dca", { NULL }, 1456, "tcp" },
+ { "dca", { NULL }, 1456, "udp" },
+ { "valisys-lm", { NULL }, 1457, "tcp" },
+ { "valisys-lm", { NULL }, 1457, "udp" },
+ { "nrcabq-lm", { NULL }, 1458, "tcp" },
+ { "nrcabq-lm", { NULL }, 1458, "udp" },
+ { "proshare1", { NULL }, 1459, "tcp" },
+ { "proshare1", { NULL }, 1459, "udp" },
+ { "proshare2", { NULL }, 1460, "tcp" },
+ { "proshare2", { NULL }, 1460, "udp" },
+ { "ibm_wrless_lan", { NULL }, 1461, "tcp" },
+ { "ibm_wrless_lan", { NULL }, 1461, "udp" },
+ { "world-lm", { NULL }, 1462, "tcp" },
+ { "world-lm", { NULL }, 1462, "udp" },
+ { "nucleus", { NULL }, 1463, "tcp" },
+ { "nucleus", { NULL }, 1463, "udp" },
+ { "msl_lmd", { NULL }, 1464, "tcp" },
+ { "msl_lmd", { NULL }, 1464, "udp" },
+ { "pipes", { NULL }, 1465, "tcp" },
+ { "pipes", { NULL }, 1465, "udp" },
+ { "oceansoft-lm", { NULL }, 1466, "tcp" },
+ { "oceansoft-lm", { NULL }, 1466, "udp" },
+ { "csdmbase", { NULL }, 1467, "tcp" },
+ { "csdmbase", { NULL }, 1467, "udp" },
+ { "csdm", { NULL }, 1468, "tcp" },
+ { "csdm", { NULL }, 1468, "udp" },
+ { "aal-lm", { NULL }, 1469, "tcp" },
+ { "aal-lm", { NULL }, 1469, "udp" },
+ { "uaiact", { NULL }, 1470, "tcp" },
+ { "uaiact", { NULL }, 1470, "udp" },
+ { "csdmbase", { NULL }, 1471, "tcp" },
+ { "csdmbase", { NULL }, 1471, "udp" },
+ { "csdm", { NULL }, 1472, "tcp" },
+ { "csdm", { NULL }, 1472, "udp" },
+ { "openmath", { NULL }, 1473, "tcp" },
+ { "openmath", { NULL }, 1473, "udp" },
+ { "telefinder", { NULL }, 1474, "tcp" },
+ { "telefinder", { NULL }, 1474, "udp" },
+ { "taligent-lm", { NULL }, 1475, "tcp" },
+ { "taligent-lm", { NULL }, 1475, "udp" },
+ { "clvm-cfg", { NULL }, 1476, "tcp" },
+ { "clvm-cfg", { NULL }, 1476, "udp" },
+ { "ms-sna-server", { NULL }, 1477, "tcp" },
+ { "ms-sna-server", { NULL }, 1477, "udp" },
+ { "ms-sna-base", { NULL }, 1478, "tcp" },
+ { "ms-sna-base", { NULL }, 1478, "udp" },
+ { "dberegister", { NULL }, 1479, "tcp" },
+ { "dberegister", { NULL }, 1479, "udp" },
+ { "pacerforum", { NULL }, 1480, "tcp" },
+ { "pacerforum", { NULL }, 1480, "udp" },
+ { "airs", { NULL }, 1481, "tcp" },
+ { "airs", { NULL }, 1481, "udp" },
+ { "miteksys-lm", { NULL }, 1482, "tcp" },
+ { "miteksys-lm", { NULL }, 1482, "udp" },
+ { "afs", { NULL }, 1483, "tcp" },
+ { "afs", { NULL }, 1483, "udp" },
+ { "confluent", { NULL }, 1484, "tcp" },
+ { "confluent", { NULL }, 1484, "udp" },
+ { "lansource", { NULL }, 1485, "tcp" },
+ { "lansource", { NULL }, 1485, "udp" },
+ { "nms_topo_serv", { NULL }, 1486, "tcp" },
+ { "nms_topo_serv", { NULL }, 1486, "udp" },
+ { "localinfosrvr", { NULL }, 1487, "tcp" },
+ { "localinfosrvr", { NULL }, 1487, "udp" },
+ { "docstor", { NULL }, 1488, "tcp" },
+ { "docstor", { NULL }, 1488, "udp" },
+ { "dmdocbroker", { NULL }, 1489, "tcp" },
+ { "dmdocbroker", { NULL }, 1489, "udp" },
+ { "insitu-conf", { NULL }, 1490, "tcp" },
+ { "insitu-conf", { NULL }, 1490, "udp" },
+ { "stone-design-1", { NULL }, 1492, "tcp" },
+ { "stone-design-1", { NULL }, 1492, "udp" },
+ { "netmap_lm", { NULL }, 1493, "tcp" },
+ { "netmap_lm", { NULL }, 1493, "udp" },
+ { "ica", { NULL }, 1494, "tcp" },
+ { "ica", { NULL }, 1494, "udp" },
+ { "cvc", { NULL }, 1495, "tcp" },
+ { "cvc", { NULL }, 1495, "udp" },
+ { "liberty-lm", { NULL }, 1496, "tcp" },
+ { "liberty-lm", { NULL }, 1496, "udp" },
+ { "rfx-lm", { NULL }, 1497, "tcp" },
+ { "rfx-lm", { NULL }, 1497, "udp" },
+ { "sybase-sqlany", { NULL }, 1498, "tcp" },
+ { "sybase-sqlany", { NULL }, 1498, "udp" },
+ { "fhc", { NULL }, 1499, "tcp" },
+ { "fhc", { NULL }, 1499, "udp" },
+ { "vlsi-lm", { NULL }, 1500, "tcp" },
+ { "vlsi-lm", { NULL }, 1500, "udp" },
+ { "saiscm", { NULL }, 1501, "tcp" },
+ { "saiscm", { NULL }, 1501, "udp" },
+ { "shivadiscovery", { NULL }, 1502, "tcp" },
+ { "shivadiscovery", { NULL }, 1502, "udp" },
+ { "imtc-mcs", { NULL }, 1503, "tcp" },
+ { "imtc-mcs", { NULL }, 1503, "udp" },
+ { "evb-elm", { NULL }, 1504, "tcp" },
+ { "evb-elm", { NULL }, 1504, "udp" },
+ { "funkproxy", { NULL }, 1505, "tcp" },
+ { "funkproxy", { NULL }, 1505, "udp" },
+ { "utcd", { NULL }, 1506, "tcp" },
+ { "utcd", { NULL }, 1506, "udp" },
+ { "symplex", { NULL }, 1507, "tcp" },
+ { "symplex", { NULL }, 1507, "udp" },
+ { "diagmond", { NULL }, 1508, "tcp" },
+ { "diagmond", { NULL }, 1508, "udp" },
+ { "robcad-lm", { NULL }, 1509, "tcp" },
+ { "robcad-lm", { NULL }, 1509, "udp" },
+ { "mvx-lm", { NULL }, 1510, "tcp" },
+ { "mvx-lm", { NULL }, 1510, "udp" },
+ { "3l-l1", { NULL }, 1511, "tcp" },
+ { "3l-l1", { NULL }, 1511, "udp" },
+ { "wins", { NULL }, 1512, "tcp" },
+ { "wins", { NULL }, 1512, "udp" },
+ { "fujitsu-dtc", { NULL }, 1513, "tcp" },
+ { "fujitsu-dtc", { NULL }, 1513, "udp" },
+ { "fujitsu-dtcns", { NULL }, 1514, "tcp" },
+ { "fujitsu-dtcns", { NULL }, 1514, "udp" },
+ { "ifor-protocol", { NULL }, 1515, "tcp" },
+ { "ifor-protocol", { NULL }, 1515, "udp" },
+ { "vpad", { NULL }, 1516, "tcp" },
+ { "vpad", { NULL }, 1516, "udp" },
+ { "vpac", { NULL }, 1517, "tcp" },
+ { "vpac", { NULL }, 1517, "udp" },
+ { "vpvd", { NULL }, 1518, "tcp" },
+ { "vpvd", { NULL }, 1518, "udp" },
+ { "vpvc", { NULL }, 1519, "tcp" },
+ { "vpvc", { NULL }, 1519, "udp" },
+ { "atm-zip-office", { NULL }, 1520, "tcp" },
+ { "atm-zip-office", { NULL }, 1520, "udp" },
+ { "ncube-lm", { NULL }, 1521, "tcp" },
+ { "ncube-lm", { NULL }, 1521, "udp" },
+ { "ricardo-lm", { NULL }, 1522, "tcp" },
+ { "ricardo-lm", { NULL }, 1522, "udp" },
+ { "cichild-lm", { NULL }, 1523, "tcp" },
+ { "cichild-lm", { NULL }, 1523, "udp" },
+ { "ingreslock", { NULL }, 1524, "tcp" },
+ { "ingreslock", { NULL }, 1524, "udp" },
+ { "orasrv", { NULL }, 1525, "tcp" },
+ { "orasrv", { NULL }, 1525, "udp" },
+ { "prospero-np", { NULL }, 1525, "tcp" },
+ { "prospero-np", { NULL }, 1525, "udp" },
+ { "pdap-np", { NULL }, 1526, "tcp" },
+ { "pdap-np", { NULL }, 1526, "udp" },
+ { "tlisrv", { NULL }, 1527, "tcp" },
+ { "tlisrv", { NULL }, 1527, "udp" },
+ { "coauthor", { NULL }, 1529, "tcp" },
+ { "coauthor", { NULL }, 1529, "udp" },
+ { "rap-service", { NULL }, 1530, "tcp" },
+ { "rap-service", { NULL }, 1530, "udp" },
+ { "rap-listen", { NULL }, 1531, "tcp" },
+ { "rap-listen", { NULL }, 1531, "udp" },
+ { "miroconnect", { NULL }, 1532, "tcp" },
+ { "miroconnect", { NULL }, 1532, "udp" },
+ { "virtual-places", { NULL }, 1533, "tcp" },
+ { "virtual-places", { NULL }, 1533, "udp" },
+ { "micromuse-lm", { NULL }, 1534, "tcp" },
+ { "micromuse-lm", { NULL }, 1534, "udp" },
+ { "ampr-info", { NULL }, 1535, "tcp" },
+ { "ampr-info", { NULL }, 1535, "udp" },
+ { "ampr-inter", { NULL }, 1536, "tcp" },
+ { "ampr-inter", { NULL }, 1536, "udp" },
+ { "sdsc-lm", { NULL }, 1537, "tcp" },
+ { "sdsc-lm", { NULL }, 1537, "udp" },
+ { "3ds-lm", { NULL }, 1538, "tcp" },
+ { "3ds-lm", { NULL }, 1538, "udp" },
+ { "intellistor-lm", { NULL }, 1539, "tcp" },
+ { "intellistor-lm", { NULL }, 1539, "udp" },
+ { "rds", { NULL }, 1540, "tcp" },
+ { "rds", { NULL }, 1540, "udp" },
+ { "rds2", { NULL }, 1541, "tcp" },
+ { "rds2", { NULL }, 1541, "udp" },
+ { "gridgen-elmd", { NULL }, 1542, "tcp" },
+ { "gridgen-elmd", { NULL }, 1542, "udp" },
+ { "simba-cs", { NULL }, 1543, "tcp" },
+ { "simba-cs", { NULL }, 1543, "udp" },
+ { "aspeclmd", { NULL }, 1544, "tcp" },
+ { "aspeclmd", { NULL }, 1544, "udp" },
+ { "vistium-share", { NULL }, 1545, "tcp" },
+ { "vistium-share", { NULL }, 1545, "udp" },
+ { "abbaccuray", { NULL }, 1546, "tcp" },
+ { "abbaccuray", { NULL }, 1546, "udp" },
+ { "laplink", { NULL }, 1547, "tcp" },
+ { "laplink", { NULL }, 1547, "udp" },
+ { "axon-lm", { NULL }, 1548, "tcp" },
+ { "axon-lm", { NULL }, 1548, "udp" },
+ { "shivahose", { NULL }, 1549, "tcp" },
+ { "shivasound", { NULL }, 1549, "udp" },
+ { "3m-image-lm", { NULL }, 1550, "tcp" },
+ { "3m-image-lm", { NULL }, 1550, "udp" },
+ { "hecmtl-db", { NULL }, 1551, "tcp" },
+ { "hecmtl-db", { NULL }, 1551, "udp" },
+ { "pciarray", { NULL }, 1552, "tcp" },
+ { "pciarray", { NULL }, 1552, "udp" },
+ { "sna-cs", { NULL }, 1553, "tcp" },
+ { "sna-cs", { NULL }, 1553, "udp" },
+ { "caci-lm", { NULL }, 1554, "tcp" },
+ { "caci-lm", { NULL }, 1554, "udp" },
+ { "livelan", { NULL }, 1555, "tcp" },
+ { "livelan", { NULL }, 1555, "udp" },
+ { "veritas_pbx", { NULL }, 1556, "tcp" },
+ { "veritas_pbx", { NULL }, 1556, "udp" },
+ { "arbortext-lm", { NULL }, 1557, "tcp" },
+ { "arbortext-lm", { NULL }, 1557, "udp" },
+ { "xingmpeg", { NULL }, 1558, "tcp" },
+ { "xingmpeg", { NULL }, 1558, "udp" },
+ { "web2host", { NULL }, 1559, "tcp" },
+ { "web2host", { NULL }, 1559, "udp" },
+ { "asci-val", { NULL }, 1560, "tcp" },
+ { "asci-val", { NULL }, 1560, "udp" },
+ { "facilityview", { NULL }, 1561, "tcp" },
+ { "facilityview", { NULL }, 1561, "udp" },
+ { "pconnectmgr", { NULL }, 1562, "tcp" },
+ { "pconnectmgr", { NULL }, 1562, "udp" },
+ { "cadabra-lm", { NULL }, 1563, "tcp" },
+ { "cadabra-lm", { NULL }, 1563, "udp" },
+ { "pay-per-view", { NULL }, 1564, "tcp" },
+ { "pay-per-view", { NULL }, 1564, "udp" },
+ { "winddlb", { NULL }, 1565, "tcp" },
+ { "winddlb", { NULL }, 1565, "udp" },
+ { "corelvideo", { NULL }, 1566, "tcp" },
+ { "corelvideo", { NULL }, 1566, "udp" },
+ { "jlicelmd", { NULL }, 1567, "tcp" },
+ { "jlicelmd", { NULL }, 1567, "udp" },
+ { "tsspmap", { NULL }, 1568, "tcp" },
+ { "tsspmap", { NULL }, 1568, "udp" },
+ { "ets", { NULL }, 1569, "tcp" },
+ { "ets", { NULL }, 1569, "udp" },
+ { "orbixd", { NULL }, 1570, "tcp" },
+ { "orbixd", { NULL }, 1570, "udp" },
+ { "rdb-dbs-disp", { NULL }, 1571, "tcp" },
+ { "rdb-dbs-disp", { NULL }, 1571, "udp" },
+ { "chip-lm", { NULL }, 1572, "tcp" },
+ { "chip-lm", { NULL }, 1572, "udp" },
+ { "itscomm-ns", { NULL }, 1573, "tcp" },
+ { "itscomm-ns", { NULL }, 1573, "udp" },
+ { "mvel-lm", { NULL }, 1574, "tcp" },
+ { "mvel-lm", { NULL }, 1574, "udp" },
+ { "oraclenames", { NULL }, 1575, "tcp" },
+ { "oraclenames", { NULL }, 1575, "udp" },
+ { "moldflow-lm", { NULL }, 1576, "tcp" },
+ { "moldflow-lm", { NULL }, 1576, "udp" },
+ { "hypercube-lm", { NULL }, 1577, "tcp" },
+ { "hypercube-lm", { NULL }, 1577, "udp" },
+ { "jacobus-lm", { NULL }, 1578, "tcp" },
+ { "jacobus-lm", { NULL }, 1578, "udp" },
+ { "ioc-sea-lm", { NULL }, 1579, "tcp" },
+ { "ioc-sea-lm", { NULL }, 1579, "udp" },
+ { "tn-tl-r1", { NULL }, 1580, "tcp" },
+ { "tn-tl-r2", { NULL }, 1580, "udp" },
+ { "mil-2045-47001", { NULL }, 1581, "tcp" },
+ { "mil-2045-47001", { NULL }, 1581, "udp" },
+ { "msims", { NULL }, 1582, "tcp" },
+ { "msims", { NULL }, 1582, "udp" },
+ { "simbaexpress", { NULL }, 1583, "tcp" },
+ { "simbaexpress", { NULL }, 1583, "udp" },
+ { "tn-tl-fd2", { NULL }, 1584, "tcp" },
+ { "tn-tl-fd2", { NULL }, 1584, "udp" },
+ { "intv", { NULL }, 1585, "tcp" },
+ { "intv", { NULL }, 1585, "udp" },
+ { "ibm-abtact", { NULL }, 1586, "tcp" },
+ { "ibm-abtact", { NULL }, 1586, "udp" },
+ { "pra_elmd", { NULL }, 1587, "tcp" },
+ { "pra_elmd", { NULL }, 1587, "udp" },
+ { "triquest-lm", { NULL }, 1588, "tcp" },
+ { "triquest-lm", { NULL }, 1588, "udp" },
+ { "vqp", { NULL }, 1589, "tcp" },
+ { "vqp", { NULL }, 1589, "udp" },
+ { "gemini-lm", { NULL }, 1590, "tcp" },
+ { "gemini-lm", { NULL }, 1590, "udp" },
+ { "ncpm-pm", { NULL }, 1591, "tcp" },
+ { "ncpm-pm", { NULL }, 1591, "udp" },
+ { "commonspace", { NULL }, 1592, "tcp" },
+ { "commonspace", { NULL }, 1592, "udp" },
+ { "mainsoft-lm", { NULL }, 1593, "tcp" },
+ { "mainsoft-lm", { NULL }, 1593, "udp" },
+ { "sixtrak", { NULL }, 1594, "tcp" },
+ { "sixtrak", { NULL }, 1594, "udp" },
+ { "radio", { NULL }, 1595, "tcp" },
+ { "radio", { NULL }, 1595, "udp" },
+ { "radio-sm", { NULL }, 1596, "tcp" },
+ { "radio-bc", { NULL }, 1596, "udp" },
+ { "orbplus-iiop", { NULL }, 1597, "tcp" },
+ { "orbplus-iiop", { NULL }, 1597, "udp" },
+ { "picknfs", { NULL }, 1598, "tcp" },
+ { "picknfs", { NULL }, 1598, "udp" },
+ { "simbaservices", { NULL }, 1599, "tcp" },
+ { "simbaservices", { NULL }, 1599, "udp" },
+ { "issd", { NULL }, 1600, "tcp" },
+ { "issd", { NULL }, 1600, "udp" },
+ { "aas", { NULL }, 1601, "tcp" },
+ { "aas", { NULL }, 1601, "udp" },
+ { "inspect", { NULL }, 1602, "tcp" },
+ { "inspect", { NULL }, 1602, "udp" },
+ { "picodbc", { NULL }, 1603, "tcp" },
+ { "picodbc", { NULL }, 1603, "udp" },
+ { "icabrowser", { NULL }, 1604, "tcp" },
+ { "icabrowser", { NULL }, 1604, "udp" },
+ { "slp", { NULL }, 1605, "tcp" },
+ { "slp", { NULL }, 1605, "udp" },
+ { "slm-api", { NULL }, 1606, "tcp" },
+ { "slm-api", { NULL }, 1606, "udp" },
+ { "stt", { NULL }, 1607, "tcp" },
+ { "stt", { NULL }, 1607, "udp" },
+ { "smart-lm", { NULL }, 1608, "tcp" },
+ { "smart-lm", { NULL }, 1608, "udp" },
+ { "isysg-lm", { NULL }, 1609, "tcp" },
+ { "isysg-lm", { NULL }, 1609, "udp" },
+ { "taurus-wh", { NULL }, 1610, "tcp" },
+ { "taurus-wh", { NULL }, 1610, "udp" },
+ { "ill", { NULL }, 1611, "tcp" },
+ { "ill", { NULL }, 1611, "udp" },
+ { "netbill-trans", { NULL }, 1612, "tcp" },
+ { "netbill-trans", { NULL }, 1612, "udp" },
+ { "netbill-keyrep", { NULL }, 1613, "tcp" },
+ { "netbill-keyrep", { NULL }, 1613, "udp" },
+ { "netbill-cred", { NULL }, 1614, "tcp" },
+ { "netbill-cred", { NULL }, 1614, "udp" },
+ { "netbill-auth", { NULL }, 1615, "tcp" },
+ { "netbill-auth", { NULL }, 1615, "udp" },
+ { "netbill-prod", { NULL }, 1616, "tcp" },
+ { "netbill-prod", { NULL }, 1616, "udp" },
+ { "nimrod-agent", { NULL }, 1617, "tcp" },
+ { "nimrod-agent", { NULL }, 1617, "udp" },
+ { "skytelnet", { NULL }, 1618, "tcp" },
+ { "skytelnet", { NULL }, 1618, "udp" },
+ { "xs-openstorage", { NULL }, 1619, "tcp" },
+ { "xs-openstorage", { NULL }, 1619, "udp" },
+ { "faxportwinport", { NULL }, 1620, "tcp" },
+ { "faxportwinport", { NULL }, 1620, "udp" },
+ { "softdataphone", { NULL }, 1621, "tcp" },
+ { "softdataphone", { NULL }, 1621, "udp" },
+ { "ontime", { NULL }, 1622, "tcp" },
+ { "ontime", { NULL }, 1622, "udp" },
+ { "jaleosnd", { NULL }, 1623, "tcp" },
+ { "jaleosnd", { NULL }, 1623, "udp" },
+ { "udp-sr-port", { NULL }, 1624, "tcp" },
+ { "udp-sr-port", { NULL }, 1624, "udp" },
+ { "svs-omagent", { NULL }, 1625, "tcp" },
+ { "svs-omagent", { NULL }, 1625, "udp" },
+ { "shockwave", { NULL }, 1626, "tcp" },
+ { "shockwave", { NULL }, 1626, "udp" },
+ { "t128-gateway", { NULL }, 1627, "tcp" },
+ { "t128-gateway", { NULL }, 1627, "udp" },
+ { "lontalk-norm", { NULL }, 1628, "tcp" },
+ { "lontalk-norm", { NULL }, 1628, "udp" },
+ { "lontalk-urgnt", { NULL }, 1629, "tcp" },
+ { "lontalk-urgnt", { NULL }, 1629, "udp" },
+ { "oraclenet8cman", { NULL }, 1630, "tcp" },
+ { "oraclenet8cman", { NULL }, 1630, "udp" },
+ { "visitview", { NULL }, 1631, "tcp" },
+ { "visitview", { NULL }, 1631, "udp" },
+ { "pammratc", { NULL }, 1632, "tcp" },
+ { "pammratc", { NULL }, 1632, "udp" },
+ { "pammrpc", { NULL }, 1633, "tcp" },
+ { "pammrpc", { NULL }, 1633, "udp" },
+ { "loaprobe", { NULL }, 1634, "tcp" },
+ { "loaprobe", { NULL }, 1634, "udp" },
+ { "edb-server1", { NULL }, 1635, "tcp" },
+ { "edb-server1", { NULL }, 1635, "udp" },
+ { "isdc", { NULL }, 1636, "tcp" },
+ { "isdc", { NULL }, 1636, "udp" },
+ { "islc", { NULL }, 1637, "tcp" },
+ { "islc", { NULL }, 1637, "udp" },
+ { "ismc", { NULL }, 1638, "tcp" },
+ { "ismc", { NULL }, 1638, "udp" },
+ { "cert-initiator", { NULL }, 1639, "tcp" },
+ { "cert-initiator", { NULL }, 1639, "udp" },
+ { "cert-responder", { NULL }, 1640, "tcp" },
+ { "cert-responder", { NULL }, 1640, "udp" },
+ { "invision", { NULL }, 1641, "tcp" },
+ { "invision", { NULL }, 1641, "udp" },
+ { "isis-am", { NULL }, 1642, "tcp" },
+ { "isis-am", { NULL }, 1642, "udp" },
+ { "isis-ambc", { NULL }, 1643, "tcp" },
+ { "isis-ambc", { NULL }, 1643, "udp" },
+ { "saiseh", { NULL }, 1644, "tcp" },
+ { "sightline", { NULL }, 1645, "tcp" },
+ { "sightline", { NULL }, 1645, "udp" },
+ { "sa-msg-port", { NULL }, 1646, "tcp" },
+ { "sa-msg-port", { NULL }, 1646, "udp" },
+ { "rsap", { NULL }, 1647, "tcp" },
+ { "rsap", { NULL }, 1647, "udp" },
+ { "concurrent-lm", { NULL }, 1648, "tcp" },
+ { "concurrent-lm", { NULL }, 1648, "udp" },
+ { "kermit", { NULL }, 1649, "tcp" },
+ { "kermit", { NULL }, 1649, "udp" },
+ { "nkd", { NULL }, 1650, "tcp" },
+ { "nkd", { NULL }, 1650, "udp" },
+ { "shiva_confsrvr", { NULL }, 1651, "tcp" },
+ { "shiva_confsrvr", { NULL }, 1651, "udp" },
+ { "xnmp", { NULL }, 1652, "tcp" },
+ { "xnmp", { NULL }, 1652, "udp" },
+ { "alphatech-lm", { NULL }, 1653, "tcp" },
+ { "alphatech-lm", { NULL }, 1653, "udp" },
+ { "stargatealerts", { NULL }, 1654, "tcp" },
+ { "stargatealerts", { NULL }, 1654, "udp" },
+ { "dec-mbadmin", { NULL }, 1655, "tcp" },
+ { "dec-mbadmin", { NULL }, 1655, "udp" },
+ { "dec-mbadmin-h", { NULL }, 1656, "tcp" },
+ { "dec-mbadmin-h", { NULL }, 1656, "udp" },
+ { "fujitsu-mmpdc", { NULL }, 1657, "tcp" },
+ { "fujitsu-mmpdc", { NULL }, 1657, "udp" },
+ { "sixnetudr", { NULL }, 1658, "tcp" },
+ { "sixnetudr", { NULL }, 1658, "udp" },
+ { "sg-lm", { NULL }, 1659, "tcp" },
+ { "sg-lm", { NULL }, 1659, "udp" },
+ { "skip-mc-gikreq", { NULL }, 1660, "tcp" },
+ { "skip-mc-gikreq", { NULL }, 1660, "udp" },
+ { "netview-aix-1", { NULL }, 1661, "tcp" },
+ { "netview-aix-1", { NULL }, 1661, "udp" },
+ { "netview-aix-2", { NULL }, 1662, "tcp" },
+ { "netview-aix-2", { NULL }, 1662, "udp" },
+ { "netview-aix-3", { NULL }, 1663, "tcp" },
+ { "netview-aix-3", { NULL }, 1663, "udp" },
+ { "netview-aix-4", { NULL }, 1664, "tcp" },
+ { "netview-aix-4", { NULL }, 1664, "udp" },
+ { "netview-aix-5", { NULL }, 1665, "tcp" },
+ { "netview-aix-5", { NULL }, 1665, "udp" },
+ { "netview-aix-6", { NULL }, 1666, "tcp" },
+ { "netview-aix-6", { NULL }, 1666, "udp" },
+ { "netview-aix-7", { NULL }, 1667, "tcp" },
+ { "netview-aix-7", { NULL }, 1667, "udp" },
+ { "netview-aix-8", { NULL }, 1668, "tcp" },
+ { "netview-aix-8", { NULL }, 1668, "udp" },
+ { "netview-aix-9", { NULL }, 1669, "tcp" },
+ { "netview-aix-9", { NULL }, 1669, "udp" },
+ { "netview-aix-10", { NULL }, 1670, "tcp" },
+ { "netview-aix-10", { NULL }, 1670, "udp" },
+ { "netview-aix-11", { NULL }, 1671, "tcp" },
+ { "netview-aix-11", { NULL }, 1671, "udp" },
+ { "netview-aix-12", { NULL }, 1672, "tcp" },
+ { "netview-aix-12", { NULL }, 1672, "udp" },
+ { "proshare-mc-1", { NULL }, 1673, "tcp" },
+ { "proshare-mc-1", { NULL }, 1673, "udp" },
+ { "proshare-mc-2", { NULL }, 1674, "tcp" },
+ { "proshare-mc-2", { NULL }, 1674, "udp" },
+ { "pdp", { NULL }, 1675, "tcp" },
+ { "pdp", { NULL }, 1675, "udp" },
+ { "netcomm1", { NULL }, 1676, "tcp" },
+ { "netcomm2", { NULL }, 1676, "udp" },
+ { "groupwise", { NULL }, 1677, "tcp" },
+ { "groupwise", { NULL }, 1677, "udp" },
+ { "prolink", { NULL }, 1678, "tcp" },
+ { "prolink", { NULL }, 1678, "udp" },
+ { "darcorp-lm", { NULL }, 1679, "tcp" },
+ { "darcorp-lm", { NULL }, 1679, "udp" },
+ { "microcom-sbp", { NULL }, 1680, "tcp" },
+ { "microcom-sbp", { NULL }, 1680, "udp" },
+ { "sd-elmd", { NULL }, 1681, "tcp" },
+ { "sd-elmd", { NULL }, 1681, "udp" },
+ { "lanyon-lantern", { NULL }, 1682, "tcp" },
+ { "lanyon-lantern", { NULL }, 1682, "udp" },
+ { "ncpm-hip", { NULL }, 1683, "tcp" },
+ { "ncpm-hip", { NULL }, 1683, "udp" },
+ { "snaresecure", { NULL }, 1684, "tcp" },
+ { "snaresecure", { NULL }, 1684, "udp" },
+ { "n2nremote", { NULL }, 1685, "tcp" },
+ { "n2nremote", { NULL }, 1685, "udp" },
+ { "cvmon", { NULL }, 1686, "tcp" },
+ { "cvmon", { NULL }, 1686, "udp" },
+ { "nsjtp-ctrl", { NULL }, 1687, "tcp" },
+ { "nsjtp-ctrl", { NULL }, 1687, "udp" },
+ { "nsjtp-data", { NULL }, 1688, "tcp" },
+ { "nsjtp-data", { NULL }, 1688, "udp" },
+ { "firefox", { NULL }, 1689, "tcp" },
+ { "firefox", { NULL }, 1689, "udp" },
+ { "ng-umds", { NULL }, 1690, "tcp" },
+ { "ng-umds", { NULL }, 1690, "udp" },
+ { "empire-empuma", { NULL }, 1691, "tcp" },
+ { "empire-empuma", { NULL }, 1691, "udp" },
+ { "sstsys-lm", { NULL }, 1692, "tcp" },
+ { "sstsys-lm", { NULL }, 1692, "udp" },
+ { "rrirtr", { NULL }, 1693, "tcp" },
+ { "rrirtr", { NULL }, 1693, "udp" },
+ { "rrimwm", { NULL }, 1694, "tcp" },
+ { "rrimwm", { NULL }, 1694, "udp" },
+ { "rrilwm", { NULL }, 1695, "tcp" },
+ { "rrilwm", { NULL }, 1695, "udp" },
+ { "rrifmm", { NULL }, 1696, "tcp" },
+ { "rrifmm", { NULL }, 1696, "udp" },
+ { "rrisat", { NULL }, 1697, "tcp" },
+ { "rrisat", { NULL }, 1697, "udp" },
+ { "rsvp-encap-1", { NULL }, 1698, "tcp" },
+ { "rsvp-encap-1", { NULL }, 1698, "udp" },
+ { "rsvp-encap-2", { NULL }, 1699, "tcp" },
+ { "rsvp-encap-2", { NULL }, 1699, "udp" },
+ { "mps-raft", { NULL }, 1700, "tcp" },
+ { "mps-raft", { NULL }, 1700, "udp" },
+ { "l2f", { NULL }, 1701, "tcp" },
+ { "l2f", { NULL }, 1701, "udp" },
+ { "l2tp", { NULL }, 1701, "tcp" },
+ { "l2tp", { NULL }, 1701, "udp" },
+ { "deskshare", { NULL }, 1702, "tcp" },
+ { "deskshare", { NULL }, 1702, "udp" },
+ { "hb-engine", { NULL }, 1703, "tcp" },
+ { "hb-engine", { NULL }, 1703, "udp" },
+ { "bcs-broker", { NULL }, 1704, "tcp" },
+ { "bcs-broker", { NULL }, 1704, "udp" },
+ { "slingshot", { NULL }, 1705, "tcp" },
+ { "slingshot", { NULL }, 1705, "udp" },
+ { "jetform", { NULL }, 1706, "tcp" },
+ { "jetform", { NULL }, 1706, "udp" },
+ { "vdmplay", { NULL }, 1707, "tcp" },
+ { "vdmplay", { NULL }, 1707, "udp" },
+ { "gat-lmd", { NULL }, 1708, "tcp" },
+ { "gat-lmd", { NULL }, 1708, "udp" },
+ { "centra", { NULL }, 1709, "tcp" },
+ { "centra", { NULL }, 1709, "udp" },
+ { "impera", { NULL }, 1710, "tcp" },
+ { "impera", { NULL }, 1710, "udp" },
+ { "pptconference", { NULL }, 1711, "tcp" },
+ { "pptconference", { NULL }, 1711, "udp" },
+ { "registrar", { NULL }, 1712, "tcp" },
+ { "registrar", { NULL }, 1712, "udp" },
+ { "conferencetalk", { NULL }, 1713, "tcp" },
+ { "conferencetalk", { NULL }, 1713, "udp" },
+ { "sesi-lm", { NULL }, 1714, "tcp" },
+ { "sesi-lm", { NULL }, 1714, "udp" },
+ { "houdini-lm", { NULL }, 1715, "tcp" },
+ { "houdini-lm", { NULL }, 1715, "udp" },
+ { "xmsg", { NULL }, 1716, "tcp" },
+ { "xmsg", { NULL }, 1716, "udp" },
+ { "fj-hdnet", { NULL }, 1717, "tcp" },
+ { "fj-hdnet", { NULL }, 1717, "udp" },
+ { "h323gatedisc", { NULL }, 1718, "tcp" },
+ { "h323gatedisc", { NULL }, 1718, "udp" },
+ { "h323gatestat", { NULL }, 1719, "tcp" },
+ { "h323gatestat", { NULL }, 1719, "udp" },
+ { "h323hostcall", { NULL }, 1720, "tcp" },
+ { "h323hostcall", { NULL }, 1720, "udp" },
+ { "caicci", { NULL }, 1721, "tcp" },
+ { "caicci", { NULL }, 1721, "udp" },
+ { "hks-lm", { NULL }, 1722, "tcp" },
+ { "hks-lm", { NULL }, 1722, "udp" },
+ { "pptp", { NULL }, 1723, "tcp" },
+ { "pptp", { NULL }, 1723, "udp" },
+ { "csbphonemaster", { NULL }, 1724, "tcp" },
+ { "csbphonemaster", { NULL }, 1724, "udp" },
+ { "iden-ralp", { NULL }, 1725, "tcp" },
+ { "iden-ralp", { NULL }, 1725, "udp" },
+ { "iberiagames", { NULL }, 1726, "tcp" },
+ { "iberiagames", { NULL }, 1726, "udp" },
+ { "winddx", { NULL }, 1727, "tcp" },
+ { "winddx", { NULL }, 1727, "udp" },
+ { "telindus", { NULL }, 1728, "tcp" },
+ { "telindus", { NULL }, 1728, "udp" },
+ { "citynl", { NULL }, 1729, "tcp" },
+ { "citynl", { NULL }, 1729, "udp" },
+ { "roketz", { NULL }, 1730, "tcp" },
+ { "roketz", { NULL }, 1730, "udp" },
+ { "msiccp", { NULL }, 1731, "tcp" },
+ { "msiccp", { NULL }, 1731, "udp" },
+ { "proxim", { NULL }, 1732, "tcp" },
+ { "proxim", { NULL }, 1732, "udp" },
+ { "siipat", { NULL }, 1733, "tcp" },
+ { "siipat", { NULL }, 1733, "udp" },
+ { "cambertx-lm", { NULL }, 1734, "tcp" },
+ { "cambertx-lm", { NULL }, 1734, "udp" },
+ { "privatechat", { NULL }, 1735, "tcp" },
+ { "privatechat", { NULL }, 1735, "udp" },
+ { "street-stream", { NULL }, 1736, "tcp" },
+ { "street-stream", { NULL }, 1736, "udp" },
+ { "ultimad", { NULL }, 1737, "tcp" },
+ { "ultimad", { NULL }, 1737, "udp" },
+ { "gamegen1", { NULL }, 1738, "tcp" },
+ { "gamegen1", { NULL }, 1738, "udp" },
+ { "webaccess", { NULL }, 1739, "tcp" },
+ { "webaccess", { NULL }, 1739, "udp" },
+ { "encore", { NULL }, 1740, "tcp" },
+ { "encore", { NULL }, 1740, "udp" },
+ { "cisco-net-mgmt", { NULL }, 1741, "tcp" },
+ { "cisco-net-mgmt", { NULL }, 1741, "udp" },
+ { "3Com-nsd", { NULL }, 1742, "tcp" },
+ { "3Com-nsd", { NULL }, 1742, "udp" },
+ { "cinegrfx-lm", { NULL }, 1743, "tcp" },
+ { "cinegrfx-lm", { NULL }, 1743, "udp" },
+ { "ncpm-ft", { NULL }, 1744, "tcp" },
+ { "ncpm-ft", { NULL }, 1744, "udp" },
+ { "remote-winsock", { NULL }, 1745, "tcp" },
+ { "remote-winsock", { NULL }, 1745, "udp" },
+ { "ftrapid-1", { NULL }, 1746, "tcp" },
+ { "ftrapid-1", { NULL }, 1746, "udp" },
+ { "ftrapid-2", { NULL }, 1747, "tcp" },
+ { "ftrapid-2", { NULL }, 1747, "udp" },
+ { "oracle-em1", { NULL }, 1748, "tcp" },
+ { "oracle-em1", { NULL }, 1748, "udp" },
+ { "aspen-services", { NULL }, 1749, "tcp" },
+ { "aspen-services", { NULL }, 1749, "udp" },
+ { "sslp", { NULL }, 1750, "tcp" },
+ { "sslp", { NULL }, 1750, "udp" },
+ { "swiftnet", { NULL }, 1751, "tcp" },
+ { "swiftnet", { NULL }, 1751, "udp" },
+ { "lofr-lm", { NULL }, 1752, "tcp" },
+ { "lofr-lm", { NULL }, 1752, "udp" },
+ { "oracle-em2", { NULL }, 1754, "tcp" },
+ { "oracle-em2", { NULL }, 1754, "udp" },
+ { "ms-streaming", { NULL }, 1755, "tcp" },
+ { "ms-streaming", { NULL }, 1755, "udp" },
+ { "capfast-lmd", { NULL }, 1756, "tcp" },
+ { "capfast-lmd", { NULL }, 1756, "udp" },
+ { "cnhrp", { NULL }, 1757, "tcp" },
+ { "cnhrp", { NULL }, 1757, "udp" },
+ { "tftp-mcast", { NULL }, 1758, "tcp" },
+ { "tftp-mcast", { NULL }, 1758, "udp" },
+ { "spss-lm", { NULL }, 1759, "tcp" },
+ { "spss-lm", { NULL }, 1759, "udp" },
+ { "www-ldap-gw", { NULL }, 1760, "tcp" },
+ { "www-ldap-gw", { NULL }, 1760, "udp" },
+ { "cft-0", { NULL }, 1761, "tcp" },
+ { "cft-0", { NULL }, 1761, "udp" },
+ { "cft-1", { NULL }, 1762, "tcp" },
+ { "cft-1", { NULL }, 1762, "udp" },
+ { "cft-2", { NULL }, 1763, "tcp" },
+ { "cft-2", { NULL }, 1763, "udp" },
+ { "cft-3", { NULL }, 1764, "tcp" },
+ { "cft-3", { NULL }, 1764, "udp" },
+ { "cft-4", { NULL }, 1765, "tcp" },
+ { "cft-4", { NULL }, 1765, "udp" },
+ { "cft-5", { NULL }, 1766, "tcp" },
+ { "cft-5", { NULL }, 1766, "udp" },
+ { "cft-6", { NULL }, 1767, "tcp" },
+ { "cft-6", { NULL }, 1767, "udp" },
+ { "cft-7", { NULL }, 1768, "tcp" },
+ { "cft-7", { NULL }, 1768, "udp" },
+ { "bmc-net-adm", { NULL }, 1769, "tcp" },
+ { "bmc-net-adm", { NULL }, 1769, "udp" },
+ { "bmc-net-svc", { NULL }, 1770, "tcp" },
+ { "bmc-net-svc", { NULL }, 1770, "udp" },
+ { "vaultbase", { NULL }, 1771, "tcp" },
+ { "vaultbase", { NULL }, 1771, "udp" },
+ { "essweb-gw", { NULL }, 1772, "tcp" },
+ { "essweb-gw", { NULL }, 1772, "udp" },
+ { "kmscontrol", { NULL }, 1773, "tcp" },
+ { "kmscontrol", { NULL }, 1773, "udp" },
+ { "global-dtserv", { NULL }, 1774, "tcp" },
+ { "global-dtserv", { NULL }, 1774, "udp" },
+ { "femis", { NULL }, 1776, "tcp" },
+ { "femis", { NULL }, 1776, "udp" },
+ { "powerguardian", { NULL }, 1777, "tcp" },
+ { "powerguardian", { NULL }, 1777, "udp" },
+ { "prodigy-intrnet", { NULL }, 1778, "tcp" },
+ { "prodigy-intrnet", { NULL }, 1778, "udp" },
+ { "pharmasoft", { NULL }, 1779, "tcp" },
+ { "pharmasoft", { NULL }, 1779, "udp" },
+ { "dpkeyserv", { NULL }, 1780, "tcp" },
+ { "dpkeyserv", { NULL }, 1780, "udp" },
+ { "answersoft-lm", { NULL }, 1781, "tcp" },
+ { "answersoft-lm", { NULL }, 1781, "udp" },
+ { "hp-hcip", { NULL }, 1782, "tcp" },
+ { "hp-hcip", { NULL }, 1782, "udp" },
+ { "finle-lm", { NULL }, 1784, "tcp" },
+ { "finle-lm", { NULL }, 1784, "udp" },
+ { "windlm", { NULL }, 1785, "tcp" },
+ { "windlm", { NULL }, 1785, "udp" },
+ { "funk-logger", { NULL }, 1786, "tcp" },
+ { "funk-logger", { NULL }, 1786, "udp" },
+ { "funk-license", { NULL }, 1787, "tcp" },
+ { "funk-license", { NULL }, 1787, "udp" },
+ { "psmond", { NULL }, 1788, "tcp" },
+ { "psmond", { NULL }, 1788, "udp" },
+ { "hello", { NULL }, 1789, "tcp" },
+ { "hello", { NULL }, 1789, "udp" },
+ { "nmsp", { NULL }, 1790, "tcp" },
+ { "nmsp", { NULL }, 1790, "udp" },
+ { "ea1", { NULL }, 1791, "tcp" },
+ { "ea1", { NULL }, 1791, "udp" },
+ { "ibm-dt-2", { NULL }, 1792, "tcp" },
+ { "ibm-dt-2", { NULL }, 1792, "udp" },
+ { "rsc-robot", { NULL }, 1793, "tcp" },
+ { "rsc-robot", { NULL }, 1793, "udp" },
+ { "cera-bcm", { NULL }, 1794, "tcp" },
+ { "cera-bcm", { NULL }, 1794, "udp" },
+ { "dpi-proxy", { NULL }, 1795, "tcp" },
+ { "dpi-proxy", { NULL }, 1795, "udp" },
+ { "vocaltec-admin", { NULL }, 1796, "tcp" },
+ { "vocaltec-admin", { NULL }, 1796, "udp" },
+ { "uma", { NULL }, 1797, "tcp" },
+ { "uma", { NULL }, 1797, "udp" },
+ { "etp", { NULL }, 1798, "tcp" },
+ { "etp", { NULL }, 1798, "udp" },
+ { "netrisk", { NULL }, 1799, "tcp" },
+ { "netrisk", { NULL }, 1799, "udp" },
+ { "ansys-lm", { NULL }, 1800, "tcp" },
+ { "ansys-lm", { NULL }, 1800, "udp" },
+ { "msmq", { NULL }, 1801, "tcp" },
+ { "msmq", { NULL }, 1801, "udp" },
+ { "concomp1", { NULL }, 1802, "tcp" },
+ { "concomp1", { NULL }, 1802, "udp" },
+ { "hp-hcip-gwy", { NULL }, 1803, "tcp" },
+ { "hp-hcip-gwy", { NULL }, 1803, "udp" },
+ { "enl", { NULL }, 1804, "tcp" },
+ { "enl", { NULL }, 1804, "udp" },
+ { "enl-name", { NULL }, 1805, "tcp" },
+ { "enl-name", { NULL }, 1805, "udp" },
+ { "musiconline", { NULL }, 1806, "tcp" },
+ { "musiconline", { NULL }, 1806, "udp" },
+ { "fhsp", { NULL }, 1807, "tcp" },
+ { "fhsp", { NULL }, 1807, "udp" },
+ { "oracle-vp2", { NULL }, 1808, "tcp" },
+ { "oracle-vp2", { NULL }, 1808, "udp" },
+ { "oracle-vp1", { NULL }, 1809, "tcp" },
+ { "oracle-vp1", { NULL }, 1809, "udp" },
+ { "jerand-lm", { NULL }, 1810, "tcp" },
+ { "jerand-lm", { NULL }, 1810, "udp" },
+ { "scientia-sdb", { NULL }, 1811, "tcp" },
+ { "scientia-sdb", { NULL }, 1811, "udp" },
+ { "radius", { NULL }, 1812, "tcp" },
+ { "radius", { NULL }, 1812, "udp" },
+ { "radius-acct", { NULL }, 1813, "tcp" },
+ { "radius-acct", { NULL }, 1813, "udp" },
+ { "tdp-suite", { NULL }, 1814, "tcp" },
+ { "tdp-suite", { NULL }, 1814, "udp" },
+ { "mmpft", { NULL }, 1815, "tcp" },
+ { "mmpft", { NULL }, 1815, "udp" },
+ { "harp", { NULL }, 1816, "tcp" },
+ { "harp", { NULL }, 1816, "udp" },
+ { "rkb-oscs", { NULL }, 1817, "tcp" },
+ { "rkb-oscs", { NULL }, 1817, "udp" },
+ { "etftp", { NULL }, 1818, "tcp" },
+ { "etftp", { NULL }, 1818, "udp" },
+ { "plato-lm", { NULL }, 1819, "tcp" },
+ { "plato-lm", { NULL }, 1819, "udp" },
+ { "mcagent", { NULL }, 1820, "tcp" },
+ { "mcagent", { NULL }, 1820, "udp" },
+ { "donnyworld", { NULL }, 1821, "tcp" },
+ { "donnyworld", { NULL }, 1821, "udp" },
+ { "es-elmd", { NULL }, 1822, "tcp" },
+ { "es-elmd", { NULL }, 1822, "udp" },
+ { "unisys-lm", { NULL }, 1823, "tcp" },
+ { "unisys-lm", { NULL }, 1823, "udp" },
+ { "metrics-pas", { NULL }, 1824, "tcp" },
+ { "metrics-pas", { NULL }, 1824, "udp" },
+ { "direcpc-video", { NULL }, 1825, "tcp" },
+ { "direcpc-video", { NULL }, 1825, "udp" },
+ { "ardt", { NULL }, 1826, "tcp" },
+ { "ardt", { NULL }, 1826, "udp" },
+ { "asi", { NULL }, 1827, "tcp" },
+ { "asi", { NULL }, 1827, "udp" },
+ { "itm-mcell-u", { NULL }, 1828, "tcp" },
+ { "itm-mcell-u", { NULL }, 1828, "udp" },
+ { "optika-emedia", { NULL }, 1829, "tcp" },
+ { "optika-emedia", { NULL }, 1829, "udp" },
+ { "net8-cman", { NULL }, 1830, "tcp" },
+ { "net8-cman", { NULL }, 1830, "udp" },
+ { "myrtle", { NULL }, 1831, "tcp" },
+ { "myrtle", { NULL }, 1831, "udp" },
+ { "tht-treasure", { NULL }, 1832, "tcp" },
+ { "tht-treasure", { NULL }, 1832, "udp" },
+ { "udpradio", { NULL }, 1833, "tcp" },
+ { "udpradio", { NULL }, 1833, "udp" },
+ { "ardusuni", { NULL }, 1834, "tcp" },
+ { "ardusuni", { NULL }, 1834, "udp" },
+ { "ardusmul", { NULL }, 1835, "tcp" },
+ { "ardusmul", { NULL }, 1835, "udp" },
+ { "ste-smsc", { NULL }, 1836, "tcp" },
+ { "ste-smsc", { NULL }, 1836, "udp" },
+ { "csoft1", { NULL }, 1837, "tcp" },
+ { "csoft1", { NULL }, 1837, "udp" },
+ { "talnet", { NULL }, 1838, "tcp" },
+ { "talnet", { NULL }, 1838, "udp" },
+ { "netopia-vo1", { NULL }, 1839, "tcp" },
+ { "netopia-vo1", { NULL }, 1839, "udp" },
+ { "netopia-vo2", { NULL }, 1840, "tcp" },
+ { "netopia-vo2", { NULL }, 1840, "udp" },
+ { "netopia-vo3", { NULL }, 1841, "tcp" },
+ { "netopia-vo3", { NULL }, 1841, "udp" },
+ { "netopia-vo4", { NULL }, 1842, "tcp" },
+ { "netopia-vo4", { NULL }, 1842, "udp" },
+ { "netopia-vo5", { NULL }, 1843, "tcp" },
+ { "netopia-vo5", { NULL }, 1843, "udp" },
+ { "direcpc-dll", { NULL }, 1844, "tcp" },
+ { "direcpc-dll", { NULL }, 1844, "udp" },
+ { "altalink", { NULL }, 1845, "tcp" },
+ { "altalink", { NULL }, 1845, "udp" },
+ { "tunstall-pnc", { NULL }, 1846, "tcp" },
+ { "tunstall-pnc", { NULL }, 1846, "udp" },
+ { "slp-notify", { NULL }, 1847, "tcp" },
+ { "slp-notify", { NULL }, 1847, "udp" },
+ { "fjdocdist", { NULL }, 1848, "tcp" },
+ { "fjdocdist", { NULL }, 1848, "udp" },
+ { "alpha-sms", { NULL }, 1849, "tcp" },
+ { "alpha-sms", { NULL }, 1849, "udp" },
+ { "gsi", { NULL }, 1850, "tcp" },
+ { "gsi", { NULL }, 1850, "udp" },
+ { "ctcd", { NULL }, 1851, "tcp" },
+ { "ctcd", { NULL }, 1851, "udp" },
+ { "virtual-time", { NULL }, 1852, "tcp" },
+ { "virtual-time", { NULL }, 1852, "udp" },
+ { "vids-avtp", { NULL }, 1853, "tcp" },
+ { "vids-avtp", { NULL }, 1853, "udp" },
+ { "buddy-draw", { NULL }, 1854, "tcp" },
+ { "buddy-draw", { NULL }, 1854, "udp" },
+ { "fiorano-rtrsvc", { NULL }, 1855, "tcp" },
+ { "fiorano-rtrsvc", { NULL }, 1855, "udp" },
+ { "fiorano-msgsvc", { NULL }, 1856, "tcp" },
+ { "fiorano-msgsvc", { NULL }, 1856, "udp" },
+ { "datacaptor", { NULL }, 1857, "tcp" },
+ { "datacaptor", { NULL }, 1857, "udp" },
+ { "privateark", { NULL }, 1858, "tcp" },
+ { "privateark", { NULL }, 1858, "udp" },
+ { "gammafetchsvr", { NULL }, 1859, "tcp" },
+ { "gammafetchsvr", { NULL }, 1859, "udp" },
+ { "sunscalar-svc", { NULL }, 1860, "tcp" },
+ { "sunscalar-svc", { NULL }, 1860, "udp" },
+ { "lecroy-vicp", { NULL }, 1861, "tcp" },
+ { "lecroy-vicp", { NULL }, 1861, "udp" },
+ { "mysql-cm-agent", { NULL }, 1862, "tcp" },
+ { "mysql-cm-agent", { NULL }, 1862, "udp" },
+ { "msnp", { NULL }, 1863, "tcp" },
+ { "msnp", { NULL }, 1863, "udp" },
+ { "paradym-31port", { NULL }, 1864, "tcp" },
+ { "paradym-31port", { NULL }, 1864, "udp" },
+ { "entp", { NULL }, 1865, "tcp" },
+ { "entp", { NULL }, 1865, "udp" },
+ { "swrmi", { NULL }, 1866, "tcp" },
+ { "swrmi", { NULL }, 1866, "udp" },
+ { "udrive", { NULL }, 1867, "tcp" },
+ { "udrive", { NULL }, 1867, "udp" },
+ { "viziblebrowser", { NULL }, 1868, "tcp" },
+ { "viziblebrowser", { NULL }, 1868, "udp" },
+ { "transact", { NULL }, 1869, "tcp" },
+ { "transact", { NULL }, 1869, "udp" },
+ { "sunscalar-dns", { NULL }, 1870, "tcp" },
+ { "sunscalar-dns", { NULL }, 1870, "udp" },
+ { "canocentral0", { NULL }, 1871, "tcp" },
+ { "canocentral0", { NULL }, 1871, "udp" },
+ { "canocentral1", { NULL }, 1872, "tcp" },
+ { "canocentral1", { NULL }, 1872, "udp" },
+ { "fjmpjps", { NULL }, 1873, "tcp" },
+ { "fjmpjps", { NULL }, 1873, "udp" },
+ { "fjswapsnp", { NULL }, 1874, "tcp" },
+ { "fjswapsnp", { NULL }, 1874, "udp" },
+ { "westell-stats", { NULL }, 1875, "tcp" },
+ { "westell-stats", { NULL }, 1875, "udp" },
+ { "ewcappsrv", { NULL }, 1876, "tcp" },
+ { "ewcappsrv", { NULL }, 1876, "udp" },
+ { "hp-webqosdb", { NULL }, 1877, "tcp" },
+ { "hp-webqosdb", { NULL }, 1877, "udp" },
+ { "drmsmc", { NULL }, 1878, "tcp" },
+ { "drmsmc", { NULL }, 1878, "udp" },
+ { "nettgain-nms", { NULL }, 1879, "tcp" },
+ { "nettgain-nms", { NULL }, 1879, "udp" },
+ { "vsat-control", { NULL }, 1880, "tcp" },
+ { "vsat-control", { NULL }, 1880, "udp" },
+ { "ibm-mqseries2", { NULL }, 1881, "tcp" },
+ { "ibm-mqseries2", { NULL }, 1881, "udp" },
+ { "ecsqdmn", { NULL }, 1882, "tcp" },
+ { "ecsqdmn", { NULL }, 1882, "udp" },
+ { "ibm-mqisdp", { NULL }, 1883, "tcp" },
+ { "ibm-mqisdp", { NULL }, 1883, "udp" },
+ { "idmaps", { NULL }, 1884, "tcp" },
+ { "idmaps", { NULL }, 1884, "udp" },
+ { "vrtstrapserver", { NULL }, 1885, "tcp" },
+ { "vrtstrapserver", { NULL }, 1885, "udp" },
+ { "leoip", { NULL }, 1886, "tcp" },
+ { "leoip", { NULL }, 1886, "udp" },
+ { "filex-lport", { NULL }, 1887, "tcp" },
+ { "filex-lport", { NULL }, 1887, "udp" },
+ { "ncconfig", { NULL }, 1888, "tcp" },
+ { "ncconfig", { NULL }, 1888, "udp" },
+ { "unify-adapter", { NULL }, 1889, "tcp" },
+ { "unify-adapter", { NULL }, 1889, "udp" },
+ { "wilkenlistener", { NULL }, 1890, "tcp" },
+ { "wilkenlistener", { NULL }, 1890, "udp" },
+ { "childkey-notif", { NULL }, 1891, "tcp" },
+ { "childkey-notif", { NULL }, 1891, "udp" },
+ { "childkey-ctrl", { NULL }, 1892, "tcp" },
+ { "childkey-ctrl", { NULL }, 1892, "udp" },
+ { "elad", { NULL }, 1893, "tcp" },
+ { "elad", { NULL }, 1893, "udp" },
+ { "o2server-port", { NULL }, 1894, "tcp" },
+ { "o2server-port", { NULL }, 1894, "udp" },
+ { "b-novative-ls", { NULL }, 1896, "tcp" },
+ { "b-novative-ls", { NULL }, 1896, "udp" },
+ { "metaagent", { NULL }, 1897, "tcp" },
+ { "metaagent", { NULL }, 1897, "udp" },
+ { "cymtec-port", { NULL }, 1898, "tcp" },
+ { "cymtec-port", { NULL }, 1898, "udp" },
+ { "mc2studios", { NULL }, 1899, "tcp" },
+ { "mc2studios", { NULL }, 1899, "udp" },
+ { "ssdp", { NULL }, 1900, "tcp" },
+ { "ssdp", { NULL }, 1900, "udp" },
+ { "fjicl-tep-a", { NULL }, 1901, "tcp" },
+ { "fjicl-tep-a", { NULL }, 1901, "udp" },
+ { "fjicl-tep-b", { NULL }, 1902, "tcp" },
+ { "fjicl-tep-b", { NULL }, 1902, "udp" },
+ { "linkname", { NULL }, 1903, "tcp" },
+ { "linkname", { NULL }, 1903, "udp" },
+ { "fjicl-tep-c", { NULL }, 1904, "tcp" },
+ { "fjicl-tep-c", { NULL }, 1904, "udp" },
+ { "sugp", { NULL }, 1905, "tcp" },
+ { "sugp", { NULL }, 1905, "udp" },
+ { "tpmd", { NULL }, 1906, "tcp" },
+ { "tpmd", { NULL }, 1906, "udp" },
+ { "intrastar", { NULL }, 1907, "tcp" },
+ { "intrastar", { NULL }, 1907, "udp" },
+ { "dawn", { NULL }, 1908, "tcp" },
+ { "dawn", { NULL }, 1908, "udp" },
+ { "global-wlink", { NULL }, 1909, "tcp" },
+ { "global-wlink", { NULL }, 1909, "udp" },
+ { "ultrabac", { NULL }, 1910, "tcp" },
+ { "ultrabac", { NULL }, 1910, "udp" },
+ { "mtp", { NULL }, 1911, "tcp" },
+ { "mtp", { NULL }, 1911, "udp" },
+ { "rhp-iibp", { NULL }, 1912, "tcp" },
+ { "rhp-iibp", { NULL }, 1912, "udp" },
+ { "armadp", { NULL }, 1913, "tcp" },
+ { "armadp", { NULL }, 1913, "udp" },
+ { "elm-momentum", { NULL }, 1914, "tcp" },
+ { "elm-momentum", { NULL }, 1914, "udp" },
+ { "facelink", { NULL }, 1915, "tcp" },
+ { "facelink", { NULL }, 1915, "udp" },
+ { "persona", { NULL }, 1916, "tcp" },
+ { "persona", { NULL }, 1916, "udp" },
+ { "noagent", { NULL }, 1917, "tcp" },
+ { "noagent", { NULL }, 1917, "udp" },
+ { "can-nds", { NULL }, 1918, "tcp" },
+ { "can-nds", { NULL }, 1918, "udp" },
+ { "can-dch", { NULL }, 1919, "tcp" },
+ { "can-dch", { NULL }, 1919, "udp" },
+ { "can-ferret", { NULL }, 1920, "tcp" },
+ { "can-ferret", { NULL }, 1920, "udp" },
+ { "noadmin", { NULL }, 1921, "tcp" },
+ { "noadmin", { NULL }, 1921, "udp" },
+ { "tapestry", { NULL }, 1922, "tcp" },
+ { "tapestry", { NULL }, 1922, "udp" },
+ { "spice", { NULL }, 1923, "tcp" },
+ { "spice", { NULL }, 1923, "udp" },
+ { "xiip", { NULL }, 1924, "tcp" },
+ { "xiip", { NULL }, 1924, "udp" },
+ { "discovery-port", { NULL }, 1925, "tcp" },
+ { "discovery-port", { NULL }, 1925, "udp" },
+ { "egs", { NULL }, 1926, "tcp" },
+ { "egs", { NULL }, 1926, "udp" },
+ { "videte-cipc", { NULL }, 1927, "tcp" },
+ { "videte-cipc", { NULL }, 1927, "udp" },
+ { "emsd-port", { NULL }, 1928, "tcp" },
+ { "emsd-port", { NULL }, 1928, "udp" },
+ { "bandwiz-system", { NULL }, 1929, "tcp" },
+ { "bandwiz-system", { NULL }, 1929, "udp" },
+ { "driveappserver", { NULL }, 1930, "tcp" },
+ { "driveappserver", { NULL }, 1930, "udp" },
+ { "amdsched", { NULL }, 1931, "tcp" },
+ { "amdsched", { NULL }, 1931, "udp" },
+ { "ctt-broker", { NULL }, 1932, "tcp" },
+ { "ctt-broker", { NULL }, 1932, "udp" },
+ { "xmapi", { NULL }, 1933, "tcp" },
+ { "xmapi", { NULL }, 1933, "udp" },
+ { "xaapi", { NULL }, 1934, "tcp" },
+ { "xaapi", { NULL }, 1934, "udp" },
+ { "macromedia-fcs", { NULL }, 1935, "tcp" },
+ { "macromedia-fcs", { NULL }, 1935, "udp" },
+ { "jetcmeserver", { NULL }, 1936, "tcp" },
+ { "jetcmeserver", { NULL }, 1936, "udp" },
+ { "jwserver", { NULL }, 1937, "tcp" },
+ { "jwserver", { NULL }, 1937, "udp" },
+ { "jwclient", { NULL }, 1938, "tcp" },
+ { "jwclient", { NULL }, 1938, "udp" },
+ { "jvserver", { NULL }, 1939, "tcp" },
+ { "jvserver", { NULL }, 1939, "udp" },
+ { "jvclient", { NULL }, 1940, "tcp" },
+ { "jvclient", { NULL }, 1940, "udp" },
+ { "dic-aida", { NULL }, 1941, "tcp" },
+ { "dic-aida", { NULL }, 1941, "udp" },
+ { "res", { NULL }, 1942, "tcp" },
+ { "res", { NULL }, 1942, "udp" },
+ { "beeyond-media", { NULL }, 1943, "tcp" },
+ { "beeyond-media", { NULL }, 1943, "udp" },
+ { "close-combat", { NULL }, 1944, "tcp" },
+ { "close-combat", { NULL }, 1944, "udp" },
+ { "dialogic-elmd", { NULL }, 1945, "tcp" },
+ { "dialogic-elmd", { NULL }, 1945, "udp" },
+ { "tekpls", { NULL }, 1946, "tcp" },
+ { "tekpls", { NULL }, 1946, "udp" },
+ { "sentinelsrm", { NULL }, 1947, "tcp" },
+ { "sentinelsrm", { NULL }, 1947, "udp" },
+ { "eye2eye", { NULL }, 1948, "tcp" },
+ { "eye2eye", { NULL }, 1948, "udp" },
+ { "ismaeasdaqlive", { NULL }, 1949, "tcp" },
+ { "ismaeasdaqlive", { NULL }, 1949, "udp" },
+ { "ismaeasdaqtest", { NULL }, 1950, "tcp" },
+ { "ismaeasdaqtest", { NULL }, 1950, "udp" },
+ { "bcs-lmserver", { NULL }, 1951, "tcp" },
+ { "bcs-lmserver", { NULL }, 1951, "udp" },
+ { "mpnjsc", { NULL }, 1952, "tcp" },
+ { "mpnjsc", { NULL }, 1952, "udp" },
+ { "rapidbase", { NULL }, 1953, "tcp" },
+ { "rapidbase", { NULL }, 1953, "udp" },
+ { "abr-api", { NULL }, 1954, "tcp" },
+ { "abr-api", { NULL }, 1954, "udp" },
+ { "abr-secure", { NULL }, 1955, "tcp" },
+ { "abr-secure", { NULL }, 1955, "udp" },
+ { "vrtl-vmf-ds", { NULL }, 1956, "tcp" },
+ { "vrtl-vmf-ds", { NULL }, 1956, "udp" },
+ { "unix-status", { NULL }, 1957, "tcp" },
+ { "unix-status", { NULL }, 1957, "udp" },
+ { "dxadmind", { NULL }, 1958, "tcp" },
+ { "dxadmind", { NULL }, 1958, "udp" },
+ { "simp-all", { NULL }, 1959, "tcp" },
+ { "simp-all", { NULL }, 1959, "udp" },
+ { "nasmanager", { NULL }, 1960, "tcp" },
+ { "nasmanager", { NULL }, 1960, "udp" },
+ { "bts-appserver", { NULL }, 1961, "tcp" },
+ { "bts-appserver", { NULL }, 1961, "udp" },
+ { "biap-mp", { NULL }, 1962, "tcp" },
+ { "biap-mp", { NULL }, 1962, "udp" },
+ { "webmachine", { NULL }, 1963, "tcp" },
+ { "webmachine", { NULL }, 1963, "udp" },
+ { "solid-e-engine", { NULL }, 1964, "tcp" },
+ { "solid-e-engine", { NULL }, 1964, "udp" },
+ { "tivoli-npm", { NULL }, 1965, "tcp" },
+ { "tivoli-npm", { NULL }, 1965, "udp" },
+ { "slush", { NULL }, 1966, "tcp" },
+ { "slush", { NULL }, 1966, "udp" },
+ { "sns-quote", { NULL }, 1967, "tcp" },
+ { "sns-quote", { NULL }, 1967, "udp" },
+ { "lipsinc", { NULL }, 1968, "tcp" },
+ { "lipsinc", { NULL }, 1968, "udp" },
+ { "lipsinc1", { NULL }, 1969, "tcp" },
+ { "lipsinc1", { NULL }, 1969, "udp" },
+ { "netop-rc", { NULL }, 1970, "tcp" },
+ { "netop-rc", { NULL }, 1970, "udp" },
+ { "netop-school", { NULL }, 1971, "tcp" },
+ { "netop-school", { NULL }, 1971, "udp" },
+ { "intersys-cache", { NULL }, 1972, "tcp" },
+ { "intersys-cache", { NULL }, 1972, "udp" },
+ { "dlsrap", { NULL }, 1973, "tcp" },
+ { "dlsrap", { NULL }, 1973, "udp" },
+ { "drp", { NULL }, 1974, "tcp" },
+ { "drp", { NULL }, 1974, "udp" },
+ { "tcoflashagent", { NULL }, 1975, "tcp" },
+ { "tcoflashagent", { NULL }, 1975, "udp" },
+ { "tcoregagent", { NULL }, 1976, "tcp" },
+ { "tcoregagent", { NULL }, 1976, "udp" },
+ { "tcoaddressbook", { NULL }, 1977, "tcp" },
+ { "tcoaddressbook", { NULL }, 1977, "udp" },
+ { "unisql", { NULL }, 1978, "tcp" },
+ { "unisql", { NULL }, 1978, "udp" },
+ { "unisql-java", { NULL }, 1979, "tcp" },
+ { "unisql-java", { NULL }, 1979, "udp" },
+ { "pearldoc-xact", { NULL }, 1980, "tcp" },
+ { "pearldoc-xact", { NULL }, 1980, "udp" },
+ { "p2pq", { NULL }, 1981, "tcp" },
+ { "p2pq", { NULL }, 1981, "udp" },
+ { "estamp", { NULL }, 1982, "tcp" },
+ { "estamp", { NULL }, 1982, "udp" },
+ { "lhtp", { NULL }, 1983, "tcp" },
+ { "lhtp", { NULL }, 1983, "udp" },
+ { "bb", { NULL }, 1984, "tcp" },
+ { "bb", { NULL }, 1984, "udp" },
+ { "hsrp", { NULL }, 1985, "tcp" },
+ { "hsrp", { NULL }, 1985, "udp" },
+ { "licensedaemon", { NULL }, 1986, "tcp" },
+ { "licensedaemon", { NULL }, 1986, "udp" },
+ { "tr-rsrb-p1", { NULL }, 1987, "tcp" },
+ { "tr-rsrb-p1", { NULL }, 1987, "udp" },
+ { "tr-rsrb-p2", { NULL }, 1988, "tcp" },
+ { "tr-rsrb-p2", { NULL }, 1988, "udp" },
+ { "tr-rsrb-p3", { NULL }, 1989, "tcp" },
+ { "tr-rsrb-p3", { NULL }, 1989, "udp" },
+ { "mshnet", { NULL }, 1989, "tcp" },
+ { "mshnet", { NULL }, 1989, "udp" },
+ { "stun-p1", { NULL }, 1990, "tcp" },
+ { "stun-p1", { NULL }, 1990, "udp" },
+ { "stun-p2", { NULL }, 1991, "tcp" },
+ { "stun-p2", { NULL }, 1991, "udp" },
+ { "stun-p3", { NULL }, 1992, "tcp" },
+ { "stun-p3", { NULL }, 1992, "udp" },
+ { "ipsendmsg", { NULL }, 1992, "tcp" },
+ { "ipsendmsg", { NULL }, 1992, "udp" },
+ { "snmp-tcp-port", { NULL }, 1993, "tcp" },
+ { "snmp-tcp-port", { NULL }, 1993, "udp" },
+ { "stun-port", { NULL }, 1994, "tcp" },
+ { "stun-port", { NULL }, 1994, "udp" },
+ { "perf-port", { NULL }, 1995, "tcp" },
+ { "perf-port", { NULL }, 1995, "udp" },
+ { "tr-rsrb-port", { NULL }, 1996, "tcp" },
+ { "tr-rsrb-port", { NULL }, 1996, "udp" },
+ { "gdp-port", { NULL }, 1997, "tcp" },
+ { "gdp-port", { NULL }, 1997, "udp" },
+ { "x25-svc-port", { NULL }, 1998, "tcp" },
+ { "x25-svc-port", { NULL }, 1998, "udp" },
+ { "tcp-id-port", { NULL }, 1999, "tcp" },
+ { "tcp-id-port", { NULL }, 1999, "udp" },
+ { "cisco-sccp", { NULL }, 2000, "tcp" },
+ { "cisco-sccp", { NULL }, 2000, "udp" },
+ { "dc", { NULL }, 2001, "tcp" },
+ { "wizard", { NULL }, 2001, "udp" },
+ { "globe", { NULL }, 2002, "tcp" },
+ { "globe", { NULL }, 2002, "udp" },
+ { "brutus", { NULL }, 2003, "tcp" },
+ { "brutus", { NULL }, 2003, "udp" },
+ { "mailbox", { NULL }, 2004, "tcp" },
+ { "emce", { NULL }, 2004, "udp" },
+ { "berknet", { NULL }, 2005, "tcp" },
+ { "oracle", { NULL }, 2005, "udp" },
+ { "invokator", { NULL }, 2006, "tcp" },
+ { "raid-cd", { NULL }, 2006, "udp" },
+ { "dectalk", { NULL }, 2007, "tcp" },
+ { "raid-am", { NULL }, 2007, "udp" },
+ { "conf", { NULL }, 2008, "tcp" },
+ { "terminaldb", { NULL }, 2008, "udp" },
+ { "news", { NULL }, 2009, "tcp" },
+ { "whosockami", { NULL }, 2009, "udp" },
+ { "search", { NULL }, 2010, "tcp" },
+ { "pipe_server", { NULL }, 2010, "udp" },
+ { "raid-cc", { NULL }, 2011, "tcp" },
+ { "servserv", { NULL }, 2011, "udp" },
+ { "ttyinfo", { NULL }, 2012, "tcp" },
+ { "raid-ac", { NULL }, 2012, "udp" },
+ { "raid-am", { NULL }, 2013, "tcp" },
+ { "raid-cd", { NULL }, 2013, "udp" },
+ { "troff", { NULL }, 2014, "tcp" },
+ { "raid-sf", { NULL }, 2014, "udp" },
+ { "cypress", { NULL }, 2015, "tcp" },
+ { "raid-cs", { NULL }, 2015, "udp" },
+ { "bootserver", { NULL }, 2016, "tcp" },
+ { "bootserver", { NULL }, 2016, "udp" },
+ { "cypress-stat", { NULL }, 2017, "tcp" },
+ { "bootclient", { NULL }, 2017, "udp" },
+ { "terminaldb", { NULL }, 2018, "tcp" },
+ { "rellpack", { NULL }, 2018, "udp" },
+ { "whosockami", { NULL }, 2019, "tcp" },
+ { "about", { NULL }, 2019, "udp" },
+ { "xinupageserver", { NULL }, 2020, "tcp" },
+ { "xinupageserver", { NULL }, 2020, "udp" },
+ { "servexec", { NULL }, 2021, "tcp" },
+ { "xinuexpansion1", { NULL }, 2021, "udp" },
+ { "down", { NULL }, 2022, "tcp" },
+ { "xinuexpansion2", { NULL }, 2022, "udp" },
+ { "xinuexpansion3", { NULL }, 2023, "tcp" },
+ { "xinuexpansion3", { NULL }, 2023, "udp" },
+ { "xinuexpansion4", { NULL }, 2024, "tcp" },
+ { "xinuexpansion4", { NULL }, 2024, "udp" },
+ { "ellpack", { NULL }, 2025, "tcp" },
+ { "xribs", { NULL }, 2025, "udp" },
+ { "scrabble", { NULL }, 2026, "tcp" },
+ { "scrabble", { NULL }, 2026, "udp" },
+ { "shadowserver", { NULL }, 2027, "tcp" },
+ { "shadowserver", { NULL }, 2027, "udp" },
+ { "submitserver", { NULL }, 2028, "tcp" },
+ { "submitserver", { NULL }, 2028, "udp" },
+ { "hsrpv6", { NULL }, 2029, "tcp" },
+ { "hsrpv6", { NULL }, 2029, "udp" },
+ { "device2", { NULL }, 2030, "tcp" },
+ { "device2", { NULL }, 2030, "udp" },
+ { "mobrien-chat", { NULL }, 2031, "tcp" },
+ { "mobrien-chat", { NULL }, 2031, "udp" },
+ { "blackboard", { NULL }, 2032, "tcp" },
+ { "blackboard", { NULL }, 2032, "udp" },
+ { "glogger", { NULL }, 2033, "tcp" },
+ { "glogger", { NULL }, 2033, "udp" },
+ { "scoremgr", { NULL }, 2034, "tcp" },
+ { "scoremgr", { NULL }, 2034, "udp" },
+ { "imsldoc", { NULL }, 2035, "tcp" },
+ { "imsldoc", { NULL }, 2035, "udp" },
+ { "e-dpnet", { NULL }, 2036, "tcp" },
+ { "e-dpnet", { NULL }, 2036, "udp" },
+ { "applus", { NULL }, 2037, "tcp" },
+ { "applus", { NULL }, 2037, "udp" },
+ { "objectmanager", { NULL }, 2038, "tcp" },
+ { "objectmanager", { NULL }, 2038, "udp" },
+ { "prizma", { NULL }, 2039, "tcp" },
+ { "prizma", { NULL }, 2039, "udp" },
+ { "lam", { NULL }, 2040, "tcp" },
+ { "lam", { NULL }, 2040, "udp" },
+ { "interbase", { NULL }, 2041, "tcp" },
+ { "interbase", { NULL }, 2041, "udp" },
+ { "isis", { NULL }, 2042, "tcp" },
+ { "isis", { NULL }, 2042, "udp" },
+ { "isis-bcast", { NULL }, 2043, "tcp" },
+ { "isis-bcast", { NULL }, 2043, "udp" },
+ { "rimsl", { NULL }, 2044, "tcp" },
+ { "rimsl", { NULL }, 2044, "udp" },
+ { "cdfunc", { NULL }, 2045, "tcp" },
+ { "cdfunc", { NULL }, 2045, "udp" },
+ { "sdfunc", { NULL }, 2046, "tcp" },
+ { "sdfunc", { NULL }, 2046, "udp" },
+ { "dls", { NULL }, 2047, "tcp" },
+ { "dls", { NULL }, 2047, "udp" },
+ { "dls-monitor", { NULL }, 2048, "tcp" },
+ { "dls-monitor", { NULL }, 2048, "udp" },
+ { "shilp", { NULL }, 2049, "tcp" },
+ { "shilp", { NULL }, 2049, "udp" },
+ { "nfs", { NULL }, 2049, "tcp" },
+ { "nfs", { NULL }, 2049, "udp" },
+ { "nfs", { NULL }, 2049, "sctp"},
+ { "av-emb-config", { NULL }, 2050, "tcp" },
+ { "av-emb-config", { NULL }, 2050, "udp" },
+ { "epnsdp", { NULL }, 2051, "tcp" },
+ { "epnsdp", { NULL }, 2051, "udp" },
+ { "clearvisn", { NULL }, 2052, "tcp" },
+ { "clearvisn", { NULL }, 2052, "udp" },
+ { "lot105-ds-upd", { NULL }, 2053, "tcp" },
+ { "lot105-ds-upd", { NULL }, 2053, "udp" },
+ { "weblogin", { NULL }, 2054, "tcp" },
+ { "weblogin", { NULL }, 2054, "udp" },
+ { "iop", { NULL }, 2055, "tcp" },
+ { "iop", { NULL }, 2055, "udp" },
+ { "omnisky", { NULL }, 2056, "tcp" },
+ { "omnisky", { NULL }, 2056, "udp" },
+ { "rich-cp", { NULL }, 2057, "tcp" },
+ { "rich-cp", { NULL }, 2057, "udp" },
+ { "newwavesearch", { NULL }, 2058, "tcp" },
+ { "newwavesearch", { NULL }, 2058, "udp" },
+ { "bmc-messaging", { NULL }, 2059, "tcp" },
+ { "bmc-messaging", { NULL }, 2059, "udp" },
+ { "teleniumdaemon", { NULL }, 2060, "tcp" },
+ { "teleniumdaemon", { NULL }, 2060, "udp" },
+ { "netmount", { NULL }, 2061, "tcp" },
+ { "netmount", { NULL }, 2061, "udp" },
+ { "icg-swp", { NULL }, 2062, "tcp" },
+ { "icg-swp", { NULL }, 2062, "udp" },
+ { "icg-bridge", { NULL }, 2063, "tcp" },
+ { "icg-bridge", { NULL }, 2063, "udp" },
+ { "icg-iprelay", { NULL }, 2064, "tcp" },
+ { "icg-iprelay", { NULL }, 2064, "udp" },
+ { "dlsrpn", { NULL }, 2065, "tcp" },
+ { "dlsrpn", { NULL }, 2065, "udp" },
+ { "aura", { NULL }, 2066, "tcp" },
+ { "aura", { NULL }, 2066, "udp" },
+ { "dlswpn", { NULL }, 2067, "tcp" },
+ { "dlswpn", { NULL }, 2067, "udp" },
+ { "avauthsrvprtcl", { NULL }, 2068, "tcp" },
+ { "avauthsrvprtcl", { NULL }, 2068, "udp" },
+ { "event-port", { NULL }, 2069, "tcp" },
+ { "event-port", { NULL }, 2069, "udp" },
+ { "ah-esp-encap", { NULL }, 2070, "tcp" },
+ { "ah-esp-encap", { NULL }, 2070, "udp" },
+ { "acp-port", { NULL }, 2071, "tcp" },
+ { "acp-port", { NULL }, 2071, "udp" },
+ { "msync", { NULL }, 2072, "tcp" },
+ { "msync", { NULL }, 2072, "udp" },
+ { "gxs-data-port", { NULL }, 2073, "tcp" },
+ { "gxs-data-port", { NULL }, 2073, "udp" },
+ { "vrtl-vmf-sa", { NULL }, 2074, "tcp" },
+ { "vrtl-vmf-sa", { NULL }, 2074, "udp" },
+ { "newlixengine", { NULL }, 2075, "tcp" },
+ { "newlixengine", { NULL }, 2075, "udp" },
+ { "newlixconfig", { NULL }, 2076, "tcp" },
+ { "newlixconfig", { NULL }, 2076, "udp" },
+ { "tsrmagt", { NULL }, 2077, "tcp" },
+ { "tsrmagt", { NULL }, 2077, "udp" },
+ { "tpcsrvr", { NULL }, 2078, "tcp" },
+ { "tpcsrvr", { NULL }, 2078, "udp" },
+ { "idware-router", { NULL }, 2079, "tcp" },
+ { "idware-router", { NULL }, 2079, "udp" },
+ { "autodesk-nlm", { NULL }, 2080, "tcp" },
+ { "autodesk-nlm", { NULL }, 2080, "udp" },
+ { "kme-trap-port", { NULL }, 2081, "tcp" },
+ { "kme-trap-port", { NULL }, 2081, "udp" },
+ { "infowave", { NULL }, 2082, "tcp" },
+ { "infowave", { NULL }, 2082, "udp" },
+ { "radsec", { NULL }, 2083, "tcp" },
+ { "radsec", { NULL }, 2083, "udp" },
+ { "sunclustergeo", { NULL }, 2084, "tcp" },
+ { "sunclustergeo", { NULL }, 2084, "udp" },
+ { "ada-cip", { NULL }, 2085, "tcp" },
+ { "ada-cip", { NULL }, 2085, "udp" },
+ { "gnunet", { NULL }, 2086, "tcp" },
+ { "gnunet", { NULL }, 2086, "udp" },
+ { "eli", { NULL }, 2087, "tcp" },
+ { "eli", { NULL }, 2087, "udp" },
+ { "ip-blf", { NULL }, 2088, "tcp" },
+ { "ip-blf", { NULL }, 2088, "udp" },
+ { "sep", { NULL }, 2089, "tcp" },
+ { "sep", { NULL }, 2089, "udp" },
+ { "lrp", { NULL }, 2090, "tcp" },
+ { "lrp", { NULL }, 2090, "udp" },
+ { "prp", { NULL }, 2091, "tcp" },
+ { "prp", { NULL }, 2091, "udp" },
+ { "descent3", { NULL }, 2092, "tcp" },
+ { "descent3", { NULL }, 2092, "udp" },
+ { "nbx-cc", { NULL }, 2093, "tcp" },
+ { "nbx-cc", { NULL }, 2093, "udp" },
+ { "nbx-au", { NULL }, 2094, "tcp" },
+ { "nbx-au", { NULL }, 2094, "udp" },
+ { "nbx-ser", { NULL }, 2095, "tcp" },
+ { "nbx-ser", { NULL }, 2095, "udp" },
+ { "nbx-dir", { NULL }, 2096, "tcp" },
+ { "nbx-dir", { NULL }, 2096, "udp" },
+ { "jetformpreview", { NULL }, 2097, "tcp" },
+ { "jetformpreview", { NULL }, 2097, "udp" },
+ { "dialog-port", { NULL }, 2098, "tcp" },
+ { "dialog-port", { NULL }, 2098, "udp" },
+ { "h2250-annex-g", { NULL }, 2099, "tcp" },
+ { "h2250-annex-g", { NULL }, 2099, "udp" },
+ { "amiganetfs", { NULL }, 2100, "tcp" },
+ { "amiganetfs", { NULL }, 2100, "udp" },
+ { "rtcm-sc104", { NULL }, 2101, "tcp" },
+ { "rtcm-sc104", { NULL }, 2101, "udp" },
+ { "zephyr-srv", { NULL }, 2102, "tcp" },
+ { "zephyr-srv", { NULL }, 2102, "udp" },
+ { "zephyr-clt", { NULL }, 2103, "tcp" },
+ { "zephyr-clt", { NULL }, 2103, "udp" },
+ { "zephyr-hm", { NULL }, 2104, "tcp" },
+ { "zephyr-hm", { NULL }, 2104, "udp" },
+ { "minipay", { NULL }, 2105, "tcp" },
+ { "minipay", { NULL }, 2105, "udp" },
+ { "mzap", { NULL }, 2106, "tcp" },
+ { "mzap", { NULL }, 2106, "udp" },
+ { "bintec-admin", { NULL }, 2107, "tcp" },
+ { "bintec-admin", { NULL }, 2107, "udp" },
+ { "comcam", { NULL }, 2108, "tcp" },
+ { "comcam", { NULL }, 2108, "udp" },
+ { "ergolight", { NULL }, 2109, "tcp" },
+ { "ergolight", { NULL }, 2109, "udp" },
+ { "umsp", { NULL }, 2110, "tcp" },
+ { "umsp", { NULL }, 2110, "udp" },
+ { "dsatp", { NULL }, 2111, "tcp" },
+ { "dsatp", { NULL }, 2111, "udp" },
+ { "idonix-metanet", { NULL }, 2112, "tcp" },
+ { "idonix-metanet", { NULL }, 2112, "udp" },
+ { "hsl-storm", { NULL }, 2113, "tcp" },
+ { "hsl-storm", { NULL }, 2113, "udp" },
+ { "newheights", { NULL }, 2114, "tcp" },
+ { "newheights", { NULL }, 2114, "udp" },
+ { "kdm", { NULL }, 2115, "tcp" },
+ { "kdm", { NULL }, 2115, "udp" },
+ { "ccowcmr", { NULL }, 2116, "tcp" },
+ { "ccowcmr", { NULL }, 2116, "udp" },
+ { "mentaclient", { NULL }, 2117, "tcp" },
+ { "mentaclient", { NULL }, 2117, "udp" },
+ { "mentaserver", { NULL }, 2118, "tcp" },
+ { "mentaserver", { NULL }, 2118, "udp" },
+ { "gsigatekeeper", { NULL }, 2119, "tcp" },
+ { "gsigatekeeper", { NULL }, 2119, "udp" },
+ { "qencp", { NULL }, 2120, "tcp" },
+ { "qencp", { NULL }, 2120, "udp" },
+ { "scientia-ssdb", { NULL }, 2121, "tcp" },
+ { "scientia-ssdb", { NULL }, 2121, "udp" },
+ { "caupc-remote", { NULL }, 2122, "tcp" },
+ { "caupc-remote", { NULL }, 2122, "udp" },
+ { "gtp-control", { NULL }, 2123, "tcp" },
+ { "gtp-control", { NULL }, 2123, "udp" },
+ { "elatelink", { NULL }, 2124, "tcp" },
+ { "elatelink", { NULL }, 2124, "udp" },
+ { "lockstep", { NULL }, 2125, "tcp" },
+ { "lockstep", { NULL }, 2125, "udp" },
+ { "pktcable-cops", { NULL }, 2126, "tcp" },
+ { "pktcable-cops", { NULL }, 2126, "udp" },
+ { "index-pc-wb", { NULL }, 2127, "tcp" },
+ { "index-pc-wb", { NULL }, 2127, "udp" },
+ { "net-steward", { NULL }, 2128, "tcp" },
+ { "net-steward", { NULL }, 2128, "udp" },
+ { "cs-live", { NULL }, 2129, "tcp" },
+ { "cs-live", { NULL }, 2129, "udp" },
+ { "xds", { NULL }, 2130, "tcp" },
+ { "xds", { NULL }, 2130, "udp" },
+ { "avantageb2b", { NULL }, 2131, "tcp" },
+ { "avantageb2b", { NULL }, 2131, "udp" },
+ { "solera-epmap", { NULL }, 2132, "tcp" },
+ { "solera-epmap", { NULL }, 2132, "udp" },
+ { "zymed-zpp", { NULL }, 2133, "tcp" },
+ { "zymed-zpp", { NULL }, 2133, "udp" },
+ { "avenue", { NULL }, 2134, "tcp" },
+ { "avenue", { NULL }, 2134, "udp" },
+ { "gris", { NULL }, 2135, "tcp" },
+ { "gris", { NULL }, 2135, "udp" },
+ { "appworxsrv", { NULL }, 2136, "tcp" },
+ { "appworxsrv", { NULL }, 2136, "udp" },
+ { "connect", { NULL }, 2137, "tcp" },
+ { "connect", { NULL }, 2137, "udp" },
+ { "unbind-cluster", { NULL }, 2138, "tcp" },
+ { "unbind-cluster", { NULL }, 2138, "udp" },
+ { "ias-auth", { NULL }, 2139, "tcp" },
+ { "ias-auth", { NULL }, 2139, "udp" },
+ { "ias-reg", { NULL }, 2140, "tcp" },
+ { "ias-reg", { NULL }, 2140, "udp" },
+ { "ias-admind", { NULL }, 2141, "tcp" },
+ { "ias-admind", { NULL }, 2141, "udp" },
+ { "tdmoip", { NULL }, 2142, "tcp" },
+ { "tdmoip", { NULL }, 2142, "udp" },
+ { "lv-jc", { NULL }, 2143, "tcp" },
+ { "lv-jc", { NULL }, 2143, "udp" },
+ { "lv-ffx", { NULL }, 2144, "tcp" },
+ { "lv-ffx", { NULL }, 2144, "udp" },
+ { "lv-pici", { NULL }, 2145, "tcp" },
+ { "lv-pici", { NULL }, 2145, "udp" },
+ { "lv-not", { NULL }, 2146, "tcp" },
+ { "lv-not", { NULL }, 2146, "udp" },
+ { "lv-auth", { NULL }, 2147, "tcp" },
+ { "lv-auth", { NULL }, 2147, "udp" },
+ { "veritas-ucl", { NULL }, 2148, "tcp" },
+ { "veritas-ucl", { NULL }, 2148, "udp" },
+ { "acptsys", { NULL }, 2149, "tcp" },
+ { "acptsys", { NULL }, 2149, "udp" },
+ { "dynamic3d", { NULL }, 2150, "tcp" },
+ { "dynamic3d", { NULL }, 2150, "udp" },
+ { "docent", { NULL }, 2151, "tcp" },
+ { "docent", { NULL }, 2151, "udp" },
+ { "gtp-user", { NULL }, 2152, "tcp" },
+ { "gtp-user", { NULL }, 2152, "udp" },
+ { "ctlptc", { NULL }, 2153, "tcp" },
+ { "ctlptc", { NULL }, 2153, "udp" },
+ { "stdptc", { NULL }, 2154, "tcp" },
+ { "stdptc", { NULL }, 2154, "udp" },
+ { "brdptc", { NULL }, 2155, "tcp" },
+ { "brdptc", { NULL }, 2155, "udp" },
+ { "trp", { NULL }, 2156, "tcp" },
+ { "trp", { NULL }, 2156, "udp" },
+ { "xnds", { NULL }, 2157, "tcp" },
+ { "xnds", { NULL }, 2157, "udp" },
+ { "touchnetplus", { NULL }, 2158, "tcp" },
+ { "touchnetplus", { NULL }, 2158, "udp" },
+ { "gdbremote", { NULL }, 2159, "tcp" },
+ { "gdbremote", { NULL }, 2159, "udp" },
+ { "apc-2160", { NULL }, 2160, "tcp" },
+ { "apc-2160", { NULL }, 2160, "udp" },
+ { "apc-2161", { NULL }, 2161, "tcp" },
+ { "apc-2161", { NULL }, 2161, "udp" },
+ { "navisphere", { NULL }, 2162, "tcp" },
+ { "navisphere", { NULL }, 2162, "udp" },
+ { "navisphere-sec", { NULL }, 2163, "tcp" },
+ { "navisphere-sec", { NULL }, 2163, "udp" },
+ { "ddns-v3", { NULL }, 2164, "tcp" },
+ { "ddns-v3", { NULL }, 2164, "udp" },
+ { "x-bone-api", { NULL }, 2165, "tcp" },
+ { "x-bone-api", { NULL }, 2165, "udp" },
+ { "iwserver", { NULL }, 2166, "tcp" },
+ { "iwserver", { NULL }, 2166, "udp" },
+ { "raw-serial", { NULL }, 2167, "tcp" },
+ { "raw-serial", { NULL }, 2167, "udp" },
+ { "easy-soft-mux", { NULL }, 2168, "tcp" },
+ { "easy-soft-mux", { NULL }, 2168, "udp" },
+ { "brain", { NULL }, 2169, "tcp" },
+ { "brain", { NULL }, 2169, "udp" },
+ { "eyetv", { NULL }, 2170, "tcp" },
+ { "eyetv", { NULL }, 2170, "udp" },
+ { "msfw-storage", { NULL }, 2171, "tcp" },
+ { "msfw-storage", { NULL }, 2171, "udp" },
+ { "msfw-s-storage", { NULL }, 2172, "tcp" },
+ { "msfw-s-storage", { NULL }, 2172, "udp" },
+ { "msfw-replica", { NULL }, 2173, "tcp" },
+ { "msfw-replica", { NULL }, 2173, "udp" },
+ { "msfw-array", { NULL }, 2174, "tcp" },
+ { "msfw-array", { NULL }, 2174, "udp" },
+ { "airsync", { NULL }, 2175, "tcp" },
+ { "airsync", { NULL }, 2175, "udp" },
+ { "rapi", { NULL }, 2176, "tcp" },
+ { "rapi", { NULL }, 2176, "udp" },
+ { "qwave", { NULL }, 2177, "tcp" },
+ { "qwave", { NULL }, 2177, "udp" },
+ { "bitspeer", { NULL }, 2178, "tcp" },
+ { "bitspeer", { NULL }, 2178, "udp" },
+ { "vmrdp", { NULL }, 2179, "tcp" },
+ { "vmrdp", { NULL }, 2179, "udp" },
+ { "mc-gt-srv", { NULL }, 2180, "tcp" },
+ { "mc-gt-srv", { NULL }, 2180, "udp" },
+ { "eforward", { NULL }, 2181, "tcp" },
+ { "eforward", { NULL }, 2181, "udp" },
+ { "cgn-stat", { NULL }, 2182, "tcp" },
+ { "cgn-stat", { NULL }, 2182, "udp" },
+ { "cgn-config", { NULL }, 2183, "tcp" },
+ { "cgn-config", { NULL }, 2183, "udp" },
+ { "nvd", { NULL }, 2184, "tcp" },
+ { "nvd", { NULL }, 2184, "udp" },
+ { "onbase-dds", { NULL }, 2185, "tcp" },
+ { "onbase-dds", { NULL }, 2185, "udp" },
+ { "gtaua", { NULL }, 2186, "tcp" },
+ { "gtaua", { NULL }, 2186, "udp" },
+ { "ssmc", { NULL }, 2187, "tcp" },
+ { "ssmd", { NULL }, 2187, "udp" },
+ { "tivoconnect", { NULL }, 2190, "tcp" },
+ { "tivoconnect", { NULL }, 2190, "udp" },
+ { "tvbus", { NULL }, 2191, "tcp" },
+ { "tvbus", { NULL }, 2191, "udp" },
+ { "asdis", { NULL }, 2192, "tcp" },
+ { "asdis", { NULL }, 2192, "udp" },
+ { "drwcs", { NULL }, 2193, "tcp" },
+ { "drwcs", { NULL }, 2193, "udp" },
+ { "mnp-exchange", { NULL }, 2197, "tcp" },
+ { "mnp-exchange", { NULL }, 2197, "udp" },
+ { "onehome-remote", { NULL }, 2198, "tcp" },
+ { "onehome-remote", { NULL }, 2198, "udp" },
+ { "onehome-help", { NULL }, 2199, "tcp" },
+ { "onehome-help", { NULL }, 2199, "udp" },
+ { "ici", { NULL }, 2200, "tcp" },
+ { "ici", { NULL }, 2200, "udp" },
+ { "ats", { NULL }, 2201, "tcp" },
+ { "ats", { NULL }, 2201, "udp" },
+ { "imtc-map", { NULL }, 2202, "tcp" },
+ { "imtc-map", { NULL }, 2202, "udp" },
+ { "b2-runtime", { NULL }, 2203, "tcp" },
+ { "b2-runtime", { NULL }, 2203, "udp" },
+ { "b2-license", { NULL }, 2204, "tcp" },
+ { "b2-license", { NULL }, 2204, "udp" },
+ { "jps", { NULL }, 2205, "tcp" },
+ { "jps", { NULL }, 2205, "udp" },
+ { "hpocbus", { NULL }, 2206, "tcp" },
+ { "hpocbus", { NULL }, 2206, "udp" },
+ { "hpssd", { NULL }, 2207, "tcp" },
+ { "hpssd", { NULL }, 2207, "udp" },
+ { "hpiod", { NULL }, 2208, "tcp" },
+ { "hpiod", { NULL }, 2208, "udp" },
+ { "rimf-ps", { NULL }, 2209, "tcp" },
+ { "rimf-ps", { NULL }, 2209, "udp" },
+ { "noaaport", { NULL }, 2210, "tcp" },
+ { "noaaport", { NULL }, 2210, "udp" },
+ { "emwin", { NULL }, 2211, "tcp" },
+ { "emwin", { NULL }, 2211, "udp" },
+ { "leecoposserver", { NULL }, 2212, "tcp" },
+ { "leecoposserver", { NULL }, 2212, "udp" },
+ { "kali", { NULL }, 2213, "tcp" },
+ { "kali", { NULL }, 2213, "udp" },
+ { "rpi", { NULL }, 2214, "tcp" },
+ { "rpi", { NULL }, 2214, "udp" },
+ { "ipcore", { NULL }, 2215, "tcp" },
+ { "ipcore", { NULL }, 2215, "udp" },
+ { "vtu-comms", { NULL }, 2216, "tcp" },
+ { "vtu-comms", { NULL }, 2216, "udp" },
+ { "gotodevice", { NULL }, 2217, "tcp" },
+ { "gotodevice", { NULL }, 2217, "udp" },
+ { "bounzza", { NULL }, 2218, "tcp" },
+ { "bounzza", { NULL }, 2218, "udp" },
+ { "netiq-ncap", { NULL }, 2219, "tcp" },
+ { "netiq-ncap", { NULL }, 2219, "udp" },
+ { "netiq", { NULL }, 2220, "tcp" },
+ { "netiq", { NULL }, 2220, "udp" },
+ { "rockwell-csp1", { NULL }, 2221, "tcp" },
+ { "rockwell-csp1", { NULL }, 2221, "udp" },
+ { "EtherNet/IP-1", { NULL }, 2222, "tcp" },
+ { "EtherNet/IP-1", { NULL }, 2222, "udp" },
+ { "rockwell-csp2", { NULL }, 2223, "tcp" },
+ { "rockwell-csp2", { NULL }, 2223, "udp" },
+ { "efi-mg", { NULL }, 2224, "tcp" },
+ { "efi-mg", { NULL }, 2224, "udp" },
+ { "rcip-itu", { NULL }, 2225, "tcp" },
+ { "rcip-itu", { NULL }, 2225, "sctp"},
+ { "di-drm", { NULL }, 2226, "tcp" },
+ { "di-drm", { NULL }, 2226, "udp" },
+ { "di-msg", { NULL }, 2227, "tcp" },
+ { "di-msg", { NULL }, 2227, "udp" },
+ { "ehome-ms", { NULL }, 2228, "tcp" },
+ { "ehome-ms", { NULL }, 2228, "udp" },
+ { "datalens", { NULL }, 2229, "tcp" },
+ { "datalens", { NULL }, 2229, "udp" },
+ { "queueadm", { NULL }, 2230, "tcp" },
+ { "queueadm", { NULL }, 2230, "udp" },
+ { "wimaxasncp", { NULL }, 2231, "tcp" },
+ { "wimaxasncp", { NULL }, 2231, "udp" },
+ { "ivs-video", { NULL }, 2232, "tcp" },
+ { "ivs-video", { NULL }, 2232, "udp" },
+ { "infocrypt", { NULL }, 2233, "tcp" },
+ { "infocrypt", { NULL }, 2233, "udp" },
+ { "directplay", { NULL }, 2234, "tcp" },
+ { "directplay", { NULL }, 2234, "udp" },
+ { "sercomm-wlink", { NULL }, 2235, "tcp" },
+ { "sercomm-wlink", { NULL }, 2235, "udp" },
+ { "nani", { NULL }, 2236, "tcp" },
+ { "nani", { NULL }, 2236, "udp" },
+ { "optech-port1-lm", { NULL }, 2237, "tcp" },
+ { "optech-port1-lm", { NULL }, 2237, "udp" },
+ { "aviva-sna", { NULL }, 2238, "tcp" },
+ { "aviva-sna", { NULL }, 2238, "udp" },
+ { "imagequery", { NULL }, 2239, "tcp" },
+ { "imagequery", { NULL }, 2239, "udp" },
+ { "recipe", { NULL }, 2240, "tcp" },
+ { "recipe", { NULL }, 2240, "udp" },
+ { "ivsd", { NULL }, 2241, "tcp" },
+ { "ivsd", { NULL }, 2241, "udp" },
+ { "foliocorp", { NULL }, 2242, "tcp" },
+ { "foliocorp", { NULL }, 2242, "udp" },
+ { "magicom", { NULL }, 2243, "tcp" },
+ { "magicom", { NULL }, 2243, "udp" },
+ { "nmsserver", { NULL }, 2244, "tcp" },
+ { "nmsserver", { NULL }, 2244, "udp" },
+ { "hao", { NULL }, 2245, "tcp" },
+ { "hao", { NULL }, 2245, "udp" },
+ { "pc-mta-addrmap", { NULL }, 2246, "tcp" },
+ { "pc-mta-addrmap", { NULL }, 2246, "udp" },
+ { "antidotemgrsvr", { NULL }, 2247, "tcp" },
+ { "antidotemgrsvr", { NULL }, 2247, "udp" },
+ { "ums", { NULL }, 2248, "tcp" },
+ { "ums", { NULL }, 2248, "udp" },
+ { "rfmp", { NULL }, 2249, "tcp" },
+ { "rfmp", { NULL }, 2249, "udp" },
+ { "remote-collab", { NULL }, 2250, "tcp" },
+ { "remote-collab", { NULL }, 2250, "udp" },
+ { "dif-port", { NULL }, 2251, "tcp" },
+ { "dif-port", { NULL }, 2251, "udp" },
+ { "njenet-ssl", { NULL }, 2252, "tcp" },
+ { "njenet-ssl", { NULL }, 2252, "udp" },
+ { "dtv-chan-req", { NULL }, 2253, "tcp" },
+ { "dtv-chan-req", { NULL }, 2253, "udp" },
+ { "seispoc", { NULL }, 2254, "tcp" },
+ { "seispoc", { NULL }, 2254, "udp" },
+ { "vrtp", { NULL }, 2255, "tcp" },
+ { "vrtp", { NULL }, 2255, "udp" },
+ { "pcc-mfp", { NULL }, 2256, "tcp" },
+ { "pcc-mfp", { NULL }, 2256, "udp" },
+ { "simple-tx-rx", { NULL }, 2257, "tcp" },
+ { "simple-tx-rx", { NULL }, 2257, "udp" },
+ { "rcts", { NULL }, 2258, "tcp" },
+ { "rcts", { NULL }, 2258, "udp" },
+ { "acd-pm", { NULL }, 2259, "tcp" },
+ { "acd-pm", { NULL }, 2259, "udp" },
+ { "apc-2260", { NULL }, 2260, "tcp" },
+ { "apc-2260", { NULL }, 2260, "udp" },
+ { "comotionmaster", { NULL }, 2261, "tcp" },
+ { "comotionmaster", { NULL }, 2261, "udp" },
+ { "comotionback", { NULL }, 2262, "tcp" },
+ { "comotionback", { NULL }, 2262, "udp" },
+ { "ecwcfg", { NULL }, 2263, "tcp" },
+ { "ecwcfg", { NULL }, 2263, "udp" },
+ { "apx500api-1", { NULL }, 2264, "tcp" },
+ { "apx500api-1", { NULL }, 2264, "udp" },
+ { "apx500api-2", { NULL }, 2265, "tcp" },
+ { "apx500api-2", { NULL }, 2265, "udp" },
+ { "mfserver", { NULL }, 2266, "tcp" },
+ { "mfserver", { NULL }, 2266, "udp" },
+ { "ontobroker", { NULL }, 2267, "tcp" },
+ { "ontobroker", { NULL }, 2267, "udp" },
+ { "amt", { NULL }, 2268, "tcp" },
+ { "amt", { NULL }, 2268, "udp" },
+ { "mikey", { NULL }, 2269, "tcp" },
+ { "mikey", { NULL }, 2269, "udp" },
+ { "starschool", { NULL }, 2270, "tcp" },
+ { "starschool", { NULL }, 2270, "udp" },
+ { "mmcals", { NULL }, 2271, "tcp" },
+ { "mmcals", { NULL }, 2271, "udp" },
+ { "mmcal", { NULL }, 2272, "tcp" },
+ { "mmcal", { NULL }, 2272, "udp" },
+ { "mysql-im", { NULL }, 2273, "tcp" },
+ { "mysql-im", { NULL }, 2273, "udp" },
+ { "pcttunnell", { NULL }, 2274, "tcp" },
+ { "pcttunnell", { NULL }, 2274, "udp" },
+ { "ibridge-data", { NULL }, 2275, "tcp" },
+ { "ibridge-data", { NULL }, 2275, "udp" },
+ { "ibridge-mgmt", { NULL }, 2276, "tcp" },
+ { "ibridge-mgmt", { NULL }, 2276, "udp" },
+ { "bluectrlproxy", { NULL }, 2277, "tcp" },
+ { "bluectrlproxy", { NULL }, 2277, "udp" },
+ { "s3db", { NULL }, 2278, "tcp" },
+ { "s3db", { NULL }, 2278, "udp" },
+ { "xmquery", { NULL }, 2279, "tcp" },
+ { "xmquery", { NULL }, 2279, "udp" },
+ { "lnvpoller", { NULL }, 2280, "tcp" },
+ { "lnvpoller", { NULL }, 2280, "udp" },
+ { "lnvconsole", { NULL }, 2281, "tcp" },
+ { "lnvconsole", { NULL }, 2281, "udp" },
+ { "lnvalarm", { NULL }, 2282, "tcp" },
+ { "lnvalarm", { NULL }, 2282, "udp" },
+ { "lnvstatus", { NULL }, 2283, "tcp" },
+ { "lnvstatus", { NULL }, 2283, "udp" },
+ { "lnvmaps", { NULL }, 2284, "tcp" },
+ { "lnvmaps", { NULL }, 2284, "udp" },
+ { "lnvmailmon", { NULL }, 2285, "tcp" },
+ { "lnvmailmon", { NULL }, 2285, "udp" },
+ { "nas-metering", { NULL }, 2286, "tcp" },
+ { "nas-metering", { NULL }, 2286, "udp" },
+ { "dna", { NULL }, 2287, "tcp" },
+ { "dna", { NULL }, 2287, "udp" },
+ { "netml", { NULL }, 2288, "tcp" },
+ { "netml", { NULL }, 2288, "udp" },
+ { "dict-lookup", { NULL }, 2289, "tcp" },
+ { "dict-lookup", { NULL }, 2289, "udp" },
+ { "sonus-logging", { NULL }, 2290, "tcp" },
+ { "sonus-logging", { NULL }, 2290, "udp" },
+ { "eapsp", { NULL }, 2291, "tcp" },
+ { "eapsp", { NULL }, 2291, "udp" },
+ { "mib-streaming", { NULL }, 2292, "tcp" },
+ { "mib-streaming", { NULL }, 2292, "udp" },
+ { "npdbgmngr", { NULL }, 2293, "tcp" },
+ { "npdbgmngr", { NULL }, 2293, "udp" },
+ { "konshus-lm", { NULL }, 2294, "tcp" },
+ { "konshus-lm", { NULL }, 2294, "udp" },
+ { "advant-lm", { NULL }, 2295, "tcp" },
+ { "advant-lm", { NULL }, 2295, "udp" },
+ { "theta-lm", { NULL }, 2296, "tcp" },
+ { "theta-lm", { NULL }, 2296, "udp" },
+ { "d2k-datamover1", { NULL }, 2297, "tcp" },
+ { "d2k-datamover1", { NULL }, 2297, "udp" },
+ { "d2k-datamover2", { NULL }, 2298, "tcp" },
+ { "d2k-datamover2", { NULL }, 2298, "udp" },
+ { "pc-telecommute", { NULL }, 2299, "tcp" },
+ { "pc-telecommute", { NULL }, 2299, "udp" },
+ { "cvmmon", { NULL }, 2300, "tcp" },
+ { "cvmmon", { NULL }, 2300, "udp" },
+ { "cpq-wbem", { NULL }, 2301, "tcp" },
+ { "cpq-wbem", { NULL }, 2301, "udp" },
+ { "binderysupport", { NULL }, 2302, "tcp" },
+ { "binderysupport", { NULL }, 2302, "udp" },
+ { "proxy-gateway", { NULL }, 2303, "tcp" },
+ { "proxy-gateway", { NULL }, 2303, "udp" },
+ { "attachmate-uts", { NULL }, 2304, "tcp" },
+ { "attachmate-uts", { NULL }, 2304, "udp" },
+ { "mt-scaleserver", { NULL }, 2305, "tcp" },
+ { "mt-scaleserver", { NULL }, 2305, "udp" },
+ { "tappi-boxnet", { NULL }, 2306, "tcp" },
+ { "tappi-boxnet", { NULL }, 2306, "udp" },
+ { "pehelp", { NULL }, 2307, "tcp" },
+ { "pehelp", { NULL }, 2307, "udp" },
+ { "sdhelp", { NULL }, 2308, "tcp" },
+ { "sdhelp", { NULL }, 2308, "udp" },
+ { "sdserver", { NULL }, 2309, "tcp" },
+ { "sdserver", { NULL }, 2309, "udp" },
+ { "sdclient", { NULL }, 2310, "tcp" },
+ { "sdclient", { NULL }, 2310, "udp" },
+ { "messageservice", { NULL }, 2311, "tcp" },
+ { "messageservice", { NULL }, 2311, "udp" },
+ { "wanscaler", { NULL }, 2312, "tcp" },
+ { "wanscaler", { NULL }, 2312, "udp" },
+ { "iapp", { NULL }, 2313, "tcp" },
+ { "iapp", { NULL }, 2313, "udp" },
+ { "cr-websystems", { NULL }, 2314, "tcp" },
+ { "cr-websystems", { NULL }, 2314, "udp" },
+ { "precise-sft", { NULL }, 2315, "tcp" },
+ { "precise-sft", { NULL }, 2315, "udp" },
+ { "sent-lm", { NULL }, 2316, "tcp" },
+ { "sent-lm", { NULL }, 2316, "udp" },
+ { "attachmate-g32", { NULL }, 2317, "tcp" },
+ { "attachmate-g32", { NULL }, 2317, "udp" },
+ { "cadencecontrol", { NULL }, 2318, "tcp" },
+ { "cadencecontrol", { NULL }, 2318, "udp" },
+ { "infolibria", { NULL }, 2319, "tcp" },
+ { "infolibria", { NULL }, 2319, "udp" },
+ { "siebel-ns", { NULL }, 2320, "tcp" },
+ { "siebel-ns", { NULL }, 2320, "udp" },
+ { "rdlap", { NULL }, 2321, "tcp" },
+ { "rdlap", { NULL }, 2321, "udp" },
+ { "ofsd", { NULL }, 2322, "tcp" },
+ { "ofsd", { NULL }, 2322, "udp" },
+ { "3d-nfsd", { NULL }, 2323, "tcp" },
+ { "3d-nfsd", { NULL }, 2323, "udp" },
+ { "cosmocall", { NULL }, 2324, "tcp" },
+ { "cosmocall", { NULL }, 2324, "udp" },
+ { "ansysli", { NULL }, 2325, "tcp" },
+ { "ansysli", { NULL }, 2325, "udp" },
+ { "idcp", { NULL }, 2326, "tcp" },
+ { "idcp", { NULL }, 2326, "udp" },
+ { "xingcsm", { NULL }, 2327, "tcp" },
+ { "xingcsm", { NULL }, 2327, "udp" },
+ { "netrix-sftm", { NULL }, 2328, "tcp" },
+ { "netrix-sftm", { NULL }, 2328, "udp" },
+ { "nvd", { NULL }, 2329, "tcp" },
+ { "nvd", { NULL }, 2329, "udp" },
+ { "tscchat", { NULL }, 2330, "tcp" },
+ { "tscchat", { NULL }, 2330, "udp" },
+ { "agentview", { NULL }, 2331, "tcp" },
+ { "agentview", { NULL }, 2331, "udp" },
+ { "rcc-host", { NULL }, 2332, "tcp" },
+ { "rcc-host", { NULL }, 2332, "udp" },
+ { "snapp", { NULL }, 2333, "tcp" },
+ { "snapp", { NULL }, 2333, "udp" },
+ { "ace-client", { NULL }, 2334, "tcp" },
+ { "ace-client", { NULL }, 2334, "udp" },
+ { "ace-proxy", { NULL }, 2335, "tcp" },
+ { "ace-proxy", { NULL }, 2335, "udp" },
+ { "appleugcontrol", { NULL }, 2336, "tcp" },
+ { "appleugcontrol", { NULL }, 2336, "udp" },
+ { "ideesrv", { NULL }, 2337, "tcp" },
+ { "ideesrv", { NULL }, 2337, "udp" },
+ { "norton-lambert", { NULL }, 2338, "tcp" },
+ { "norton-lambert", { NULL }, 2338, "udp" },
+ { "3com-webview", { NULL }, 2339, "tcp" },
+ { "3com-webview", { NULL }, 2339, "udp" },
+ { "wrs_registry", { NULL }, 2340, "tcp" },
+ { "wrs_registry", { NULL }, 2340, "udp" },
+ { "xiostatus", { NULL }, 2341, "tcp" },
+ { "xiostatus", { NULL }, 2341, "udp" },
+ { "manage-exec", { NULL }, 2342, "tcp" },
+ { "manage-exec", { NULL }, 2342, "udp" },
+ { "nati-logos", { NULL }, 2343, "tcp" },
+ { "nati-logos", { NULL }, 2343, "udp" },
+ { "fcmsys", { NULL }, 2344, "tcp" },
+ { "fcmsys", { NULL }, 2344, "udp" },
+ { "dbm", { NULL }, 2345, "tcp" },
+ { "dbm", { NULL }, 2345, "udp" },
+ { "redstorm_join", { NULL }, 2346, "tcp" },
+ { "redstorm_join", { NULL }, 2346, "udp" },
+ { "redstorm_find", { NULL }, 2347, "tcp" },
+ { "redstorm_find", { NULL }, 2347, "udp" },
+ { "redstorm_info", { NULL }, 2348, "tcp" },
+ { "redstorm_info", { NULL }, 2348, "udp" },
+ { "redstorm_diag", { NULL }, 2349, "tcp" },
+ { "redstorm_diag", { NULL }, 2349, "udp" },
+ { "psbserver", { NULL }, 2350, "tcp" },
+ { "psbserver", { NULL }, 2350, "udp" },
+ { "psrserver", { NULL }, 2351, "tcp" },
+ { "psrserver", { NULL }, 2351, "udp" },
+ { "pslserver", { NULL }, 2352, "tcp" },
+ { "pslserver", { NULL }, 2352, "udp" },
+ { "pspserver", { NULL }, 2353, "tcp" },
+ { "pspserver", { NULL }, 2353, "udp" },
+ { "psprserver", { NULL }, 2354, "tcp" },
+ { "psprserver", { NULL }, 2354, "udp" },
+ { "psdbserver", { NULL }, 2355, "tcp" },
+ { "psdbserver", { NULL }, 2355, "udp" },
+ { "gxtelmd", { NULL }, 2356, "tcp" },
+ { "gxtelmd", { NULL }, 2356, "udp" },
+ { "unihub-server", { NULL }, 2357, "tcp" },
+ { "unihub-server", { NULL }, 2357, "udp" },
+ { "futrix", { NULL }, 2358, "tcp" },
+ { "futrix", { NULL }, 2358, "udp" },
+ { "flukeserver", { NULL }, 2359, "tcp" },
+ { "flukeserver", { NULL }, 2359, "udp" },
+ { "nexstorindltd", { NULL }, 2360, "tcp" },
+ { "nexstorindltd", { NULL }, 2360, "udp" },
+ { "tl1", { NULL }, 2361, "tcp" },
+ { "tl1", { NULL }, 2361, "udp" },
+ { "digiman", { NULL }, 2362, "tcp" },
+ { "digiman", { NULL }, 2362, "udp" },
+ { "mediacntrlnfsd", { NULL }, 2363, "tcp" },
+ { "mediacntrlnfsd", { NULL }, 2363, "udp" },
+ { "oi-2000", { NULL }, 2364, "tcp" },
+ { "oi-2000", { NULL }, 2364, "udp" },
+ { "dbref", { NULL }, 2365, "tcp" },
+ { "dbref", { NULL }, 2365, "udp" },
+ { "qip-login", { NULL }, 2366, "tcp" },
+ { "qip-login", { NULL }, 2366, "udp" },
+ { "service-ctrl", { NULL }, 2367, "tcp" },
+ { "service-ctrl", { NULL }, 2367, "udp" },
+ { "opentable", { NULL }, 2368, "tcp" },
+ { "opentable", { NULL }, 2368, "udp" },
+ { "l3-hbmon", { NULL }, 2370, "tcp" },
+ { "l3-hbmon", { NULL }, 2370, "udp" },
+ { "worldwire", { NULL }, 2371, "tcp" },
+ { "worldwire", { NULL }, 2371, "udp" },
+ { "lanmessenger", { NULL }, 2372, "tcp" },
+ { "lanmessenger", { NULL }, 2372, "udp" },
+ { "remographlm", { NULL }, 2373, "tcp" },
+ { "hydra", { NULL }, 2374, "tcp" },
+ { "compaq-https", { NULL }, 2381, "tcp" },
+ { "compaq-https", { NULL }, 2381, "udp" },
+ { "ms-olap3", { NULL }, 2382, "tcp" },
+ { "ms-olap3", { NULL }, 2382, "udp" },
+ { "ms-olap4", { NULL }, 2383, "tcp" },
+ { "ms-olap4", { NULL }, 2383, "udp" },
+ { "sd-request", { NULL }, 2384, "tcp" },
+ { "sd-capacity", { NULL }, 2384, "udp" },
+ { "sd-data", { NULL }, 2385, "tcp" },
+ { "sd-data", { NULL }, 2385, "udp" },
+ { "virtualtape", { NULL }, 2386, "tcp" },
+ { "virtualtape", { NULL }, 2386, "udp" },
+ { "vsamredirector", { NULL }, 2387, "tcp" },
+ { "vsamredirector", { NULL }, 2387, "udp" },
+ { "mynahautostart", { NULL }, 2388, "tcp" },
+ { "mynahautostart", { NULL }, 2388, "udp" },
+ { "ovsessionmgr", { NULL }, 2389, "tcp" },
+ { "ovsessionmgr", { NULL }, 2389, "udp" },
+ { "rsmtp", { NULL }, 2390, "tcp" },
+ { "rsmtp", { NULL }, 2390, "udp" },
+ { "3com-net-mgmt", { NULL }, 2391, "tcp" },
+ { "3com-net-mgmt", { NULL }, 2391, "udp" },
+ { "tacticalauth", { NULL }, 2392, "tcp" },
+ { "tacticalauth", { NULL }, 2392, "udp" },
+ { "ms-olap1", { NULL }, 2393, "tcp" },
+ { "ms-olap1", { NULL }, 2393, "udp" },
+ { "ms-olap2", { NULL }, 2394, "tcp" },
+ { "ms-olap2", { NULL }, 2394, "udp" },
+ { "lan900_remote", { NULL }, 2395, "tcp" },
+ { "lan900_remote", { NULL }, 2395, "udp" },
+ { "wusage", { NULL }, 2396, "tcp" },
+ { "wusage", { NULL }, 2396, "udp" },
+ { "ncl", { NULL }, 2397, "tcp" },
+ { "ncl", { NULL }, 2397, "udp" },
+ { "orbiter", { NULL }, 2398, "tcp" },
+ { "orbiter", { NULL }, 2398, "udp" },
+ { "fmpro-fdal", { NULL }, 2399, "tcp" },
+ { "fmpro-fdal", { NULL }, 2399, "udp" },
+ { "opequus-server", { NULL }, 2400, "tcp" },
+ { "opequus-server", { NULL }, 2400, "udp" },
+ { "cvspserver", { NULL }, 2401, "tcp" },
+ { "cvspserver", { NULL }, 2401, "udp" },
+ { "taskmaster2000", { NULL }, 2402, "tcp" },
+ { "taskmaster2000", { NULL }, 2402, "udp" },
+ { "taskmaster2000", { NULL }, 2403, "tcp" },
+ { "taskmaster2000", { NULL }, 2403, "udp" },
+ { "iec-104", { NULL }, 2404, "tcp" },
+ { "iec-104", { NULL }, 2404, "udp" },
+ { "trc-netpoll", { NULL }, 2405, "tcp" },
+ { "trc-netpoll", { NULL }, 2405, "udp" },
+ { "jediserver", { NULL }, 2406, "tcp" },
+ { "jediserver", { NULL }, 2406, "udp" },
+ { "orion", { NULL }, 2407, "tcp" },
+ { "orion", { NULL }, 2407, "udp" },
+ { "optimanet", { NULL }, 2408, "tcp" },
+ { "optimanet", { NULL }, 2408, "udp" },
+ { "sns-protocol", { NULL }, 2409, "tcp" },
+ { "sns-protocol", { NULL }, 2409, "udp" },
+ { "vrts-registry", { NULL }, 2410, "tcp" },
+ { "vrts-registry", { NULL }, 2410, "udp" },
+ { "netwave-ap-mgmt", { NULL }, 2411, "tcp" },
+ { "netwave-ap-mgmt", { NULL }, 2411, "udp" },
+ { "cdn", { NULL }, 2412, "tcp" },
+ { "cdn", { NULL }, 2412, "udp" },
+ { "orion-rmi-reg", { NULL }, 2413, "tcp" },
+ { "orion-rmi-reg", { NULL }, 2413, "udp" },
+ { "beeyond", { NULL }, 2414, "tcp" },
+ { "beeyond", { NULL }, 2414, "udp" },
+ { "codima-rtp", { NULL }, 2415, "tcp" },
+ { "codima-rtp", { NULL }, 2415, "udp" },
+ { "rmtserver", { NULL }, 2416, "tcp" },
+ { "rmtserver", { NULL }, 2416, "udp" },
+ { "composit-server", { NULL }, 2417, "tcp" },
+ { "composit-server", { NULL }, 2417, "udp" },
+ { "cas", { NULL }, 2418, "tcp" },
+ { "cas", { NULL }, 2418, "udp" },
+ { "attachmate-s2s", { NULL }, 2419, "tcp" },
+ { "attachmate-s2s", { NULL }, 2419, "udp" },
+ { "dslremote-mgmt", { NULL }, 2420, "tcp" },
+ { "dslremote-mgmt", { NULL }, 2420, "udp" },
+ { "g-talk", { NULL }, 2421, "tcp" },
+ { "g-talk", { NULL }, 2421, "udp" },
+ { "crmsbits", { NULL }, 2422, "tcp" },
+ { "crmsbits", { NULL }, 2422, "udp" },
+ { "rnrp", { NULL }, 2423, "tcp" },
+ { "rnrp", { NULL }, 2423, "udp" },
+ { "kofax-svr", { NULL }, 2424, "tcp" },
+ { "kofax-svr", { NULL }, 2424, "udp" },
+ { "fjitsuappmgr", { NULL }, 2425, "tcp" },
+ { "fjitsuappmgr", { NULL }, 2425, "udp" },
+ { "mgcp-gateway", { NULL }, 2427, "tcp" },
+ { "mgcp-gateway", { NULL }, 2427, "udp" },
+ { "ott", { NULL }, 2428, "tcp" },
+ { "ott", { NULL }, 2428, "udp" },
+ { "ft-role", { NULL }, 2429, "tcp" },
+ { "ft-role", { NULL }, 2429, "udp" },
+ { "venus", { NULL }, 2430, "tcp" },
+ { "venus", { NULL }, 2430, "udp" },
+ { "venus-se", { NULL }, 2431, "tcp" },
+ { "venus-se", { NULL }, 2431, "udp" },
+ { "codasrv", { NULL }, 2432, "tcp" },
+ { "codasrv", { NULL }, 2432, "udp" },
+ { "codasrv-se", { NULL }, 2433, "tcp" },
+ { "codasrv-se", { NULL }, 2433, "udp" },
+ { "pxc-epmap", { NULL }, 2434, "tcp" },
+ { "pxc-epmap", { NULL }, 2434, "udp" },
+ { "optilogic", { NULL }, 2435, "tcp" },
+ { "optilogic", { NULL }, 2435, "udp" },
+ { "topx", { NULL }, 2436, "tcp" },
+ { "topx", { NULL }, 2436, "udp" },
+ { "unicontrol", { NULL }, 2437, "tcp" },
+ { "unicontrol", { NULL }, 2437, "udp" },
+ { "msp", { NULL }, 2438, "tcp" },
+ { "msp", { NULL }, 2438, "udp" },
+ { "sybasedbsynch", { NULL }, 2439, "tcp" },
+ { "sybasedbsynch", { NULL }, 2439, "udp" },
+ { "spearway", { NULL }, 2440, "tcp" },
+ { "spearway", { NULL }, 2440, "udp" },
+ { "pvsw-inet", { NULL }, 2441, "tcp" },
+ { "pvsw-inet", { NULL }, 2441, "udp" },
+ { "netangel", { NULL }, 2442, "tcp" },
+ { "netangel", { NULL }, 2442, "udp" },
+ { "powerclientcsf", { NULL }, 2443, "tcp" },
+ { "powerclientcsf", { NULL }, 2443, "udp" },
+ { "btpp2sectrans", { NULL }, 2444, "tcp" },
+ { "btpp2sectrans", { NULL }, 2444, "udp" },
+ { "dtn1", { NULL }, 2445, "tcp" },
+ { "dtn1", { NULL }, 2445, "udp" },
+ { "bues_service", { NULL }, 2446, "tcp" },
+ { "bues_service", { NULL }, 2446, "udp" },
+ { "ovwdb", { NULL }, 2447, "tcp" },
+ { "ovwdb", { NULL }, 2447, "udp" },
+ { "hpppssvr", { NULL }, 2448, "tcp" },
+ { "hpppssvr", { NULL }, 2448, "udp" },
+ { "ratl", { NULL }, 2449, "tcp" },
+ { "ratl", { NULL }, 2449, "udp" },
+ { "netadmin", { NULL }, 2450, "tcp" },
+ { "netadmin", { NULL }, 2450, "udp" },
+ { "netchat", { NULL }, 2451, "tcp" },
+ { "netchat", { NULL }, 2451, "udp" },
+ { "snifferclient", { NULL }, 2452, "tcp" },
+ { "snifferclient", { NULL }, 2452, "udp" },
+ { "madge-ltd", { NULL }, 2453, "tcp" },
+ { "madge-ltd", { NULL }, 2453, "udp" },
+ { "indx-dds", { NULL }, 2454, "tcp" },
+ { "indx-dds", { NULL }, 2454, "udp" },
+ { "wago-io-system", { NULL }, 2455, "tcp" },
+ { "wago-io-system", { NULL }, 2455, "udp" },
+ { "altav-remmgt", { NULL }, 2456, "tcp" },
+ { "altav-remmgt", { NULL }, 2456, "udp" },
+ { "rapido-ip", { NULL }, 2457, "tcp" },
+ { "rapido-ip", { NULL }, 2457, "udp" },
+ { "griffin", { NULL }, 2458, "tcp" },
+ { "griffin", { NULL }, 2458, "udp" },
+ { "community", { NULL }, 2459, "tcp" },
+ { "community", { NULL }, 2459, "udp" },
+ { "ms-theater", { NULL }, 2460, "tcp" },
+ { "ms-theater", { NULL }, 2460, "udp" },
+ { "qadmifoper", { NULL }, 2461, "tcp" },
+ { "qadmifoper", { NULL }, 2461, "udp" },
+ { "qadmifevent", { NULL }, 2462, "tcp" },
+ { "qadmifevent", { NULL }, 2462, "udp" },
+ { "lsi-raid-mgmt", { NULL }, 2463, "tcp" },
+ { "lsi-raid-mgmt", { NULL }, 2463, "udp" },
+ { "direcpc-si", { NULL }, 2464, "tcp" },
+ { "direcpc-si", { NULL }, 2464, "udp" },
+ { "lbm", { NULL }, 2465, "tcp" },
+ { "lbm", { NULL }, 2465, "udp" },
+ { "lbf", { NULL }, 2466, "tcp" },
+ { "lbf", { NULL }, 2466, "udp" },
+ { "high-criteria", { NULL }, 2467, "tcp" },
+ { "high-criteria", { NULL }, 2467, "udp" },
+ { "qip-msgd", { NULL }, 2468, "tcp" },
+ { "qip-msgd", { NULL }, 2468, "udp" },
+ { "mti-tcs-comm", { NULL }, 2469, "tcp" },
+ { "mti-tcs-comm", { NULL }, 2469, "udp" },
+ { "taskman-port", { NULL }, 2470, "tcp" },
+ { "taskman-port", { NULL }, 2470, "udp" },
+ { "seaodbc", { NULL }, 2471, "tcp" },
+ { "seaodbc", { NULL }, 2471, "udp" },
+ { "c3", { NULL }, 2472, "tcp" },
+ { "c3", { NULL }, 2472, "udp" },
+ { "aker-cdp", { NULL }, 2473, "tcp" },
+ { "aker-cdp", { NULL }, 2473, "udp" },
+ { "vitalanalysis", { NULL }, 2474, "tcp" },
+ { "vitalanalysis", { NULL }, 2474, "udp" },
+ { "ace-server", { NULL }, 2475, "tcp" },
+ { "ace-server", { NULL }, 2475, "udp" },
+ { "ace-svr-prop", { NULL }, 2476, "tcp" },
+ { "ace-svr-prop", { NULL }, 2476, "udp" },
+ { "ssm-cvs", { NULL }, 2477, "tcp" },
+ { "ssm-cvs", { NULL }, 2477, "udp" },
+ { "ssm-cssps", { NULL }, 2478, "tcp" },
+ { "ssm-cssps", { NULL }, 2478, "udp" },
+ { "ssm-els", { NULL }, 2479, "tcp" },
+ { "ssm-els", { NULL }, 2479, "udp" },
+ { "powerexchange", { NULL }, 2480, "tcp" },
+ { "powerexchange", { NULL }, 2480, "udp" },
+ { "giop", { NULL }, 2481, "tcp" },
+ { "giop", { NULL }, 2481, "udp" },
+ { "giop-ssl", { NULL }, 2482, "tcp" },
+ { "giop-ssl", { NULL }, 2482, "udp" },
+ { "ttc", { NULL }, 2483, "tcp" },
+ { "ttc", { NULL }, 2483, "udp" },
+ { "ttc-ssl", { NULL }, 2484, "tcp" },
+ { "ttc-ssl", { NULL }, 2484, "udp" },
+ { "netobjects1", { NULL }, 2485, "tcp" },
+ { "netobjects1", { NULL }, 2485, "udp" },
+ { "netobjects2", { NULL }, 2486, "tcp" },
+ { "netobjects2", { NULL }, 2486, "udp" },
+ { "pns", { NULL }, 2487, "tcp" },
+ { "pns", { NULL }, 2487, "udp" },
+ { "moy-corp", { NULL }, 2488, "tcp" },
+ { "moy-corp", { NULL }, 2488, "udp" },
+ { "tsilb", { NULL }, 2489, "tcp" },
+ { "tsilb", { NULL }, 2489, "udp" },
+ { "qip-qdhcp", { NULL }, 2490, "tcp" },
+ { "qip-qdhcp", { NULL }, 2490, "udp" },
+ { "conclave-cpp", { NULL }, 2491, "tcp" },
+ { "conclave-cpp", { NULL }, 2491, "udp" },
+ { "groove", { NULL }, 2492, "tcp" },
+ { "groove", { NULL }, 2492, "udp" },
+ { "talarian-mqs", { NULL }, 2493, "tcp" },
+ { "talarian-mqs", { NULL }, 2493, "udp" },
+ { "bmc-ar", { NULL }, 2494, "tcp" },
+ { "bmc-ar", { NULL }, 2494, "udp" },
+ { "fast-rem-serv", { NULL }, 2495, "tcp" },
+ { "fast-rem-serv", { NULL }, 2495, "udp" },
+ { "dirgis", { NULL }, 2496, "tcp" },
+ { "dirgis", { NULL }, 2496, "udp" },
+ { "quaddb", { NULL }, 2497, "tcp" },
+ { "quaddb", { NULL }, 2497, "udp" },
+ { "odn-castraq", { NULL }, 2498, "tcp" },
+ { "odn-castraq", { NULL }, 2498, "udp" },
+ { "unicontrol", { NULL }, 2499, "tcp" },
+ { "unicontrol", { NULL }, 2499, "udp" },
+ { "rtsserv", { NULL }, 2500, "tcp" },
+ { "rtsserv", { NULL }, 2500, "udp" },
+ { "rtsclient", { NULL }, 2501, "tcp" },
+ { "rtsclient", { NULL }, 2501, "udp" },
+ { "kentrox-prot", { NULL }, 2502, "tcp" },
+ { "kentrox-prot", { NULL }, 2502, "udp" },
+ { "nms-dpnss", { NULL }, 2503, "tcp" },
+ { "nms-dpnss", { NULL }, 2503, "udp" },
+ { "wlbs", { NULL }, 2504, "tcp" },
+ { "wlbs", { NULL }, 2504, "udp" },
+ { "ppcontrol", { NULL }, 2505, "tcp" },
+ { "ppcontrol", { NULL }, 2505, "udp" },
+ { "jbroker", { NULL }, 2506, "tcp" },
+ { "jbroker", { NULL }, 2506, "udp" },
+ { "spock", { NULL }, 2507, "tcp" },
+ { "spock", { NULL }, 2507, "udp" },
+ { "jdatastore", { NULL }, 2508, "tcp" },
+ { "jdatastore", { NULL }, 2508, "udp" },
+ { "fjmpss", { NULL }, 2509, "tcp" },
+ { "fjmpss", { NULL }, 2509, "udp" },
+ { "fjappmgrbulk", { NULL }, 2510, "tcp" },
+ { "fjappmgrbulk", { NULL }, 2510, "udp" },
+ { "metastorm", { NULL }, 2511, "tcp" },
+ { "metastorm", { NULL }, 2511, "udp" },
+ { "citrixima", { NULL }, 2512, "tcp" },
+ { "citrixima", { NULL }, 2512, "udp" },
+ { "citrixadmin", { NULL }, 2513, "tcp" },
+ { "citrixadmin", { NULL }, 2513, "udp" },
+ { "facsys-ntp", { NULL }, 2514, "tcp" },
+ { "facsys-ntp", { NULL }, 2514, "udp" },
+ { "facsys-router", { NULL }, 2515, "tcp" },
+ { "facsys-router", { NULL }, 2515, "udp" },
+ { "maincontrol", { NULL }, 2516, "tcp" },
+ { "maincontrol", { NULL }, 2516, "udp" },
+ { "call-sig-trans", { NULL }, 2517, "tcp" },
+ { "call-sig-trans", { NULL }, 2517, "udp" },
+ { "willy", { NULL }, 2518, "tcp" },
+ { "willy", { NULL }, 2518, "udp" },
+ { "globmsgsvc", { NULL }, 2519, "tcp" },
+ { "globmsgsvc", { NULL }, 2519, "udp" },
+ { "pvsw", { NULL }, 2520, "tcp" },
+ { "pvsw", { NULL }, 2520, "udp" },
+ { "adaptecmgr", { NULL }, 2521, "tcp" },
+ { "adaptecmgr", { NULL }, 2521, "udp" },
+ { "windb", { NULL }, 2522, "tcp" },
+ { "windb", { NULL }, 2522, "udp" },
+ { "qke-llc-v3", { NULL }, 2523, "tcp" },
+ { "qke-llc-v3", { NULL }, 2523, "udp" },
+ { "optiwave-lm", { NULL }, 2524, "tcp" },
+ { "optiwave-lm", { NULL }, 2524, "udp" },
+ { "ms-v-worlds", { NULL }, 2525, "tcp" },
+ { "ms-v-worlds", { NULL }, 2525, "udp" },
+ { "ema-sent-lm", { NULL }, 2526, "tcp" },
+ { "ema-sent-lm", { NULL }, 2526, "udp" },
+ { "iqserver", { NULL }, 2527, "tcp" },
+ { "iqserver", { NULL }, 2527, "udp" },
+ { "ncr_ccl", { NULL }, 2528, "tcp" },
+ { "ncr_ccl", { NULL }, 2528, "udp" },
+ { "utsftp", { NULL }, 2529, "tcp" },
+ { "utsftp", { NULL }, 2529, "udp" },
+ { "vrcommerce", { NULL }, 2530, "tcp" },
+ { "vrcommerce", { NULL }, 2530, "udp" },
+ { "ito-e-gui", { NULL }, 2531, "tcp" },
+ { "ito-e-gui", { NULL }, 2531, "udp" },
+ { "ovtopmd", { NULL }, 2532, "tcp" },
+ { "ovtopmd", { NULL }, 2532, "udp" },
+ { "snifferserver", { NULL }, 2533, "tcp" },
+ { "snifferserver", { NULL }, 2533, "udp" },
+ { "combox-web-acc", { NULL }, 2534, "tcp" },
+ { "combox-web-acc", { NULL }, 2534, "udp" },
+ { "madcap", { NULL }, 2535, "tcp" },
+ { "madcap", { NULL }, 2535, "udp" },
+ { "btpp2audctr1", { NULL }, 2536, "tcp" },
+ { "btpp2audctr1", { NULL }, 2536, "udp" },
+ { "upgrade", { NULL }, 2537, "tcp" },
+ { "upgrade", { NULL }, 2537, "udp" },
+ { "vnwk-prapi", { NULL }, 2538, "tcp" },
+ { "vnwk-prapi", { NULL }, 2538, "udp" },
+ { "vsiadmin", { NULL }, 2539, "tcp" },
+ { "vsiadmin", { NULL }, 2539, "udp" },
+ { "lonworks", { NULL }, 2540, "tcp" },
+ { "lonworks", { NULL }, 2540, "udp" },
+ { "lonworks2", { NULL }, 2541, "tcp" },
+ { "lonworks2", { NULL }, 2541, "udp" },
+ { "udrawgraph", { NULL }, 2542, "tcp" },
+ { "udrawgraph", { NULL }, 2542, "udp" },
+ { "reftek", { NULL }, 2543, "tcp" },
+ { "reftek", { NULL }, 2543, "udp" },
+ { "novell-zen", { NULL }, 2544, "tcp" },
+ { "novell-zen", { NULL }, 2544, "udp" },
+ { "sis-emt", { NULL }, 2545, "tcp" },
+ { "sis-emt", { NULL }, 2545, "udp" },
+ { "vytalvaultbrtp", { NULL }, 2546, "tcp" },
+ { "vytalvaultbrtp", { NULL }, 2546, "udp" },
+ { "vytalvaultvsmp", { NULL }, 2547, "tcp" },
+ { "vytalvaultvsmp", { NULL }, 2547, "udp" },
+ { "vytalvaultpipe", { NULL }, 2548, "tcp" },
+ { "vytalvaultpipe", { NULL }, 2548, "udp" },
+ { "ipass", { NULL }, 2549, "tcp" },
+ { "ipass", { NULL }, 2549, "udp" },
+ { "ads", { NULL }, 2550, "tcp" },
+ { "ads", { NULL }, 2550, "udp" },
+ { "isg-uda-server", { NULL }, 2551, "tcp" },
+ { "isg-uda-server", { NULL }, 2551, "udp" },
+ { "call-logging", { NULL }, 2552, "tcp" },
+ { "call-logging", { NULL }, 2552, "udp" },
+ { "efidiningport", { NULL }, 2553, "tcp" },
+ { "efidiningport", { NULL }, 2553, "udp" },
+ { "vcnet-link-v10", { NULL }, 2554, "tcp" },
+ { "vcnet-link-v10", { NULL }, 2554, "udp" },
+ { "compaq-wcp", { NULL }, 2555, "tcp" },
+ { "compaq-wcp", { NULL }, 2555, "udp" },
+ { "nicetec-nmsvc", { NULL }, 2556, "tcp" },
+ { "nicetec-nmsvc", { NULL }, 2556, "udp" },
+ { "nicetec-mgmt", { NULL }, 2557, "tcp" },
+ { "nicetec-mgmt", { NULL }, 2557, "udp" },
+ { "pclemultimedia", { NULL }, 2558, "tcp" },
+ { "pclemultimedia", { NULL }, 2558, "udp" },
+ { "lstp", { NULL }, 2559, "tcp" },
+ { "lstp", { NULL }, 2559, "udp" },
+ { "labrat", { NULL }, 2560, "tcp" },
+ { "labrat", { NULL }, 2560, "udp" },
+ { "mosaixcc", { NULL }, 2561, "tcp" },
+ { "mosaixcc", { NULL }, 2561, "udp" },
+ { "delibo", { NULL }, 2562, "tcp" },
+ { "delibo", { NULL }, 2562, "udp" },
+ { "cti-redwood", { NULL }, 2563, "tcp" },
+ { "cti-redwood", { NULL }, 2563, "udp" },
+ { "hp-3000-telnet", { NULL }, 2564, "tcp" },
+ { "coord-svr", { NULL }, 2565, "tcp" },
+ { "coord-svr", { NULL }, 2565, "udp" },
+ { "pcs-pcw", { NULL }, 2566, "tcp" },
+ { "pcs-pcw", { NULL }, 2566, "udp" },
+ { "clp", { NULL }, 2567, "tcp" },
+ { "clp", { NULL }, 2567, "udp" },
+ { "spamtrap", { NULL }, 2568, "tcp" },
+ { "spamtrap", { NULL }, 2568, "udp" },
+ { "sonuscallsig", { NULL }, 2569, "tcp" },
+ { "sonuscallsig", { NULL }, 2569, "udp" },
+ { "hs-port", { NULL }, 2570, "tcp" },
+ { "hs-port", { NULL }, 2570, "udp" },
+ { "cecsvc", { NULL }, 2571, "tcp" },
+ { "cecsvc", { NULL }, 2571, "udp" },
+ { "ibp", { NULL }, 2572, "tcp" },
+ { "ibp", { NULL }, 2572, "udp" },
+ { "trustestablish", { NULL }, 2573, "tcp" },
+ { "trustestablish", { NULL }, 2573, "udp" },
+ { "blockade-bpsp", { NULL }, 2574, "tcp" },
+ { "blockade-bpsp", { NULL }, 2574, "udp" },
+ { "hl7", { NULL }, 2575, "tcp" },
+ { "hl7", { NULL }, 2575, "udp" },
+ { "tclprodebugger", { NULL }, 2576, "tcp" },
+ { "tclprodebugger", { NULL }, 2576, "udp" },
+ { "scipticslsrvr", { NULL }, 2577, "tcp" },
+ { "scipticslsrvr", { NULL }, 2577, "udp" },
+ { "rvs-isdn-dcp", { NULL }, 2578, "tcp" },
+ { "rvs-isdn-dcp", { NULL }, 2578, "udp" },
+ { "mpfoncl", { NULL }, 2579, "tcp" },
+ { "mpfoncl", { NULL }, 2579, "udp" },
+ { "tributary", { NULL }, 2580, "tcp" },
+ { "tributary", { NULL }, 2580, "udp" },
+ { "argis-te", { NULL }, 2581, "tcp" },
+ { "argis-te", { NULL }, 2581, "udp" },
+ { "argis-ds", { NULL }, 2582, "tcp" },
+ { "argis-ds", { NULL }, 2582, "udp" },
+ { "mon", { NULL }, 2583, "tcp" },
+ { "mon", { NULL }, 2583, "udp" },
+ { "cyaserv", { NULL }, 2584, "tcp" },
+ { "cyaserv", { NULL }, 2584, "udp" },
+ { "netx-server", { NULL }, 2585, "tcp" },
+ { "netx-server", { NULL }, 2585, "udp" },
+ { "netx-agent", { NULL }, 2586, "tcp" },
+ { "netx-agent", { NULL }, 2586, "udp" },
+ { "masc", { NULL }, 2587, "tcp" },
+ { "masc", { NULL }, 2587, "udp" },
+ { "privilege", { NULL }, 2588, "tcp" },
+ { "privilege", { NULL }, 2588, "udp" },
+ { "quartus-tcl", { NULL }, 2589, "tcp" },
+ { "quartus-tcl", { NULL }, 2589, "udp" },
+ { "idotdist", { NULL }, 2590, "tcp" },
+ { "idotdist", { NULL }, 2590, "udp" },
+ { "maytagshuffle", { NULL }, 2591, "tcp" },
+ { "maytagshuffle", { NULL }, 2591, "udp" },
+ { "netrek", { NULL }, 2592, "tcp" },
+ { "netrek", { NULL }, 2592, "udp" },
+ { "mns-mail", { NULL }, 2593, "tcp" },
+ { "mns-mail", { NULL }, 2593, "udp" },
+ { "dts", { NULL }, 2594, "tcp" },
+ { "dts", { NULL }, 2594, "udp" },
+ { "worldfusion1", { NULL }, 2595, "tcp" },
+ { "worldfusion1", { NULL }, 2595, "udp" },
+ { "worldfusion2", { NULL }, 2596, "tcp" },
+ { "worldfusion2", { NULL }, 2596, "udp" },
+ { "homesteadglory", { NULL }, 2597, "tcp" },
+ { "homesteadglory", { NULL }, 2597, "udp" },
+ { "citriximaclient", { NULL }, 2598, "tcp" },
+ { "citriximaclient", { NULL }, 2598, "udp" },
+ { "snapd", { NULL }, 2599, "tcp" },
+ { "snapd", { NULL }, 2599, "udp" },
+ { "hpstgmgr", { NULL }, 2600, "tcp" },
+ { "hpstgmgr", { NULL }, 2600, "udp" },
+ { "discp-client", { NULL }, 2601, "tcp" },
+ { "discp-client", { NULL }, 2601, "udp" },
+ { "discp-server", { NULL }, 2602, "tcp" },
+ { "discp-server", { NULL }, 2602, "udp" },
+ { "servicemeter", { NULL }, 2603, "tcp" },
+ { "servicemeter", { NULL }, 2603, "udp" },
+ { "nsc-ccs", { NULL }, 2604, "tcp" },
+ { "nsc-ccs", { NULL }, 2604, "udp" },
+ { "nsc-posa", { NULL }, 2605, "tcp" },
+ { "nsc-posa", { NULL }, 2605, "udp" },
+ { "netmon", { NULL }, 2606, "tcp" },
+ { "netmon", { NULL }, 2606, "udp" },
+ { "connection", { NULL }, 2607, "tcp" },
+ { "connection", { NULL }, 2607, "udp" },
+ { "wag-service", { NULL }, 2608, "tcp" },
+ { "wag-service", { NULL }, 2608, "udp" },
+ { "system-monitor", { NULL }, 2609, "tcp" },
+ { "system-monitor", { NULL }, 2609, "udp" },
+ { "versa-tek", { NULL }, 2610, "tcp" },
+ { "versa-tek", { NULL }, 2610, "udp" },
+ { "lionhead", { NULL }, 2611, "tcp" },
+ { "lionhead", { NULL }, 2611, "udp" },
+ { "qpasa-agent", { NULL }, 2612, "tcp" },
+ { "qpasa-agent", { NULL }, 2612, "udp" },
+ { "smntubootstrap", { NULL }, 2613, "tcp" },
+ { "smntubootstrap", { NULL }, 2613, "udp" },
+ { "neveroffline", { NULL }, 2614, "tcp" },
+ { "neveroffline", { NULL }, 2614, "udp" },
+ { "firepower", { NULL }, 2615, "tcp" },
+ { "firepower", { NULL }, 2615, "udp" },
+ { "appswitch-emp", { NULL }, 2616, "tcp" },
+ { "appswitch-emp", { NULL }, 2616, "udp" },
+ { "cmadmin", { NULL }, 2617, "tcp" },
+ { "cmadmin", { NULL }, 2617, "udp" },
+ { "priority-e-com", { NULL }, 2618, "tcp" },
+ { "priority-e-com", { NULL }, 2618, "udp" },
+ { "bruce", { NULL }, 2619, "tcp" },
+ { "bruce", { NULL }, 2619, "udp" },
+ { "lpsrecommender", { NULL }, 2620, "tcp" },
+ { "lpsrecommender", { NULL }, 2620, "udp" },
+ { "miles-apart", { NULL }, 2621, "tcp" },
+ { "miles-apart", { NULL }, 2621, "udp" },
+ { "metricadbc", { NULL }, 2622, "tcp" },
+ { "metricadbc", { NULL }, 2622, "udp" },
+ { "lmdp", { NULL }, 2623, "tcp" },
+ { "lmdp", { NULL }, 2623, "udp" },
+ { "aria", { NULL }, 2624, "tcp" },
+ { "aria", { NULL }, 2624, "udp" },
+ { "blwnkl-port", { NULL }, 2625, "tcp" },
+ { "blwnkl-port", { NULL }, 2625, "udp" },
+ { "gbjd816", { NULL }, 2626, "tcp" },
+ { "gbjd816", { NULL }, 2626, "udp" },
+ { "moshebeeri", { NULL }, 2627, "tcp" },
+ { "moshebeeri", { NULL }, 2627, "udp" },
+ { "dict", { NULL }, 2628, "tcp" },
+ { "dict", { NULL }, 2628, "udp" },
+ { "sitaraserver", { NULL }, 2629, "tcp" },
+ { "sitaraserver", { NULL }, 2629, "udp" },
+ { "sitaramgmt", { NULL }, 2630, "tcp" },
+ { "sitaramgmt", { NULL }, 2630, "udp" },
+ { "sitaradir", { NULL }, 2631, "tcp" },
+ { "sitaradir", { NULL }, 2631, "udp" },
+ { "irdg-post", { NULL }, 2632, "tcp" },
+ { "irdg-post", { NULL }, 2632, "udp" },
+ { "interintelli", { NULL }, 2633, "tcp" },
+ { "interintelli", { NULL }, 2633, "udp" },
+ { "pk-electronics", { NULL }, 2634, "tcp" },
+ { "pk-electronics", { NULL }, 2634, "udp" },
+ { "backburner", { NULL }, 2635, "tcp" },
+ { "backburner", { NULL }, 2635, "udp" },
+ { "solve", { NULL }, 2636, "tcp" },
+ { "solve", { NULL }, 2636, "udp" },
+ { "imdocsvc", { NULL }, 2637, "tcp" },
+ { "imdocsvc", { NULL }, 2637, "udp" },
+ { "sybaseanywhere", { NULL }, 2638, "tcp" },
+ { "sybaseanywhere", { NULL }, 2638, "udp" },
+ { "aminet", { NULL }, 2639, "tcp" },
+ { "aminet", { NULL }, 2639, "udp" },
+ { "sai_sentlm", { NULL }, 2640, "tcp" },
+ { "sai_sentlm", { NULL }, 2640, "udp" },
+ { "hdl-srv", { NULL }, 2641, "tcp" },
+ { "hdl-srv", { NULL }, 2641, "udp" },
+ { "tragic", { NULL }, 2642, "tcp" },
+ { "tragic", { NULL }, 2642, "udp" },
+ { "gte-samp", { NULL }, 2643, "tcp" },
+ { "gte-samp", { NULL }, 2643, "udp" },
+ { "travsoft-ipx-t", { NULL }, 2644, "tcp" },
+ { "travsoft-ipx-t", { NULL }, 2644, "udp" },
+ { "novell-ipx-cmd", { NULL }, 2645, "tcp" },
+ { "novell-ipx-cmd", { NULL }, 2645, "udp" },
+ { "and-lm", { NULL }, 2646, "tcp" },
+ { "and-lm", { NULL }, 2646, "udp" },
+ { "syncserver", { NULL }, 2647, "tcp" },
+ { "syncserver", { NULL }, 2647, "udp" },
+ { "upsnotifyprot", { NULL }, 2648, "tcp" },
+ { "upsnotifyprot", { NULL }, 2648, "udp" },
+ { "vpsipport", { NULL }, 2649, "tcp" },
+ { "vpsipport", { NULL }, 2649, "udp" },
+ { "eristwoguns", { NULL }, 2650, "tcp" },
+ { "eristwoguns", { NULL }, 2650, "udp" },
+ { "ebinsite", { NULL }, 2651, "tcp" },
+ { "ebinsite", { NULL }, 2651, "udp" },
+ { "interpathpanel", { NULL }, 2652, "tcp" },
+ { "interpathpanel", { NULL }, 2652, "udp" },
+ { "sonus", { NULL }, 2653, "tcp" },
+ { "sonus", { NULL }, 2653, "udp" },
+ { "corel_vncadmin", { NULL }, 2654, "tcp" },
+ { "corel_vncadmin", { NULL }, 2654, "udp" },
+ { "unglue", { NULL }, 2655, "tcp" },
+ { "unglue", { NULL }, 2655, "udp" },
+ { "kana", { NULL }, 2656, "tcp" },
+ { "kana", { NULL }, 2656, "udp" },
+ { "sns-dispatcher", { NULL }, 2657, "tcp" },
+ { "sns-dispatcher", { NULL }, 2657, "udp" },
+ { "sns-admin", { NULL }, 2658, "tcp" },
+ { "sns-admin", { NULL }, 2658, "udp" },
+ { "sns-query", { NULL }, 2659, "tcp" },
+ { "sns-query", { NULL }, 2659, "udp" },
+ { "gcmonitor", { NULL }, 2660, "tcp" },
+ { "gcmonitor", { NULL }, 2660, "udp" },
+ { "olhost", { NULL }, 2661, "tcp" },
+ { "olhost", { NULL }, 2661, "udp" },
+ { "bintec-capi", { NULL }, 2662, "tcp" },
+ { "bintec-capi", { NULL }, 2662, "udp" },
+ { "bintec-tapi", { NULL }, 2663, "tcp" },
+ { "bintec-tapi", { NULL }, 2663, "udp" },
+ { "patrol-mq-gm", { NULL }, 2664, "tcp" },
+ { "patrol-mq-gm", { NULL }, 2664, "udp" },
+ { "patrol-mq-nm", { NULL }, 2665, "tcp" },
+ { "patrol-mq-nm", { NULL }, 2665, "udp" },
+ { "extensis", { NULL }, 2666, "tcp" },
+ { "extensis", { NULL }, 2666, "udp" },
+ { "alarm-clock-s", { NULL }, 2667, "tcp" },
+ { "alarm-clock-s", { NULL }, 2667, "udp" },
+ { "alarm-clock-c", { NULL }, 2668, "tcp" },
+ { "alarm-clock-c", { NULL }, 2668, "udp" },
+ { "toad", { NULL }, 2669, "tcp" },
+ { "toad", { NULL }, 2669, "udp" },
+ { "tve-announce", { NULL }, 2670, "tcp" },
+ { "tve-announce", { NULL }, 2670, "udp" },
+ { "newlixreg", { NULL }, 2671, "tcp" },
+ { "newlixreg", { NULL }, 2671, "udp" },
+ { "nhserver", { NULL }, 2672, "tcp" },
+ { "nhserver", { NULL }, 2672, "udp" },
+ { "firstcall42", { NULL }, 2673, "tcp" },
+ { "firstcall42", { NULL }, 2673, "udp" },
+ { "ewnn", { NULL }, 2674, "tcp" },
+ { "ewnn", { NULL }, 2674, "udp" },
+ { "ttc-etap", { NULL }, 2675, "tcp" },
+ { "ttc-etap", { NULL }, 2675, "udp" },
+ { "simslink", { NULL }, 2676, "tcp" },
+ { "simslink", { NULL }, 2676, "udp" },
+ { "gadgetgate1way", { NULL }, 2677, "tcp" },
+ { "gadgetgate1way", { NULL }, 2677, "udp" },
+ { "gadgetgate2way", { NULL }, 2678, "tcp" },
+ { "gadgetgate2way", { NULL }, 2678, "udp" },
+ { "syncserverssl", { NULL }, 2679, "tcp" },
+ { "syncserverssl", { NULL }, 2679, "udp" },
+ { "pxc-sapxom", { NULL }, 2680, "tcp" },
+ { "pxc-sapxom", { NULL }, 2680, "udp" },
+ { "mpnjsomb", { NULL }, 2681, "tcp" },
+ { "mpnjsomb", { NULL }, 2681, "udp" },
+ { "ncdloadbalance", { NULL }, 2683, "tcp" },
+ { "ncdloadbalance", { NULL }, 2683, "udp" },
+ { "mpnjsosv", { NULL }, 2684, "tcp" },
+ { "mpnjsosv", { NULL }, 2684, "udp" },
+ { "mpnjsocl", { NULL }, 2685, "tcp" },
+ { "mpnjsocl", { NULL }, 2685, "udp" },
+ { "mpnjsomg", { NULL }, 2686, "tcp" },
+ { "mpnjsomg", { NULL }, 2686, "udp" },
+ { "pq-lic-mgmt", { NULL }, 2687, "tcp" },
+ { "pq-lic-mgmt", { NULL }, 2687, "udp" },
+ { "md-cg-http", { NULL }, 2688, "tcp" },
+ { "md-cg-http", { NULL }, 2688, "udp" },
+ { "fastlynx", { NULL }, 2689, "tcp" },
+ { "fastlynx", { NULL }, 2689, "udp" },
+ { "hp-nnm-data", { NULL }, 2690, "tcp" },
+ { "hp-nnm-data", { NULL }, 2690, "udp" },
+ { "itinternet", { NULL }, 2691, "tcp" },
+ { "itinternet", { NULL }, 2691, "udp" },
+ { "admins-lms", { NULL }, 2692, "tcp" },
+ { "admins-lms", { NULL }, 2692, "udp" },
+ { "pwrsevent", { NULL }, 2694, "tcp" },
+ { "pwrsevent", { NULL }, 2694, "udp" },
+ { "vspread", { NULL }, 2695, "tcp" },
+ { "vspread", { NULL }, 2695, "udp" },
+ { "unifyadmin", { NULL }, 2696, "tcp" },
+ { "unifyadmin", { NULL }, 2696, "udp" },
+ { "oce-snmp-trap", { NULL }, 2697, "tcp" },
+ { "oce-snmp-trap", { NULL }, 2697, "udp" },
+ { "mck-ivpip", { NULL }, 2698, "tcp" },
+ { "mck-ivpip", { NULL }, 2698, "udp" },
+ { "csoft-plusclnt", { NULL }, 2699, "tcp" },
+ { "csoft-plusclnt", { NULL }, 2699, "udp" },
+ { "tqdata", { NULL }, 2700, "tcp" },
+ { "tqdata", { NULL }, 2700, "udp" },
+ { "sms-rcinfo", { NULL }, 2701, "tcp" },
+ { "sms-rcinfo", { NULL }, 2701, "udp" },
+ { "sms-xfer", { NULL }, 2702, "tcp" },
+ { "sms-xfer", { NULL }, 2702, "udp" },
+ { "sms-chat", { NULL }, 2703, "tcp" },
+ { "sms-chat", { NULL }, 2703, "udp" },
+ { "sms-remctrl", { NULL }, 2704, "tcp" },
+ { "sms-remctrl", { NULL }, 2704, "udp" },
+ { "sds-admin", { NULL }, 2705, "tcp" },
+ { "sds-admin", { NULL }, 2705, "udp" },
+ { "ncdmirroring", { NULL }, 2706, "tcp" },
+ { "ncdmirroring", { NULL }, 2706, "udp" },
+ { "emcsymapiport", { NULL }, 2707, "tcp" },
+ { "emcsymapiport", { NULL }, 2707, "udp" },
+ { "banyan-net", { NULL }, 2708, "tcp" },
+ { "banyan-net", { NULL }, 2708, "udp" },
+ { "supermon", { NULL }, 2709, "tcp" },
+ { "supermon", { NULL }, 2709, "udp" },
+ { "sso-service", { NULL }, 2710, "tcp" },
+ { "sso-service", { NULL }, 2710, "udp" },
+ { "sso-control", { NULL }, 2711, "tcp" },
+ { "sso-control", { NULL }, 2711, "udp" },
+ { "aocp", { NULL }, 2712, "tcp" },
+ { "aocp", { NULL }, 2712, "udp" },
+ { "raventbs", { NULL }, 2713, "tcp" },
+ { "raventbs", { NULL }, 2713, "udp" },
+ { "raventdm", { NULL }, 2714, "tcp" },
+ { "raventdm", { NULL }, 2714, "udp" },
+ { "hpstgmgr2", { NULL }, 2715, "tcp" },
+ { "hpstgmgr2", { NULL }, 2715, "udp" },
+ { "inova-ip-disco", { NULL }, 2716, "tcp" },
+ { "inova-ip-disco", { NULL }, 2716, "udp" },
+ { "pn-requester", { NULL }, 2717, "tcp" },
+ { "pn-requester", { NULL }, 2717, "udp" },
+ { "pn-requester2", { NULL }, 2718, "tcp" },
+ { "pn-requester2", { NULL }, 2718, "udp" },
+ { "scan-change", { NULL }, 2719, "tcp" },
+ { "scan-change", { NULL }, 2719, "udp" },
+ { "wkars", { NULL }, 2720, "tcp" },
+ { "wkars", { NULL }, 2720, "udp" },
+ { "smart-diagnose", { NULL }, 2721, "tcp" },
+ { "smart-diagnose", { NULL }, 2721, "udp" },
+ { "proactivesrvr", { NULL }, 2722, "tcp" },
+ { "proactivesrvr", { NULL }, 2722, "udp" },
+ { "watchdog-nt", { NULL }, 2723, "tcp" },
+ { "watchdog-nt", { NULL }, 2723, "udp" },
+ { "qotps", { NULL }, 2724, "tcp" },
+ { "qotps", { NULL }, 2724, "udp" },
+ { "msolap-ptp2", { NULL }, 2725, "tcp" },
+ { "msolap-ptp2", { NULL }, 2725, "udp" },
+ { "tams", { NULL }, 2726, "tcp" },
+ { "tams", { NULL }, 2726, "udp" },
+ { "mgcp-callagent", { NULL }, 2727, "tcp" },
+ { "mgcp-callagent", { NULL }, 2727, "udp" },
+ { "sqdr", { NULL }, 2728, "tcp" },
+ { "sqdr", { NULL }, 2728, "udp" },
+ { "tcim-control", { NULL }, 2729, "tcp" },
+ { "tcim-control", { NULL }, 2729, "udp" },
+ { "nec-raidplus", { NULL }, 2730, "tcp" },
+ { "nec-raidplus", { NULL }, 2730, "udp" },
+ { "fyre-messanger", { NULL }, 2731, "tcp" },
+ { "fyre-messanger", { NULL }, 2731, "udp" },
+ { "g5m", { NULL }, 2732, "tcp" },
+ { "g5m", { NULL }, 2732, "udp" },
+ { "signet-ctf", { NULL }, 2733, "tcp" },
+ { "signet-ctf", { NULL }, 2733, "udp" },
+ { "ccs-software", { NULL }, 2734, "tcp" },
+ { "ccs-software", { NULL }, 2734, "udp" },
+ { "netiq-mc", { NULL }, 2735, "tcp" },
+ { "netiq-mc", { NULL }, 2735, "udp" },
+ { "radwiz-nms-srv", { NULL }, 2736, "tcp" },
+ { "radwiz-nms-srv", { NULL }, 2736, "udp" },
+ { "srp-feedback", { NULL }, 2737, "tcp" },
+ { "srp-feedback", { NULL }, 2737, "udp" },
+ { "ndl-tcp-ois-gw", { NULL }, 2738, "tcp" },
+ { "ndl-tcp-ois-gw", { NULL }, 2738, "udp" },
+ { "tn-timing", { NULL }, 2739, "tcp" },
+ { "tn-timing", { NULL }, 2739, "udp" },
+ { "alarm", { NULL }, 2740, "tcp" },
+ { "alarm", { NULL }, 2740, "udp" },
+ { "tsb", { NULL }, 2741, "tcp" },
+ { "tsb", { NULL }, 2741, "udp" },
+ { "tsb2", { NULL }, 2742, "tcp" },
+ { "tsb2", { NULL }, 2742, "udp" },
+ { "murx", { NULL }, 2743, "tcp" },
+ { "murx", { NULL }, 2743, "udp" },
+ { "honyaku", { NULL }, 2744, "tcp" },
+ { "honyaku", { NULL }, 2744, "udp" },
+ { "urbisnet", { NULL }, 2745, "tcp" },
+ { "urbisnet", { NULL }, 2745, "udp" },
+ { "cpudpencap", { NULL }, 2746, "tcp" },
+ { "cpudpencap", { NULL }, 2746, "udp" },
+ { "fjippol-swrly", { NULL }, 2747, "tcp" },
+ { "fjippol-swrly", { NULL }, 2747, "udp" },
+ { "fjippol-polsvr", { NULL }, 2748, "tcp" },
+ { "fjippol-polsvr", { NULL }, 2748, "udp" },
+ { "fjippol-cnsl", { NULL }, 2749, "tcp" },
+ { "fjippol-cnsl", { NULL }, 2749, "udp" },
+ { "fjippol-port1", { NULL }, 2750, "tcp" },
+ { "fjippol-port1", { NULL }, 2750, "udp" },
+ { "fjippol-port2", { NULL }, 2751, "tcp" },
+ { "fjippol-port2", { NULL }, 2751, "udp" },
+ { "rsisysaccess", { NULL }, 2752, "tcp" },
+ { "rsisysaccess", { NULL }, 2752, "udp" },
+ { "de-spot", { NULL }, 2753, "tcp" },
+ { "de-spot", { NULL }, 2753, "udp" },
+ { "apollo-cc", { NULL }, 2754, "tcp" },
+ { "apollo-cc", { NULL }, 2754, "udp" },
+ { "expresspay", { NULL }, 2755, "tcp" },
+ { "expresspay", { NULL }, 2755, "udp" },
+ { "simplement-tie", { NULL }, 2756, "tcp" },
+ { "simplement-tie", { NULL }, 2756, "udp" },
+ { "cnrp", { NULL }, 2757, "tcp" },
+ { "cnrp", { NULL }, 2757, "udp" },
+ { "apollo-status", { NULL }, 2758, "tcp" },
+ { "apollo-status", { NULL }, 2758, "udp" },
+ { "apollo-gms", { NULL }, 2759, "tcp" },
+ { "apollo-gms", { NULL }, 2759, "udp" },
+ { "sabams", { NULL }, 2760, "tcp" },
+ { "sabams", { NULL }, 2760, "udp" },
+ { "dicom-iscl", { NULL }, 2761, "tcp" },
+ { "dicom-iscl", { NULL }, 2761, "udp" },
+ { "dicom-tls", { NULL }, 2762, "tcp" },
+ { "dicom-tls", { NULL }, 2762, "udp" },
+ { "desktop-dna", { NULL }, 2763, "tcp" },
+ { "desktop-dna", { NULL }, 2763, "udp" },
+ { "data-insurance", { NULL }, 2764, "tcp" },
+ { "data-insurance", { NULL }, 2764, "udp" },
+ { "qip-audup", { NULL }, 2765, "tcp" },
+ { "qip-audup", { NULL }, 2765, "udp" },
+ { "compaq-scp", { NULL }, 2766, "tcp" },
+ { "compaq-scp", { NULL }, 2766, "udp" },
+ { "uadtc", { NULL }, 2767, "tcp" },
+ { "uadtc", { NULL }, 2767, "udp" },
+ { "uacs", { NULL }, 2768, "tcp" },
+ { "uacs", { NULL }, 2768, "udp" },
+ { "exce", { NULL }, 2769, "tcp" },
+ { "exce", { NULL }, 2769, "udp" },
+ { "veronica", { NULL }, 2770, "tcp" },
+ { "veronica", { NULL }, 2770, "udp" },
+ { "vergencecm", { NULL }, 2771, "tcp" },
+ { "vergencecm", { NULL }, 2771, "udp" },
+ { "auris", { NULL }, 2772, "tcp" },
+ { "auris", { NULL }, 2772, "udp" },
+ { "rbakcup1", { NULL }, 2773, "tcp" },
+ { "rbakcup1", { NULL }, 2773, "udp" },
+ { "rbakcup2", { NULL }, 2774, "tcp" },
+ { "rbakcup2", { NULL }, 2774, "udp" },
+ { "smpp", { NULL }, 2775, "tcp" },
+ { "smpp", { NULL }, 2775, "udp" },
+ { "ridgeway1", { NULL }, 2776, "tcp" },
+ { "ridgeway1", { NULL }, 2776, "udp" },
+ { "ridgeway2", { NULL }, 2777, "tcp" },
+ { "ridgeway2", { NULL }, 2777, "udp" },
+ { "gwen-sonya", { NULL }, 2778, "tcp" },
+ { "gwen-sonya", { NULL }, 2778, "udp" },
+ { "lbc-sync", { NULL }, 2779, "tcp" },
+ { "lbc-sync", { NULL }, 2779, "udp" },
+ { "lbc-control", { NULL }, 2780, "tcp" },
+ { "lbc-control", { NULL }, 2780, "udp" },
+ { "whosells", { NULL }, 2781, "tcp" },
+ { "whosells", { NULL }, 2781, "udp" },
+ { "everydayrc", { NULL }, 2782, "tcp" },
+ { "everydayrc", { NULL }, 2782, "udp" },
+ { "aises", { NULL }, 2783, "tcp" },
+ { "aises", { NULL }, 2783, "udp" },
+ { "www-dev", { NULL }, 2784, "tcp" },
+ { "www-dev", { NULL }, 2784, "udp" },
+ { "aic-np", { NULL }, 2785, "tcp" },
+ { "aic-np", { NULL }, 2785, "udp" },
+ { "aic-oncrpc", { NULL }, 2786, "tcp" },
+ { "aic-oncrpc", { NULL }, 2786, "udp" },
+ { "piccolo", { NULL }, 2787, "tcp" },
+ { "piccolo", { NULL }, 2787, "udp" },
+ { "fryeserv", { NULL }, 2788, "tcp" },
+ { "fryeserv", { NULL }, 2788, "udp" },
+ { "media-agent", { NULL }, 2789, "tcp" },
+ { "media-agent", { NULL }, 2789, "udp" },
+ { "plgproxy", { NULL }, 2790, "tcp" },
+ { "plgproxy", { NULL }, 2790, "udp" },
+ { "mtport-regist", { NULL }, 2791, "tcp" },
+ { "mtport-regist", { NULL }, 2791, "udp" },
+ { "f5-globalsite", { NULL }, 2792, "tcp" },
+ { "f5-globalsite", { NULL }, 2792, "udp" },
+ { "initlsmsad", { NULL }, 2793, "tcp" },
+ { "initlsmsad", { NULL }, 2793, "udp" },
+ { "livestats", { NULL }, 2795, "tcp" },
+ { "livestats", { NULL }, 2795, "udp" },
+ { "ac-tech", { NULL }, 2796, "tcp" },
+ { "ac-tech", { NULL }, 2796, "udp" },
+ { "esp-encap", { NULL }, 2797, "tcp" },
+ { "esp-encap", { NULL }, 2797, "udp" },
+ { "tmesis-upshot", { NULL }, 2798, "tcp" },
+ { "tmesis-upshot", { NULL }, 2798, "udp" },
+ { "icon-discover", { NULL }, 2799, "tcp" },
+ { "icon-discover", { NULL }, 2799, "udp" },
+ { "acc-raid", { NULL }, 2800, "tcp" },
+ { "acc-raid", { NULL }, 2800, "udp" },
+ { "igcp", { NULL }, 2801, "tcp" },
+ { "igcp", { NULL }, 2801, "udp" },
+ { "veritas-tcp1", { NULL }, 2802, "tcp" },
+ { "veritas-udp1", { NULL }, 2802, "udp" },
+ { "btprjctrl", { NULL }, 2803, "tcp" },
+ { "btprjctrl", { NULL }, 2803, "udp" },
+ { "dvr-esm", { NULL }, 2804, "tcp" },
+ { "dvr-esm", { NULL }, 2804, "udp" },
+ { "wta-wsp-s", { NULL }, 2805, "tcp" },
+ { "wta-wsp-s", { NULL }, 2805, "udp" },
+ { "cspuni", { NULL }, 2806, "tcp" },
+ { "cspuni", { NULL }, 2806, "udp" },
+ { "cspmulti", { NULL }, 2807, "tcp" },
+ { "cspmulti", { NULL }, 2807, "udp" },
+ { "j-lan-p", { NULL }, 2808, "tcp" },
+ { "j-lan-p", { NULL }, 2808, "udp" },
+ { "corbaloc", { NULL }, 2809, "tcp" },
+ { "corbaloc", { NULL }, 2809, "udp" },
+ { "netsteward", { NULL }, 2810, "tcp" },
+ { "netsteward", { NULL }, 2810, "udp" },
+ { "gsiftp", { NULL }, 2811, "tcp" },
+ { "gsiftp", { NULL }, 2811, "udp" },
+ { "atmtcp", { NULL }, 2812, "tcp" },
+ { "atmtcp", { NULL }, 2812, "udp" },
+ { "llm-pass", { NULL }, 2813, "tcp" },
+ { "llm-pass", { NULL }, 2813, "udp" },
+ { "llm-csv", { NULL }, 2814, "tcp" },
+ { "llm-csv", { NULL }, 2814, "udp" },
+ { "lbc-measure", { NULL }, 2815, "tcp" },
+ { "lbc-measure", { NULL }, 2815, "udp" },
+ { "lbc-watchdog", { NULL }, 2816, "tcp" },
+ { "lbc-watchdog", { NULL }, 2816, "udp" },
+ { "nmsigport", { NULL }, 2817, "tcp" },
+ { "nmsigport", { NULL }, 2817, "udp" },
+ { "rmlnk", { NULL }, 2818, "tcp" },
+ { "rmlnk", { NULL }, 2818, "udp" },
+ { "fc-faultnotify", { NULL }, 2819, "tcp" },
+ { "fc-faultnotify", { NULL }, 2819, "udp" },
+ { "univision", { NULL }, 2820, "tcp" },
+ { "univision", { NULL }, 2820, "udp" },
+ { "vrts-at-port", { NULL }, 2821, "tcp" },
+ { "vrts-at-port", { NULL }, 2821, "udp" },
+ { "ka0wuc", { NULL }, 2822, "tcp" },
+ { "ka0wuc", { NULL }, 2822, "udp" },
+ { "cqg-netlan", { NULL }, 2823, "tcp" },
+ { "cqg-netlan", { NULL }, 2823, "udp" },
+ { "cqg-netlan-1", { NULL }, 2824, "tcp" },
+ { "cqg-netlan-1", { NULL }, 2824, "udp" },
+ { "slc-systemlog", { NULL }, 2826, "tcp" },
+ { "slc-systemlog", { NULL }, 2826, "udp" },
+ { "slc-ctrlrloops", { NULL }, 2827, "tcp" },
+ { "slc-ctrlrloops", { NULL }, 2827, "udp" },
+ { "itm-lm", { NULL }, 2828, "tcp" },
+ { "itm-lm", { NULL }, 2828, "udp" },
+ { "silkp1", { NULL }, 2829, "tcp" },
+ { "silkp1", { NULL }, 2829, "udp" },
+ { "silkp2", { NULL }, 2830, "tcp" },
+ { "silkp2", { NULL }, 2830, "udp" },
+ { "silkp3", { NULL }, 2831, "tcp" },
+ { "silkp3", { NULL }, 2831, "udp" },
+ { "silkp4", { NULL }, 2832, "tcp" },
+ { "silkp4", { NULL }, 2832, "udp" },
+ { "glishd", { NULL }, 2833, "tcp" },
+ { "glishd", { NULL }, 2833, "udp" },
+ { "evtp", { NULL }, 2834, "tcp" },
+ { "evtp", { NULL }, 2834, "udp" },
+ { "evtp-data", { NULL }, 2835, "tcp" },
+ { "evtp-data", { NULL }, 2835, "udp" },
+ { "catalyst", { NULL }, 2836, "tcp" },
+ { "catalyst", { NULL }, 2836, "udp" },
+ { "repliweb", { NULL }, 2837, "tcp" },
+ { "repliweb", { NULL }, 2837, "udp" },
+ { "starbot", { NULL }, 2838, "tcp" },
+ { "starbot", { NULL }, 2838, "udp" },
+ { "nmsigport", { NULL }, 2839, "tcp" },
+ { "nmsigport", { NULL }, 2839, "udp" },
+ { "l3-exprt", { NULL }, 2840, "tcp" },
+ { "l3-exprt", { NULL }, 2840, "udp" },
+ { "l3-ranger", { NULL }, 2841, "tcp" },
+ { "l3-ranger", { NULL }, 2841, "udp" },
+ { "l3-hawk", { NULL }, 2842, "tcp" },
+ { "l3-hawk", { NULL }, 2842, "udp" },
+ { "pdnet", { NULL }, 2843, "tcp" },
+ { "pdnet", { NULL }, 2843, "udp" },
+ { "bpcp-poll", { NULL }, 2844, "tcp" },
+ { "bpcp-poll", { NULL }, 2844, "udp" },
+ { "bpcp-trap", { NULL }, 2845, "tcp" },
+ { "bpcp-trap", { NULL }, 2845, "udp" },
+ { "aimpp-hello", { NULL }, 2846, "tcp" },
+ { "aimpp-hello", { NULL }, 2846, "udp" },
+ { "aimpp-port-req", { NULL }, 2847, "tcp" },
+ { "aimpp-port-req", { NULL }, 2847, "udp" },
+ { "amt-blc-port", { NULL }, 2848, "tcp" },
+ { "amt-blc-port", { NULL }, 2848, "udp" },
+ { "fxp", { NULL }, 2849, "tcp" },
+ { "fxp", { NULL }, 2849, "udp" },
+ { "metaconsole", { NULL }, 2850, "tcp" },
+ { "metaconsole", { NULL }, 2850, "udp" },
+ { "webemshttp", { NULL }, 2851, "tcp" },
+ { "webemshttp", { NULL }, 2851, "udp" },
+ { "bears-01", { NULL }, 2852, "tcp" },
+ { "bears-01", { NULL }, 2852, "udp" },
+ { "ispipes", { NULL }, 2853, "tcp" },
+ { "ispipes", { NULL }, 2853, "udp" },
+ { "infomover", { NULL }, 2854, "tcp" },
+ { "infomover", { NULL }, 2854, "udp" },
+ { "msrp", { NULL }, 2855, "tcp" },
+ { "msrp", { NULL }, 2855, "udp" },
+ { "cesdinv", { NULL }, 2856, "tcp" },
+ { "cesdinv", { NULL }, 2856, "udp" },
+ { "simctlp", { NULL }, 2857, "tcp" },
+ { "simctlp", { NULL }, 2857, "udp" },
+ { "ecnp", { NULL }, 2858, "tcp" },
+ { "ecnp", { NULL }, 2858, "udp" },
+ { "activememory", { NULL }, 2859, "tcp" },
+ { "activememory", { NULL }, 2859, "udp" },
+ { "dialpad-voice1", { NULL }, 2860, "tcp" },
+ { "dialpad-voice1", { NULL }, 2860, "udp" },
+ { "dialpad-voice2", { NULL }, 2861, "tcp" },
+ { "dialpad-voice2", { NULL }, 2861, "udp" },
+ { "ttg-protocol", { NULL }, 2862, "tcp" },
+ { "ttg-protocol", { NULL }, 2862, "udp" },
+ { "sonardata", { NULL }, 2863, "tcp" },
+ { "sonardata", { NULL }, 2863, "udp" },
+ { "astromed-main", { NULL }, 2864, "tcp" },
+ { "astromed-main", { NULL }, 2864, "udp" },
+ { "pit-vpn", { NULL }, 2865, "tcp" },
+ { "pit-vpn", { NULL }, 2865, "udp" },
+ { "iwlistener", { NULL }, 2866, "tcp" },
+ { "iwlistener", { NULL }, 2866, "udp" },
+ { "esps-portal", { NULL }, 2867, "tcp" },
+ { "esps-portal", { NULL }, 2867, "udp" },
+ { "npep-messaging", { NULL }, 2868, "tcp" },
+ { "npep-messaging", { NULL }, 2868, "udp" },
+ { "icslap", { NULL }, 2869, "tcp" },
+ { "icslap", { NULL }, 2869, "udp" },
+ { "daishi", { NULL }, 2870, "tcp" },
+ { "daishi", { NULL }, 2870, "udp" },
+ { "msi-selectplay", { NULL }, 2871, "tcp" },
+ { "msi-selectplay", { NULL }, 2871, "udp" },
+ { "radix", { NULL }, 2872, "tcp" },
+ { "radix", { NULL }, 2872, "udp" },
+ { "dxmessagebase1", { NULL }, 2874, "tcp" },
+ { "dxmessagebase1", { NULL }, 2874, "udp" },
+ { "dxmessagebase2", { NULL }, 2875, "tcp" },
+ { "dxmessagebase2", { NULL }, 2875, "udp" },
+ { "sps-tunnel", { NULL }, 2876, "tcp" },
+ { "sps-tunnel", { NULL }, 2876, "udp" },
+ { "bluelance", { NULL }, 2877, "tcp" },
+ { "bluelance", { NULL }, 2877, "udp" },
+ { "aap", { NULL }, 2878, "tcp" },
+ { "aap", { NULL }, 2878, "udp" },
+ { "ucentric-ds", { NULL }, 2879, "tcp" },
+ { "ucentric-ds", { NULL }, 2879, "udp" },
+ { "synapse", { NULL }, 2880, "tcp" },
+ { "synapse", { NULL }, 2880, "udp" },
+ { "ndsp", { NULL }, 2881, "tcp" },
+ { "ndsp", { NULL }, 2881, "udp" },
+ { "ndtp", { NULL }, 2882, "tcp" },
+ { "ndtp", { NULL }, 2882, "udp" },
+ { "ndnp", { NULL }, 2883, "tcp" },
+ { "ndnp", { NULL }, 2883, "udp" },
+ { "flashmsg", { NULL }, 2884, "tcp" },
+ { "flashmsg", { NULL }, 2884, "udp" },
+ { "topflow", { NULL }, 2885, "tcp" },
+ { "topflow", { NULL }, 2885, "udp" },
+ { "responselogic", { NULL }, 2886, "tcp" },
+ { "responselogic", { NULL }, 2886, "udp" },
+ { "aironetddp", { NULL }, 2887, "tcp" },
+ { "aironetddp", { NULL }, 2887, "udp" },
+ { "spcsdlobby", { NULL }, 2888, "tcp" },
+ { "spcsdlobby", { NULL }, 2888, "udp" },
+ { "rsom", { NULL }, 2889, "tcp" },
+ { "rsom", { NULL }, 2889, "udp" },
+ { "cspclmulti", { NULL }, 2890, "tcp" },
+ { "cspclmulti", { NULL }, 2890, "udp" },
+ { "cinegrfx-elmd", { NULL }, 2891, "tcp" },
+ { "cinegrfx-elmd", { NULL }, 2891, "udp" },
+ { "snifferdata", { NULL }, 2892, "tcp" },
+ { "snifferdata", { NULL }, 2892, "udp" },
+ { "vseconnector", { NULL }, 2893, "tcp" },
+ { "vseconnector", { NULL }, 2893, "udp" },
+ { "abacus-remote", { NULL }, 2894, "tcp" },
+ { "abacus-remote", { NULL }, 2894, "udp" },
+ { "natuslink", { NULL }, 2895, "tcp" },
+ { "natuslink", { NULL }, 2895, "udp" },
+ { "ecovisiong6-1", { NULL }, 2896, "tcp" },
+ { "ecovisiong6-1", { NULL }, 2896, "udp" },
+ { "citrix-rtmp", { NULL }, 2897, "tcp" },
+ { "citrix-rtmp", { NULL }, 2897, "udp" },
+ { "appliance-cfg", { NULL }, 2898, "tcp" },
+ { "appliance-cfg", { NULL }, 2898, "udp" },
+ { "powergemplus", { NULL }, 2899, "tcp" },
+ { "powergemplus", { NULL }, 2899, "udp" },
+ { "quicksuite", { NULL }, 2900, "tcp" },
+ { "quicksuite", { NULL }, 2900, "udp" },
+ { "allstorcns", { NULL }, 2901, "tcp" },
+ { "allstorcns", { NULL }, 2901, "udp" },
+ { "netaspi", { NULL }, 2902, "tcp" },
+ { "netaspi", { NULL }, 2902, "udp" },
+ { "suitcase", { NULL }, 2903, "tcp" },
+ { "suitcase", { NULL }, 2903, "udp" },
+ { "m2ua", { NULL }, 2904, "tcp" },
+ { "m2ua", { NULL }, 2904, "udp" },
+ { "m2ua", { NULL }, 2904, "sctp"},
+ { "m3ua", { NULL }, 2905, "tcp" },
+ { "m3ua", { NULL }, 2905, "sctp"},
+ { "caller9", { NULL }, 2906, "tcp" },
+ { "caller9", { NULL }, 2906, "udp" },
+ { "webmethods-b2b", { NULL }, 2907, "tcp" },
+ { "webmethods-b2b", { NULL }, 2907, "udp" },
+ { "mao", { NULL }, 2908, "tcp" },
+ { "mao", { NULL }, 2908, "udp" },
+ { "funk-dialout", { NULL }, 2909, "tcp" },
+ { "funk-dialout", { NULL }, 2909, "udp" },
+ { "tdaccess", { NULL }, 2910, "tcp" },
+ { "tdaccess", { NULL }, 2910, "udp" },
+ { "blockade", { NULL }, 2911, "tcp" },
+ { "blockade", { NULL }, 2911, "udp" },
+ { "epicon", { NULL }, 2912, "tcp" },
+ { "epicon", { NULL }, 2912, "udp" },
+ { "boosterware", { NULL }, 2913, "tcp" },
+ { "boosterware", { NULL }, 2913, "udp" },
+ { "gamelobby", { NULL }, 2914, "tcp" },
+ { "gamelobby", { NULL }, 2914, "udp" },
+ { "tksocket", { NULL }, 2915, "tcp" },
+ { "tksocket", { NULL }, 2915, "udp" },
+ { "elvin_server", { NULL }, 2916, "tcp" },
+ { "elvin_server", { NULL }, 2916, "udp" },
+ { "elvin_client", { NULL }, 2917, "tcp" },
+ { "elvin_client", { NULL }, 2917, "udp" },
+ { "kastenchasepad", { NULL }, 2918, "tcp" },
+ { "kastenchasepad", { NULL }, 2918, "udp" },
+ { "roboer", { NULL }, 2919, "tcp" },
+ { "roboer", { NULL }, 2919, "udp" },
+ { "roboeda", { NULL }, 2920, "tcp" },
+ { "roboeda", { NULL }, 2920, "udp" },
+ { "cesdcdman", { NULL }, 2921, "tcp" },
+ { "cesdcdman", { NULL }, 2921, "udp" },
+ { "cesdcdtrn", { NULL }, 2922, "tcp" },
+ { "cesdcdtrn", { NULL }, 2922, "udp" },
+ { "wta-wsp-wtp-s", { NULL }, 2923, "tcp" },
+ { "wta-wsp-wtp-s", { NULL }, 2923, "udp" },
+ { "precise-vip", { NULL }, 2924, "tcp" },
+ { "precise-vip", { NULL }, 2924, "udp" },
+ { "mobile-file-dl", { NULL }, 2926, "tcp" },
+ { "mobile-file-dl", { NULL }, 2926, "udp" },
+ { "unimobilectrl", { NULL }, 2927, "tcp" },
+ { "unimobilectrl", { NULL }, 2927, "udp" },
+ { "redstone-cpss", { NULL }, 2928, "tcp" },
+ { "redstone-cpss", { NULL }, 2928, "udp" },
+ { "amx-webadmin", { NULL }, 2929, "tcp" },
+ { "amx-webadmin", { NULL }, 2929, "udp" },
+ { "amx-weblinx", { NULL }, 2930, "tcp" },
+ { "amx-weblinx", { NULL }, 2930, "udp" },
+ { "circle-x", { NULL }, 2931, "tcp" },
+ { "circle-x", { NULL }, 2931, "udp" },
+ { "incp", { NULL }, 2932, "tcp" },
+ { "incp", { NULL }, 2932, "udp" },
+ { "4-tieropmgw", { NULL }, 2933, "tcp" },
+ { "4-tieropmgw", { NULL }, 2933, "udp" },
+ { "4-tieropmcli", { NULL }, 2934, "tcp" },
+ { "4-tieropmcli", { NULL }, 2934, "udp" },
+ { "qtp", { NULL }, 2935, "tcp" },
+ { "qtp", { NULL }, 2935, "udp" },
+ { "otpatch", { NULL }, 2936, "tcp" },
+ { "otpatch", { NULL }, 2936, "udp" },
+ { "pnaconsult-lm", { NULL }, 2937, "tcp" },
+ { "pnaconsult-lm", { NULL }, 2937, "udp" },
+ { "sm-pas-1", { NULL }, 2938, "tcp" },
+ { "sm-pas-1", { NULL }, 2938, "udp" },
+ { "sm-pas-2", { NULL }, 2939, "tcp" },
+ { "sm-pas-2", { NULL }, 2939, "udp" },
+ { "sm-pas-3", { NULL }, 2940, "tcp" },
+ { "sm-pas-3", { NULL }, 2940, "udp" },
+ { "sm-pas-4", { NULL }, 2941, "tcp" },
+ { "sm-pas-4", { NULL }, 2941, "udp" },
+ { "sm-pas-5", { NULL }, 2942, "tcp" },
+ { "sm-pas-5", { NULL }, 2942, "udp" },
+ { "ttnrepository", { NULL }, 2943, "tcp" },
+ { "ttnrepository", { NULL }, 2943, "udp" },
+ { "megaco-h248", { NULL }, 2944, "tcp" },
+ { "megaco-h248", { NULL }, 2944, "udp" },
+ { "megaco-h248", { NULL }, 2944, "sctp"},
+ { "h248-binary", { NULL }, 2945, "tcp" },
+ { "h248-binary", { NULL }, 2945, "udp" },
+ { "h248-binary", { NULL }, 2945, "sctp"},
+ { "fjsvmpor", { NULL }, 2946, "tcp" },
+ { "fjsvmpor", { NULL }, 2946, "udp" },
+ { "gpsd", { NULL }, 2947, "tcp" },
+ { "gpsd", { NULL }, 2947, "udp" },
+ { "wap-push", { NULL }, 2948, "tcp" },
+ { "wap-push", { NULL }, 2948, "udp" },
+ { "wap-pushsecure", { NULL }, 2949, "tcp" },
+ { "wap-pushsecure", { NULL }, 2949, "udp" },
+ { "esip", { NULL }, 2950, "tcp" },
+ { "esip", { NULL }, 2950, "udp" },
+ { "ottp", { NULL }, 2951, "tcp" },
+ { "ottp", { NULL }, 2951, "udp" },
+ { "mpfwsas", { NULL }, 2952, "tcp" },
+ { "mpfwsas", { NULL }, 2952, "udp" },
+ { "ovalarmsrv", { NULL }, 2953, "tcp" },
+ { "ovalarmsrv", { NULL }, 2953, "udp" },
+ { "ovalarmsrv-cmd", { NULL }, 2954, "tcp" },
+ { "ovalarmsrv-cmd", { NULL }, 2954, "udp" },
+ { "csnotify", { NULL }, 2955, "tcp" },
+ { "csnotify", { NULL }, 2955, "udp" },
+ { "ovrimosdbman", { NULL }, 2956, "tcp" },
+ { "ovrimosdbman", { NULL }, 2956, "udp" },
+ { "jmact5", { NULL }, 2957, "tcp" },
+ { "jmact5", { NULL }, 2957, "udp" },
+ { "jmact6", { NULL }, 2958, "tcp" },
+ { "jmact6", { NULL }, 2958, "udp" },
+ { "rmopagt", { NULL }, 2959, "tcp" },
+ { "rmopagt", { NULL }, 2959, "udp" },
+ { "dfoxserver", { NULL }, 2960, "tcp" },
+ { "dfoxserver", { NULL }, 2960, "udp" },
+ { "boldsoft-lm", { NULL }, 2961, "tcp" },
+ { "boldsoft-lm", { NULL }, 2961, "udp" },
+ { "iph-policy-cli", { NULL }, 2962, "tcp" },
+ { "iph-policy-cli", { NULL }, 2962, "udp" },
+ { "iph-policy-adm", { NULL }, 2963, "tcp" },
+ { "iph-policy-adm", { NULL }, 2963, "udp" },
+ { "bullant-srap", { NULL }, 2964, "tcp" },
+ { "bullant-srap", { NULL }, 2964, "udp" },
+ { "bullant-rap", { NULL }, 2965, "tcp" },
+ { "bullant-rap", { NULL }, 2965, "udp" },
+ { "idp-infotrieve", { NULL }, 2966, "tcp" },
+ { "idp-infotrieve", { NULL }, 2966, "udp" },
+ { "ssc-agent", { NULL }, 2967, "tcp" },
+ { "ssc-agent", { NULL }, 2967, "udp" },
+ { "enpp", { NULL }, 2968, "tcp" },
+ { "enpp", { NULL }, 2968, "udp" },
+ { "essp", { NULL }, 2969, "tcp" },
+ { "essp", { NULL }, 2969, "udp" },
+ { "index-net", { NULL }, 2970, "tcp" },
+ { "index-net", { NULL }, 2970, "udp" },
+ { "netclip", { NULL }, 2971, "tcp" },
+ { "netclip", { NULL }, 2971, "udp" },
+ { "pmsm-webrctl", { NULL }, 2972, "tcp" },
+ { "pmsm-webrctl", { NULL }, 2972, "udp" },
+ { "svnetworks", { NULL }, 2973, "tcp" },
+ { "svnetworks", { NULL }, 2973, "udp" },
+ { "signal", { NULL }, 2974, "tcp" },
+ { "signal", { NULL }, 2974, "udp" },
+ { "fjmpcm", { NULL }, 2975, "tcp" },
+ { "fjmpcm", { NULL }, 2975, "udp" },
+ { "cns-srv-port", { NULL }, 2976, "tcp" },
+ { "cns-srv-port", { NULL }, 2976, "udp" },
+ { "ttc-etap-ns", { NULL }, 2977, "tcp" },
+ { "ttc-etap-ns", { NULL }, 2977, "udp" },
+ { "ttc-etap-ds", { NULL }, 2978, "tcp" },
+ { "ttc-etap-ds", { NULL }, 2978, "udp" },
+ { "h263-video", { NULL }, 2979, "tcp" },
+ { "h263-video", { NULL }, 2979, "udp" },
+ { "wimd", { NULL }, 2980, "tcp" },
+ { "wimd", { NULL }, 2980, "udp" },
+ { "mylxamport", { NULL }, 2981, "tcp" },
+ { "mylxamport", { NULL }, 2981, "udp" },
+ { "iwb-whiteboard", { NULL }, 2982, "tcp" },
+ { "iwb-whiteboard", { NULL }, 2982, "udp" },
+ { "netplan", { NULL }, 2983, "tcp" },
+ { "netplan", { NULL }, 2983, "udp" },
+ { "hpidsadmin", { NULL }, 2984, "tcp" },
+ { "hpidsadmin", { NULL }, 2984, "udp" },
+ { "hpidsagent", { NULL }, 2985, "tcp" },
+ { "hpidsagent", { NULL }, 2985, "udp" },
+ { "stonefalls", { NULL }, 2986, "tcp" },
+ { "stonefalls", { NULL }, 2986, "udp" },
+ { "identify", { NULL }, 2987, "tcp" },
+ { "identify", { NULL }, 2987, "udp" },
+ { "hippad", { NULL }, 2988, "tcp" },
+ { "hippad", { NULL }, 2988, "udp" },
+ { "zarkov", { NULL }, 2989, "tcp" },
+ { "zarkov", { NULL }, 2989, "udp" },
+ { "boscap", { NULL }, 2990, "tcp" },
+ { "boscap", { NULL }, 2990, "udp" },
+ { "wkstn-mon", { NULL }, 2991, "tcp" },
+ { "wkstn-mon", { NULL }, 2991, "udp" },
+ { "avenyo", { NULL }, 2992, "tcp" },
+ { "avenyo", { NULL }, 2992, "udp" },
+ { "veritas-vis1", { NULL }, 2993, "tcp" },
+ { "veritas-vis1", { NULL }, 2993, "udp" },
+ { "veritas-vis2", { NULL }, 2994, "tcp" },
+ { "veritas-vis2", { NULL }, 2994, "udp" },
+ { "idrs", { NULL }, 2995, "tcp" },
+ { "idrs", { NULL }, 2995, "udp" },
+ { "vsixml", { NULL }, 2996, "tcp" },
+ { "vsixml", { NULL }, 2996, "udp" },
+ { "rebol", { NULL }, 2997, "tcp" },
+ { "rebol", { NULL }, 2997, "udp" },
+ { "realsecure", { NULL }, 2998, "tcp" },
+ { "realsecure", { NULL }, 2998, "udp" },
+ { "remoteware-un", { NULL }, 2999, "tcp" },
+ { "remoteware-un", { NULL }, 2999, "udp" },
+ { "hbci", { NULL }, 3000, "tcp" },
+ { "hbci", { NULL }, 3000, "udp" },
+ { "remoteware-cl", { NULL }, 3000, "tcp" },
+ { "remoteware-cl", { NULL }, 3000, "udp" },
+ { "exlm-agent", { NULL }, 3002, "tcp" },
+ { "exlm-agent", { NULL }, 3002, "udp" },
+ { "remoteware-srv", { NULL }, 3002, "tcp" },
+ { "remoteware-srv", { NULL }, 3002, "udp" },
+ { "cgms", { NULL }, 3003, "tcp" },
+ { "cgms", { NULL }, 3003, "udp" },
+ { "csoftragent", { NULL }, 3004, "tcp" },
+ { "csoftragent", { NULL }, 3004, "udp" },
+ { "geniuslm", { NULL }, 3005, "tcp" },
+ { "geniuslm", { NULL }, 3005, "udp" },
+ { "ii-admin", { NULL }, 3006, "tcp" },
+ { "ii-admin", { NULL }, 3006, "udp" },
+ { "lotusmtap", { NULL }, 3007, "tcp" },
+ { "lotusmtap", { NULL }, 3007, "udp" },
+ { "midnight-tech", { NULL }, 3008, "tcp" },
+ { "midnight-tech", { NULL }, 3008, "udp" },
+ { "pxc-ntfy", { NULL }, 3009, "tcp" },
+ { "pxc-ntfy", { NULL }, 3009, "udp" },
+ { "gw", { NULL }, 3010, "tcp" },
+ { "ping-pong", { NULL }, 3010, "udp" },
+ { "trusted-web", { NULL }, 3011, "tcp" },
+ { "trusted-web", { NULL }, 3011, "udp" },
+ { "twsdss", { NULL }, 3012, "tcp" },
+ { "twsdss", { NULL }, 3012, "udp" },
+ { "gilatskysurfer", { NULL }, 3013, "tcp" },
+ { "gilatskysurfer", { NULL }, 3013, "udp" },
+ { "broker_service", { NULL }, 3014, "tcp" },
+ { "broker_service", { NULL }, 3014, "udp" },
+ { "nati-dstp", { NULL }, 3015, "tcp" },
+ { "nati-dstp", { NULL }, 3015, "udp" },
+ { "notify_srvr", { NULL }, 3016, "tcp" },
+ { "notify_srvr", { NULL }, 3016, "udp" },
+ { "event_listener", { NULL }, 3017, "tcp" },
+ { "event_listener", { NULL }, 3017, "udp" },
+ { "srvc_registry", { NULL }, 3018, "tcp" },
+ { "srvc_registry", { NULL }, 3018, "udp" },
+ { "resource_mgr", { NULL }, 3019, "tcp" },
+ { "resource_mgr", { NULL }, 3019, "udp" },
+ { "cifs", { NULL }, 3020, "tcp" },
+ { "cifs", { NULL }, 3020, "udp" },
+ { "agriserver", { NULL }, 3021, "tcp" },
+ { "agriserver", { NULL }, 3021, "udp" },
+ { "csregagent", { NULL }, 3022, "tcp" },
+ { "csregagent", { NULL }, 3022, "udp" },
+ { "magicnotes", { NULL }, 3023, "tcp" },
+ { "magicnotes", { NULL }, 3023, "udp" },
+ { "nds_sso", { NULL }, 3024, "tcp" },
+ { "nds_sso", { NULL }, 3024, "udp" },
+ { "arepa-raft", { NULL }, 3025, "tcp" },
+ { "arepa-raft", { NULL }, 3025, "udp" },
+ { "agri-gateway", { NULL }, 3026, "tcp" },
+ { "agri-gateway", { NULL }, 3026, "udp" },
+ { "LiebDevMgmt_C", { NULL }, 3027, "tcp" },
+ { "LiebDevMgmt_C", { NULL }, 3027, "udp" },
+ { "LiebDevMgmt_DM", { NULL }, 3028, "tcp" },
+ { "LiebDevMgmt_DM", { NULL }, 3028, "udp" },
+ { "LiebDevMgmt_A", { NULL }, 3029, "tcp" },
+ { "LiebDevMgmt_A", { NULL }, 3029, "udp" },
+ { "arepa-cas", { NULL }, 3030, "tcp" },
+ { "arepa-cas", { NULL }, 3030, "udp" },
+ { "eppc", { NULL }, 3031, "tcp" },
+ { "eppc", { NULL }, 3031, "udp" },
+ { "redwood-chat", { NULL }, 3032, "tcp" },
+ { "redwood-chat", { NULL }, 3032, "udp" },
+ { "pdb", { NULL }, 3033, "tcp" },
+ { "pdb", { NULL }, 3033, "udp" },
+ { "osmosis-aeea", { NULL }, 3034, "tcp" },
+ { "osmosis-aeea", { NULL }, 3034, "udp" },
+ { "fjsv-gssagt", { NULL }, 3035, "tcp" },
+ { "fjsv-gssagt", { NULL }, 3035, "udp" },
+ { "hagel-dump", { NULL }, 3036, "tcp" },
+ { "hagel-dump", { NULL }, 3036, "udp" },
+ { "hp-san-mgmt", { NULL }, 3037, "tcp" },
+ { "hp-san-mgmt", { NULL }, 3037, "udp" },
+ { "santak-ups", { NULL }, 3038, "tcp" },
+ { "santak-ups", { NULL }, 3038, "udp" },
+ { "cogitate", { NULL }, 3039, "tcp" },
+ { "cogitate", { NULL }, 3039, "udp" },
+ { "tomato-springs", { NULL }, 3040, "tcp" },
+ { "tomato-springs", { NULL }, 3040, "udp" },
+ { "di-traceware", { NULL }, 3041, "tcp" },
+ { "di-traceware", { NULL }, 3041, "udp" },
+ { "journee", { NULL }, 3042, "tcp" },
+ { "journee", { NULL }, 3042, "udp" },
+ { "brp", { NULL }, 3043, "tcp" },
+ { "brp", { NULL }, 3043, "udp" },
+ { "epp", { NULL }, 3044, "tcp" },
+ { "epp", { NULL }, 3044, "udp" },
+ { "responsenet", { NULL }, 3045, "tcp" },
+ { "responsenet", { NULL }, 3045, "udp" },
+ { "di-ase", { NULL }, 3046, "tcp" },
+ { "di-ase", { NULL }, 3046, "udp" },
+ { "hlserver", { NULL }, 3047, "tcp" },
+ { "hlserver", { NULL }, 3047, "udp" },
+ { "pctrader", { NULL }, 3048, "tcp" },
+ { "pctrader", { NULL }, 3048, "udp" },
+ { "nsws", { NULL }, 3049, "tcp" },
+ { "nsws", { NULL }, 3049, "udp" },
+ { "gds_db", { NULL }, 3050, "tcp" },
+ { "gds_db", { NULL }, 3050, "udp" },
+ { "galaxy-server", { NULL }, 3051, "tcp" },
+ { "galaxy-server", { NULL }, 3051, "udp" },
+ { "apc-3052", { NULL }, 3052, "tcp" },
+ { "apc-3052", { NULL }, 3052, "udp" },
+ { "dsom-server", { NULL }, 3053, "tcp" },
+ { "dsom-server", { NULL }, 3053, "udp" },
+ { "amt-cnf-prot", { NULL }, 3054, "tcp" },
+ { "amt-cnf-prot", { NULL }, 3054, "udp" },
+ { "policyserver", { NULL }, 3055, "tcp" },
+ { "policyserver", { NULL }, 3055, "udp" },
+ { "cdl-server", { NULL }, 3056, "tcp" },
+ { "cdl-server", { NULL }, 3056, "udp" },
+ { "goahead-fldup", { NULL }, 3057, "tcp" },
+ { "goahead-fldup", { NULL }, 3057, "udp" },
+ { "videobeans", { NULL }, 3058, "tcp" },
+ { "videobeans", { NULL }, 3058, "udp" },
+ { "qsoft", { NULL }, 3059, "tcp" },
+ { "qsoft", { NULL }, 3059, "udp" },
+ { "interserver", { NULL }, 3060, "tcp" },
+ { "interserver", { NULL }, 3060, "udp" },
+ { "cautcpd", { NULL }, 3061, "tcp" },
+ { "cautcpd", { NULL }, 3061, "udp" },
+ { "ncacn-ip-tcp", { NULL }, 3062, "tcp" },
+ { "ncacn-ip-tcp", { NULL }, 3062, "udp" },
+ { "ncadg-ip-udp", { NULL }, 3063, "tcp" },
+ { "ncadg-ip-udp", { NULL }, 3063, "udp" },
+ { "rprt", { NULL }, 3064, "tcp" },
+ { "rprt", { NULL }, 3064, "udp" },
+ { "slinterbase", { NULL }, 3065, "tcp" },
+ { "slinterbase", { NULL }, 3065, "udp" },
+ { "netattachsdmp", { NULL }, 3066, "tcp" },
+ { "netattachsdmp", { NULL }, 3066, "udp" },
+ { "fjhpjp", { NULL }, 3067, "tcp" },
+ { "fjhpjp", { NULL }, 3067, "udp" },
+ { "ls3bcast", { NULL }, 3068, "tcp" },
+ { "ls3bcast", { NULL }, 3068, "udp" },
+ { "ls3", { NULL }, 3069, "tcp" },
+ { "ls3", { NULL }, 3069, "udp" },
+ { "mgxswitch", { NULL }, 3070, "tcp" },
+ { "mgxswitch", { NULL }, 3070, "udp" },
+ { "csd-mgmt-port", { NULL }, 3071, "tcp" },
+ { "csd-mgmt-port", { NULL }, 3071, "udp" },
+ { "csd-monitor", { NULL }, 3072, "tcp" },
+ { "csd-monitor", { NULL }, 3072, "udp" },
+ { "vcrp", { NULL }, 3073, "tcp" },
+ { "vcrp", { NULL }, 3073, "udp" },
+ { "xbox", { NULL }, 3074, "tcp" },
+ { "xbox", { NULL }, 3074, "udp" },
+ { "orbix-locator", { NULL }, 3075, "tcp" },
+ { "orbix-locator", { NULL }, 3075, "udp" },
+ { "orbix-config", { NULL }, 3076, "tcp" },
+ { "orbix-config", { NULL }, 3076, "udp" },
+ { "orbix-loc-ssl", { NULL }, 3077, "tcp" },
+ { "orbix-loc-ssl", { NULL }, 3077, "udp" },
+ { "orbix-cfg-ssl", { NULL }, 3078, "tcp" },
+ { "orbix-cfg-ssl", { NULL }, 3078, "udp" },
+ { "lv-frontpanel", { NULL }, 3079, "tcp" },
+ { "lv-frontpanel", { NULL }, 3079, "udp" },
+ { "stm_pproc", { NULL }, 3080, "tcp" },
+ { "stm_pproc", { NULL }, 3080, "udp" },
+ { "tl1-lv", { NULL }, 3081, "tcp" },
+ { "tl1-lv", { NULL }, 3081, "udp" },
+ { "tl1-raw", { NULL }, 3082, "tcp" },
+ { "tl1-raw", { NULL }, 3082, "udp" },
+ { "tl1-telnet", { NULL }, 3083, "tcp" },
+ { "tl1-telnet", { NULL }, 3083, "udp" },
+ { "itm-mccs", { NULL }, 3084, "tcp" },
+ { "itm-mccs", { NULL }, 3084, "udp" },
+ { "pcihreq", { NULL }, 3085, "tcp" },
+ { "pcihreq", { NULL }, 3085, "udp" },
+ { "jdl-dbkitchen", { NULL }, 3086, "tcp" },
+ { "jdl-dbkitchen", { NULL }, 3086, "udp" },
+ { "asoki-sma", { NULL }, 3087, "tcp" },
+ { "asoki-sma", { NULL }, 3087, "udp" },
+ { "xdtp", { NULL }, 3088, "tcp" },
+ { "xdtp", { NULL }, 3088, "udp" },
+ { "ptk-alink", { NULL }, 3089, "tcp" },
+ { "ptk-alink", { NULL }, 3089, "udp" },
+ { "stss", { NULL }, 3090, "tcp" },
+ { "stss", { NULL }, 3090, "udp" },
+ { "1ci-smcs", { NULL }, 3091, "tcp" },
+ { "1ci-smcs", { NULL }, 3091, "udp" },
+ { "rapidmq-center", { NULL }, 3093, "tcp" },
+ { "rapidmq-center", { NULL }, 3093, "udp" },
+ { "rapidmq-reg", { NULL }, 3094, "tcp" },
+ { "rapidmq-reg", { NULL }, 3094, "udp" },
+ { "panasas", { NULL }, 3095, "tcp" },
+ { "panasas", { NULL }, 3095, "udp" },
+ { "ndl-aps", { NULL }, 3096, "tcp" },
+ { "ndl-aps", { NULL }, 3096, "udp" },
+ { "itu-bicc-stc", { NULL }, 3097, "sctp"},
+ { "umm-port", { NULL }, 3098, "tcp" },
+ { "umm-port", { NULL }, 3098, "udp" },
+ { "chmd", { NULL }, 3099, "tcp" },
+ { "chmd", { NULL }, 3099, "udp" },
+ { "opcon-xps", { NULL }, 3100, "tcp" },
+ { "opcon-xps", { NULL }, 3100, "udp" },
+ { "hp-pxpib", { NULL }, 3101, "tcp" },
+ { "hp-pxpib", { NULL }, 3101, "udp" },
+ { "slslavemon", { NULL }, 3102, "tcp" },
+ { "slslavemon", { NULL }, 3102, "udp" },
+ { "autocuesmi", { NULL }, 3103, "tcp" },
+ { "autocuesmi", { NULL }, 3103, "udp" },
+ { "autocuelog", { NULL }, 3104, "tcp" },
+ { "autocuetime", { NULL }, 3104, "udp" },
+ { "cardbox", { NULL }, 3105, "tcp" },
+ { "cardbox", { NULL }, 3105, "udp" },
+ { "cardbox-http", { NULL }, 3106, "tcp" },
+ { "cardbox-http", { NULL }, 3106, "udp" },
+ { "business", { NULL }, 3107, "tcp" },
+ { "business", { NULL }, 3107, "udp" },
+ { "geolocate", { NULL }, 3108, "tcp" },
+ { "geolocate", { NULL }, 3108, "udp" },
+ { "personnel", { NULL }, 3109, "tcp" },
+ { "personnel", { NULL }, 3109, "udp" },
+ { "sim-control", { NULL }, 3110, "tcp" },
+ { "sim-control", { NULL }, 3110, "udp" },
+ { "wsynch", { NULL }, 3111, "tcp" },
+ { "wsynch", { NULL }, 3111, "udp" },
+ { "ksysguard", { NULL }, 3112, "tcp" },
+ { "ksysguard", { NULL }, 3112, "udp" },
+ { "cs-auth-svr", { NULL }, 3113, "tcp" },
+ { "cs-auth-svr", { NULL }, 3113, "udp" },
+ { "ccmad", { NULL }, 3114, "tcp" },
+ { "ccmad", { NULL }, 3114, "udp" },
+ { "mctet-master", { NULL }, 3115, "tcp" },
+ { "mctet-master", { NULL }, 3115, "udp" },
+ { "mctet-gateway", { NULL }, 3116, "tcp" },
+ { "mctet-gateway", { NULL }, 3116, "udp" },
+ { "mctet-jserv", { NULL }, 3117, "tcp" },
+ { "mctet-jserv", { NULL }, 3117, "udp" },
+ { "pkagent", { NULL }, 3118, "tcp" },
+ { "pkagent", { NULL }, 3118, "udp" },
+ { "d2000kernel", { NULL }, 3119, "tcp" },
+ { "d2000kernel", { NULL }, 3119, "udp" },
+ { "d2000webserver", { NULL }, 3120, "tcp" },
+ { "d2000webserver", { NULL }, 3120, "udp" },
+ { "vtr-emulator", { NULL }, 3122, "tcp" },
+ { "vtr-emulator", { NULL }, 3122, "udp" },
+ { "edix", { NULL }, 3123, "tcp" },
+ { "edix", { NULL }, 3123, "udp" },
+ { "beacon-port", { NULL }, 3124, "tcp" },
+ { "beacon-port", { NULL }, 3124, "udp" },
+ { "a13-an", { NULL }, 3125, "tcp" },
+ { "a13-an", { NULL }, 3125, "udp" },
+ { "ctx-bridge", { NULL }, 3127, "tcp" },
+ { "ctx-bridge", { NULL }, 3127, "udp" },
+ { "ndl-aas", { NULL }, 3128, "tcp" },
+ { "ndl-aas", { NULL }, 3128, "udp" },
+ { "netport-id", { NULL }, 3129, "tcp" },
+ { "netport-id", { NULL }, 3129, "udp" },
+ { "icpv2", { NULL }, 3130, "tcp" },
+ { "icpv2", { NULL }, 3130, "udp" },
+ { "netbookmark", { NULL }, 3131, "tcp" },
+ { "netbookmark", { NULL }, 3131, "udp" },
+ { "ms-rule-engine", { NULL }, 3132, "tcp" },
+ { "ms-rule-engine", { NULL }, 3132, "udp" },
+ { "prism-deploy", { NULL }, 3133, "tcp" },
+ { "prism-deploy", { NULL }, 3133, "udp" },
+ { "ecp", { NULL }, 3134, "tcp" },
+ { "ecp", { NULL }, 3134, "udp" },
+ { "peerbook-port", { NULL }, 3135, "tcp" },
+ { "peerbook-port", { NULL }, 3135, "udp" },
+ { "grubd", { NULL }, 3136, "tcp" },
+ { "grubd", { NULL }, 3136, "udp" },
+ { "rtnt-1", { NULL }, 3137, "tcp" },
+ { "rtnt-1", { NULL }, 3137, "udp" },
+ { "rtnt-2", { NULL }, 3138, "tcp" },
+ { "rtnt-2", { NULL }, 3138, "udp" },
+ { "incognitorv", { NULL }, 3139, "tcp" },
+ { "incognitorv", { NULL }, 3139, "udp" },
+ { "ariliamulti", { NULL }, 3140, "tcp" },
+ { "ariliamulti", { NULL }, 3140, "udp" },
+ { "vmodem", { NULL }, 3141, "tcp" },
+ { "vmodem", { NULL }, 3141, "udp" },
+ { "rdc-wh-eos", { NULL }, 3142, "tcp" },
+ { "rdc-wh-eos", { NULL }, 3142, "udp" },
+ { "seaview", { NULL }, 3143, "tcp" },
+ { "seaview", { NULL }, 3143, "udp" },
+ { "tarantella", { NULL }, 3144, "tcp" },
+ { "tarantella", { NULL }, 3144, "udp" },
+ { "csi-lfap", { NULL }, 3145, "tcp" },
+ { "csi-lfap", { NULL }, 3145, "udp" },
+ { "bears-02", { NULL }, 3146, "tcp" },
+ { "bears-02", { NULL }, 3146, "udp" },
+ { "rfio", { NULL }, 3147, "tcp" },
+ { "rfio", { NULL }, 3147, "udp" },
+ { "nm-game-admin", { NULL }, 3148, "tcp" },
+ { "nm-game-admin", { NULL }, 3148, "udp" },
+ { "nm-game-server", { NULL }, 3149, "tcp" },
+ { "nm-game-server", { NULL }, 3149, "udp" },
+ { "nm-asses-admin", { NULL }, 3150, "tcp" },
+ { "nm-asses-admin", { NULL }, 3150, "udp" },
+ { "nm-assessor", { NULL }, 3151, "tcp" },
+ { "nm-assessor", { NULL }, 3151, "udp" },
+ { "feitianrockey", { NULL }, 3152, "tcp" },
+ { "feitianrockey", { NULL }, 3152, "udp" },
+ { "s8-client-port", { NULL }, 3153, "tcp" },
+ { "s8-client-port", { NULL }, 3153, "udp" },
+ { "ccmrmi", { NULL }, 3154, "tcp" },
+ { "ccmrmi", { NULL }, 3154, "udp" },
+ { "jpegmpeg", { NULL }, 3155, "tcp" },
+ { "jpegmpeg", { NULL }, 3155, "udp" },
+ { "indura", { NULL }, 3156, "tcp" },
+ { "indura", { NULL }, 3156, "udp" },
+ { "e3consultants", { NULL }, 3157, "tcp" },
+ { "e3consultants", { NULL }, 3157, "udp" },
+ { "stvp", { NULL }, 3158, "tcp" },
+ { "stvp", { NULL }, 3158, "udp" },
+ { "navegaweb-port", { NULL }, 3159, "tcp" },
+ { "navegaweb-port", { NULL }, 3159, "udp" },
+ { "tip-app-server", { NULL }, 3160, "tcp" },
+ { "tip-app-server", { NULL }, 3160, "udp" },
+ { "doc1lm", { NULL }, 3161, "tcp" },
+ { "doc1lm", { NULL }, 3161, "udp" },
+ { "sflm", { NULL }, 3162, "tcp" },
+ { "sflm", { NULL }, 3162, "udp" },
+ { "res-sap", { NULL }, 3163, "tcp" },
+ { "res-sap", { NULL }, 3163, "udp" },
+ { "imprs", { NULL }, 3164, "tcp" },
+ { "imprs", { NULL }, 3164, "udp" },
+ { "newgenpay", { NULL }, 3165, "tcp" },
+ { "newgenpay", { NULL }, 3165, "udp" },
+ { "sossecollector", { NULL }, 3166, "tcp" },
+ { "sossecollector", { NULL }, 3166, "udp" },
+ { "nowcontact", { NULL }, 3167, "tcp" },
+ { "nowcontact", { NULL }, 3167, "udp" },
+ { "poweronnud", { NULL }, 3168, "tcp" },
+ { "poweronnud", { NULL }, 3168, "udp" },
+ { "serverview-as", { NULL }, 3169, "tcp" },
+ { "serverview-as", { NULL }, 3169, "udp" },
+ { "serverview-asn", { NULL }, 3170, "tcp" },
+ { "serverview-asn", { NULL }, 3170, "udp" },
+ { "serverview-gf", { NULL }, 3171, "tcp" },
+ { "serverview-gf", { NULL }, 3171, "udp" },
+ { "serverview-rm", { NULL }, 3172, "tcp" },
+ { "serverview-rm", { NULL }, 3172, "udp" },
+ { "serverview-icc", { NULL }, 3173, "tcp" },
+ { "serverview-icc", { NULL }, 3173, "udp" },
+ { "armi-server", { NULL }, 3174, "tcp" },
+ { "armi-server", { NULL }, 3174, "udp" },
+ { "t1-e1-over-ip", { NULL }, 3175, "tcp" },
+ { "t1-e1-over-ip", { NULL }, 3175, "udp" },
+ { "ars-master", { NULL }, 3176, "tcp" },
+ { "ars-master", { NULL }, 3176, "udp" },
+ { "phonex-port", { NULL }, 3177, "tcp" },
+ { "phonex-port", { NULL }, 3177, "udp" },
+ { "radclientport", { NULL }, 3178, "tcp" },
+ { "radclientport", { NULL }, 3178, "udp" },
+ { "h2gf-w-2m", { NULL }, 3179, "tcp" },
+ { "h2gf-w-2m", { NULL }, 3179, "udp" },
+ { "mc-brk-srv", { NULL }, 3180, "tcp" },
+ { "mc-brk-srv", { NULL }, 3180, "udp" },
+ { "bmcpatrolagent", { NULL }, 3181, "tcp" },
+ { "bmcpatrolagent", { NULL }, 3181, "udp" },
+ { "bmcpatrolrnvu", { NULL }, 3182, "tcp" },
+ { "bmcpatrolrnvu", { NULL }, 3182, "udp" },
+ { "cops-tls", { NULL }, 3183, "tcp" },
+ { "cops-tls", { NULL }, 3183, "udp" },
+ { "apogeex-port", { NULL }, 3184, "tcp" },
+ { "apogeex-port", { NULL }, 3184, "udp" },
+ { "smpppd", { NULL }, 3185, "tcp" },
+ { "smpppd", { NULL }, 3185, "udp" },
+ { "iiw-port", { NULL }, 3186, "tcp" },
+ { "iiw-port", { NULL }, 3186, "udp" },
+ { "odi-port", { NULL }, 3187, "tcp" },
+ { "odi-port", { NULL }, 3187, "udp" },
+ { "brcm-comm-port", { NULL }, 3188, "tcp" },
+ { "brcm-comm-port", { NULL }, 3188, "udp" },
+ { "pcle-infex", { NULL }, 3189, "tcp" },
+ { "pcle-infex", { NULL }, 3189, "udp" },
+ { "csvr-proxy", { NULL }, 3190, "tcp" },
+ { "csvr-proxy", { NULL }, 3190, "udp" },
+ { "csvr-sslproxy", { NULL }, 3191, "tcp" },
+ { "csvr-sslproxy", { NULL }, 3191, "udp" },
+ { "firemonrcc", { NULL }, 3192, "tcp" },
+ { "firemonrcc", { NULL }, 3192, "udp" },
+ { "spandataport", { NULL }, 3193, "tcp" },
+ { "spandataport", { NULL }, 3193, "udp" },
+ { "magbind", { NULL }, 3194, "tcp" },
+ { "magbind", { NULL }, 3194, "udp" },
+ { "ncu-1", { NULL }, 3195, "tcp" },
+ { "ncu-1", { NULL }, 3195, "udp" },
+ { "ncu-2", { NULL }, 3196, "tcp" },
+ { "ncu-2", { NULL }, 3196, "udp" },
+ { "embrace-dp-s", { NULL }, 3197, "tcp" },
+ { "embrace-dp-s", { NULL }, 3197, "udp" },
+ { "embrace-dp-c", { NULL }, 3198, "tcp" },
+ { "embrace-dp-c", { NULL }, 3198, "udp" },
+ { "dmod-workspace", { NULL }, 3199, "tcp" },
+ { "dmod-workspace", { NULL }, 3199, "udp" },
+ { "tick-port", { NULL }, 3200, "tcp" },
+ { "tick-port", { NULL }, 3200, "udp" },
+ { "cpq-tasksmart", { NULL }, 3201, "tcp" },
+ { "cpq-tasksmart", { NULL }, 3201, "udp" },
+ { "intraintra", { NULL }, 3202, "tcp" },
+ { "intraintra", { NULL }, 3202, "udp" },
+ { "netwatcher-mon", { NULL }, 3203, "tcp" },
+ { "netwatcher-mon", { NULL }, 3203, "udp" },
+ { "netwatcher-db", { NULL }, 3204, "tcp" },
+ { "netwatcher-db", { NULL }, 3204, "udp" },
+ { "isns", { NULL }, 3205, "tcp" },
+ { "isns", { NULL }, 3205, "udp" },
+ { "ironmail", { NULL }, 3206, "tcp" },
+ { "ironmail", { NULL }, 3206, "udp" },
+ { "vx-auth-port", { NULL }, 3207, "tcp" },
+ { "vx-auth-port", { NULL }, 3207, "udp" },
+ { "pfu-prcallback", { NULL }, 3208, "tcp" },
+ { "pfu-prcallback", { NULL }, 3208, "udp" },
+ { "netwkpathengine", { NULL }, 3209, "tcp" },
+ { "netwkpathengine", { NULL }, 3209, "udp" },
+ { "flamenco-proxy", { NULL }, 3210, "tcp" },
+ { "flamenco-proxy", { NULL }, 3210, "udp" },
+ { "avsecuremgmt", { NULL }, 3211, "tcp" },
+ { "avsecuremgmt", { NULL }, 3211, "udp" },
+ { "surveyinst", { NULL }, 3212, "tcp" },
+ { "surveyinst", { NULL }, 3212, "udp" },
+ { "neon24x7", { NULL }, 3213, "tcp" },
+ { "neon24x7", { NULL }, 3213, "udp" },
+ { "jmq-daemon-1", { NULL }, 3214, "tcp" },
+ { "jmq-daemon-1", { NULL }, 3214, "udp" },
+ { "jmq-daemon-2", { NULL }, 3215, "tcp" },
+ { "jmq-daemon-2", { NULL }, 3215, "udp" },
+ { "ferrari-foam", { NULL }, 3216, "tcp" },
+ { "ferrari-foam", { NULL }, 3216, "udp" },
+ { "unite", { NULL }, 3217, "tcp" },
+ { "unite", { NULL }, 3217, "udp" },
+ { "smartpackets", { NULL }, 3218, "tcp" },
+ { "smartpackets", { NULL }, 3218, "udp" },
+ { "wms-messenger", { NULL }, 3219, "tcp" },
+ { "wms-messenger", { NULL }, 3219, "udp" },
+ { "xnm-ssl", { NULL }, 3220, "tcp" },
+ { "xnm-ssl", { NULL }, 3220, "udp" },
+ { "xnm-clear-text", { NULL }, 3221, "tcp" },
+ { "xnm-clear-text", { NULL }, 3221, "udp" },
+ { "glbp", { NULL }, 3222, "tcp" },
+ { "glbp", { NULL }, 3222, "udp" },
+ { "digivote", { NULL }, 3223, "tcp" },
+ { "digivote", { NULL }, 3223, "udp" },
+ { "aes-discovery", { NULL }, 3224, "tcp" },
+ { "aes-discovery", { NULL }, 3224, "udp" },
+ { "fcip-port", { NULL }, 3225, "tcp" },
+ { "fcip-port", { NULL }, 3225, "udp" },
+ { "isi-irp", { NULL }, 3226, "tcp" },
+ { "isi-irp", { NULL }, 3226, "udp" },
+ { "dwnmshttp", { NULL }, 3227, "tcp" },
+ { "dwnmshttp", { NULL }, 3227, "udp" },
+ { "dwmsgserver", { NULL }, 3228, "tcp" },
+ { "dwmsgserver", { NULL }, 3228, "udp" },
+ { "global-cd-port", { NULL }, 3229, "tcp" },
+ { "global-cd-port", { NULL }, 3229, "udp" },
+ { "sftdst-port", { NULL }, 3230, "tcp" },
+ { "sftdst-port", { NULL }, 3230, "udp" },
+ { "vidigo", { NULL }, 3231, "tcp" },
+ { "vidigo", { NULL }, 3231, "udp" },
+ { "mdtp", { NULL }, 3232, "tcp" },
+ { "mdtp", { NULL }, 3232, "udp" },
+ { "whisker", { NULL }, 3233, "tcp" },
+ { "whisker", { NULL }, 3233, "udp" },
+ { "alchemy", { NULL }, 3234, "tcp" },
+ { "alchemy", { NULL }, 3234, "udp" },
+ { "mdap-port", { NULL }, 3235, "tcp" },
+ { "mdap-port", { NULL }, 3235, "udp" },
+ { "apparenet-ts", { NULL }, 3236, "tcp" },
+ { "apparenet-ts", { NULL }, 3236, "udp" },
+ { "apparenet-tps", { NULL }, 3237, "tcp" },
+ { "apparenet-tps", { NULL }, 3237, "udp" },
+ { "apparenet-as", { NULL }, 3238, "tcp" },
+ { "apparenet-as", { NULL }, 3238, "udp" },
+ { "apparenet-ui", { NULL }, 3239, "tcp" },
+ { "apparenet-ui", { NULL }, 3239, "udp" },
+ { "triomotion", { NULL }, 3240, "tcp" },
+ { "triomotion", { NULL }, 3240, "udp" },
+ { "sysorb", { NULL }, 3241, "tcp" },
+ { "sysorb", { NULL }, 3241, "udp" },
+ { "sdp-id-port", { NULL }, 3242, "tcp" },
+ { "sdp-id-port", { NULL }, 3242, "udp" },
+ { "timelot", { NULL }, 3243, "tcp" },
+ { "timelot", { NULL }, 3243, "udp" },
+ { "onesaf", { NULL }, 3244, "tcp" },
+ { "onesaf", { NULL }, 3244, "udp" },
+ { "vieo-fe", { NULL }, 3245, "tcp" },
+ { "vieo-fe", { NULL }, 3245, "udp" },
+ { "dvt-system", { NULL }, 3246, "tcp" },
+ { "dvt-system", { NULL }, 3246, "udp" },
+ { "dvt-data", { NULL }, 3247, "tcp" },
+ { "dvt-data", { NULL }, 3247, "udp" },
+ { "procos-lm", { NULL }, 3248, "tcp" },
+ { "procos-lm", { NULL }, 3248, "udp" },
+ { "ssp", { NULL }, 3249, "tcp" },
+ { "ssp", { NULL }, 3249, "udp" },
+ { "hicp", { NULL }, 3250, "tcp" },
+ { "hicp", { NULL }, 3250, "udp" },
+ { "sysscanner", { NULL }, 3251, "tcp" },
+ { "sysscanner", { NULL }, 3251, "udp" },
+ { "dhe", { NULL }, 3252, "tcp" },
+ { "dhe", { NULL }, 3252, "udp" },
+ { "pda-data", { NULL }, 3253, "tcp" },
+ { "pda-data", { NULL }, 3253, "udp" },
+ { "pda-sys", { NULL }, 3254, "tcp" },
+ { "pda-sys", { NULL }, 3254, "udp" },
+ { "semaphore", { NULL }, 3255, "tcp" },
+ { "semaphore", { NULL }, 3255, "udp" },
+ { "cpqrpm-agent", { NULL }, 3256, "tcp" },
+ { "cpqrpm-agent", { NULL }, 3256, "udp" },
+ { "cpqrpm-server", { NULL }, 3257, "tcp" },
+ { "cpqrpm-server", { NULL }, 3257, "udp" },
+ { "ivecon-port", { NULL }, 3258, "tcp" },
+ { "ivecon-port", { NULL }, 3258, "udp" },
+ { "epncdp2", { NULL }, 3259, "tcp" },
+ { "epncdp2", { NULL }, 3259, "udp" },
+ { "iscsi-target", { NULL }, 3260, "tcp" },
+ { "iscsi-target", { NULL }, 3260, "udp" },
+ { "winshadow", { NULL }, 3261, "tcp" },
+ { "winshadow", { NULL }, 3261, "udp" },
+ { "necp", { NULL }, 3262, "tcp" },
+ { "necp", { NULL }, 3262, "udp" },
+ { "ecolor-imager", { NULL }, 3263, "tcp" },
+ { "ecolor-imager", { NULL }, 3263, "udp" },
+ { "ccmail", { NULL }, 3264, "tcp" },
+ { "ccmail", { NULL }, 3264, "udp" },
+ { "altav-tunnel", { NULL }, 3265, "tcp" },
+ { "altav-tunnel", { NULL }, 3265, "udp" },
+ { "ns-cfg-server", { NULL }, 3266, "tcp" },
+ { "ns-cfg-server", { NULL }, 3266, "udp" },
+ { "ibm-dial-out", { NULL }, 3267, "tcp" },
+ { "ibm-dial-out", { NULL }, 3267, "udp" },
+ { "msft-gc", { NULL }, 3268, "tcp" },
+ { "msft-gc", { NULL }, 3268, "udp" },
+ { "msft-gc-ssl", { NULL }, 3269, "tcp" },
+ { "msft-gc-ssl", { NULL }, 3269, "udp" },
+ { "verismart", { NULL }, 3270, "tcp" },
+ { "verismart", { NULL }, 3270, "udp" },
+ { "csoft-prev", { NULL }, 3271, "tcp" },
+ { "csoft-prev", { NULL }, 3271, "udp" },
+ { "user-manager", { NULL }, 3272, "tcp" },
+ { "user-manager", { NULL }, 3272, "udp" },
+ { "sxmp", { NULL }, 3273, "tcp" },
+ { "sxmp", { NULL }, 3273, "udp" },
+ { "ordinox-server", { NULL }, 3274, "tcp" },
+ { "ordinox-server", { NULL }, 3274, "udp" },
+ { "samd", { NULL }, 3275, "tcp" },
+ { "samd", { NULL }, 3275, "udp" },
+ { "maxim-asics", { NULL }, 3276, "tcp" },
+ { "maxim-asics", { NULL }, 3276, "udp" },
+ { "awg-proxy", { NULL }, 3277, "tcp" },
+ { "awg-proxy", { NULL }, 3277, "udp" },
+ { "lkcmserver", { NULL }, 3278, "tcp" },
+ { "lkcmserver", { NULL }, 3278, "udp" },
+ { "admind", { NULL }, 3279, "tcp" },
+ { "admind", { NULL }, 3279, "udp" },
+ { "vs-server", { NULL }, 3280, "tcp" },
+ { "vs-server", { NULL }, 3280, "udp" },
+ { "sysopt", { NULL }, 3281, "tcp" },
+ { "sysopt", { NULL }, 3281, "udp" },
+ { "datusorb", { NULL }, 3282, "tcp" },
+ { "datusorb", { NULL }, 3282, "udp" },
+ { "net-assistant", { NULL }, 3283, "tcp" },
+ { "net-assistant", { NULL }, 3283, "udp" },
+ { "4talk", { NULL }, 3284, "tcp" },
+ { "4talk", { NULL }, 3284, "udp" },
+ { "plato", { NULL }, 3285, "tcp" },
+ { "plato", { NULL }, 3285, "udp" },
+ { "e-net", { NULL }, 3286, "tcp" },
+ { "e-net", { NULL }, 3286, "udp" },
+ { "directvdata", { NULL }, 3287, "tcp" },
+ { "directvdata", { NULL }, 3287, "udp" },
+ { "cops", { NULL }, 3288, "tcp" },
+ { "cops", { NULL }, 3288, "udp" },
+ { "enpc", { NULL }, 3289, "tcp" },
+ { "enpc", { NULL }, 3289, "udp" },
+ { "caps-lm", { NULL }, 3290, "tcp" },
+ { "caps-lm", { NULL }, 3290, "udp" },
+ { "sah-lm", { NULL }, 3291, "tcp" },
+ { "sah-lm", { NULL }, 3291, "udp" },
+ { "cart-o-rama", { NULL }, 3292, "tcp" },
+ { "cart-o-rama", { NULL }, 3292, "udp" },
+ { "fg-fps", { NULL }, 3293, "tcp" },
+ { "fg-fps", { NULL }, 3293, "udp" },
+ { "fg-gip", { NULL }, 3294, "tcp" },
+ { "fg-gip", { NULL }, 3294, "udp" },
+ { "dyniplookup", { NULL }, 3295, "tcp" },
+ { "dyniplookup", { NULL }, 3295, "udp" },
+ { "rib-slm", { NULL }, 3296, "tcp" },
+ { "rib-slm", { NULL }, 3296, "udp" },
+ { "cytel-lm", { NULL }, 3297, "tcp" },
+ { "cytel-lm", { NULL }, 3297, "udp" },
+ { "deskview", { NULL }, 3298, "tcp" },
+ { "deskview", { NULL }, 3298, "udp" },
+ { "pdrncs", { NULL }, 3299, "tcp" },
+ { "pdrncs", { NULL }, 3299, "udp" },
+ { "mcs-fastmail", { NULL }, 3302, "tcp" },
+ { "mcs-fastmail", { NULL }, 3302, "udp" },
+ { "opsession-clnt", { NULL }, 3303, "tcp" },
+ { "opsession-clnt", { NULL }, 3303, "udp" },
+ { "opsession-srvr", { NULL }, 3304, "tcp" },
+ { "opsession-srvr", { NULL }, 3304, "udp" },
+ { "odette-ftp", { NULL }, 3305, "tcp" },
+ { "odette-ftp", { NULL }, 3305, "udp" },
+ { "mysql", { NULL }, 3306, "tcp" },
+ { "mysql", { NULL }, 3306, "udp" },
+ { "opsession-prxy", { NULL }, 3307, "tcp" },
+ { "opsession-prxy", { NULL }, 3307, "udp" },
+ { "tns-server", { NULL }, 3308, "tcp" },
+ { "tns-server", { NULL }, 3308, "udp" },
+ { "tns-adv", { NULL }, 3309, "tcp" },
+ { "tns-adv", { NULL }, 3309, "udp" },
+ { "dyna-access", { NULL }, 3310, "tcp" },
+ { "dyna-access", { NULL }, 3310, "udp" },
+ { "mcns-tel-ret", { NULL }, 3311, "tcp" },
+ { "mcns-tel-ret", { NULL }, 3311, "udp" },
+ { "appman-server", { NULL }, 3312, "tcp" },
+ { "appman-server", { NULL }, 3312, "udp" },
+ { "uorb", { NULL }, 3313, "tcp" },
+ { "uorb", { NULL }, 3313, "udp" },
+ { "uohost", { NULL }, 3314, "tcp" },
+ { "uohost", { NULL }, 3314, "udp" },
+ { "cdid", { NULL }, 3315, "tcp" },
+ { "cdid", { NULL }, 3315, "udp" },
+ { "aicc-cmi", { NULL }, 3316, "tcp" },
+ { "aicc-cmi", { NULL }, 3316, "udp" },
+ { "vsaiport", { NULL }, 3317, "tcp" },
+ { "vsaiport", { NULL }, 3317, "udp" },
+ { "ssrip", { NULL }, 3318, "tcp" },
+ { "ssrip", { NULL }, 3318, "udp" },
+ { "sdt-lmd", { NULL }, 3319, "tcp" },
+ { "sdt-lmd", { NULL }, 3319, "udp" },
+ { "officelink2000", { NULL }, 3320, "tcp" },
+ { "officelink2000", { NULL }, 3320, "udp" },
+ { "vnsstr", { NULL }, 3321, "tcp" },
+ { "vnsstr", { NULL }, 3321, "udp" },
+ { "sftu", { NULL }, 3326, "tcp" },
+ { "sftu", { NULL }, 3326, "udp" },
+ { "bbars", { NULL }, 3327, "tcp" },
+ { "bbars", { NULL }, 3327, "udp" },
+ { "egptlm", { NULL }, 3328, "tcp" },
+ { "egptlm", { NULL }, 3328, "udp" },
+ { "hp-device-disc", { NULL }, 3329, "tcp" },
+ { "hp-device-disc", { NULL }, 3329, "udp" },
+ { "mcs-calypsoicf", { NULL }, 3330, "tcp" },
+ { "mcs-calypsoicf", { NULL }, 3330, "udp" },
+ { "mcs-messaging", { NULL }, 3331, "tcp" },
+ { "mcs-messaging", { NULL }, 3331, "udp" },
+ { "mcs-mailsvr", { NULL }, 3332, "tcp" },
+ { "mcs-mailsvr", { NULL }, 3332, "udp" },
+ { "dec-notes", { NULL }, 3333, "tcp" },
+ { "dec-notes", { NULL }, 3333, "udp" },
+ { "directv-web", { NULL }, 3334, "tcp" },
+ { "directv-web", { NULL }, 3334, "udp" },
+ { "directv-soft", { NULL }, 3335, "tcp" },
+ { "directv-soft", { NULL }, 3335, "udp" },
+ { "directv-tick", { NULL }, 3336, "tcp" },
+ { "directv-tick", { NULL }, 3336, "udp" },
+ { "directv-catlg", { NULL }, 3337, "tcp" },
+ { "directv-catlg", { NULL }, 3337, "udp" },
+ { "anet-b", { NULL }, 3338, "tcp" },
+ { "anet-b", { NULL }, 3338, "udp" },
+ { "anet-l", { NULL }, 3339, "tcp" },
+ { "anet-l", { NULL }, 3339, "udp" },
+ { "anet-m", { NULL }, 3340, "tcp" },
+ { "anet-m", { NULL }, 3340, "udp" },
+ { "anet-h", { NULL }, 3341, "tcp" },
+ { "anet-h", { NULL }, 3341, "udp" },
+ { "webtie", { NULL }, 3342, "tcp" },
+ { "webtie", { NULL }, 3342, "udp" },
+ { "ms-cluster-net", { NULL }, 3343, "tcp" },
+ { "ms-cluster-net", { NULL }, 3343, "udp" },
+ { "bnt-manager", { NULL }, 3344, "tcp" },
+ { "bnt-manager", { NULL }, 3344, "udp" },
+ { "influence", { NULL }, 3345, "tcp" },
+ { "influence", { NULL }, 3345, "udp" },
+ { "trnsprntproxy", { NULL }, 3346, "tcp" },
+ { "trnsprntproxy", { NULL }, 3346, "udp" },
+ { "phoenix-rpc", { NULL }, 3347, "tcp" },
+ { "phoenix-rpc", { NULL }, 3347, "udp" },
+ { "pangolin-laser", { NULL }, 3348, "tcp" },
+ { "pangolin-laser", { NULL }, 3348, "udp" },
+ { "chevinservices", { NULL }, 3349, "tcp" },
+ { "chevinservices", { NULL }, 3349, "udp" },
+ { "findviatv", { NULL }, 3350, "tcp" },
+ { "findviatv", { NULL }, 3350, "udp" },
+ { "btrieve", { NULL }, 3351, "tcp" },
+ { "btrieve", { NULL }, 3351, "udp" },
+ { "ssql", { NULL }, 3352, "tcp" },
+ { "ssql", { NULL }, 3352, "udp" },
+ { "fatpipe", { NULL }, 3353, "tcp" },
+ { "fatpipe", { NULL }, 3353, "udp" },
+ { "suitjd", { NULL }, 3354, "tcp" },
+ { "suitjd", { NULL }, 3354, "udp" },
+ { "ordinox-dbase", { NULL }, 3355, "tcp" },
+ { "ordinox-dbase", { NULL }, 3355, "udp" },
+ { "upnotifyps", { NULL }, 3356, "tcp" },
+ { "upnotifyps", { NULL }, 3356, "udp" },
+ { "adtech-test", { NULL }, 3357, "tcp" },
+ { "adtech-test", { NULL }, 3357, "udp" },
+ { "mpsysrmsvr", { NULL }, 3358, "tcp" },
+ { "mpsysrmsvr", { NULL }, 3358, "udp" },
+ { "wg-netforce", { NULL }, 3359, "tcp" },
+ { "wg-netforce", { NULL }, 3359, "udp" },
+ { "kv-server", { NULL }, 3360, "tcp" },
+ { "kv-server", { NULL }, 3360, "udp" },
+ { "kv-agent", { NULL }, 3361, "tcp" },
+ { "kv-agent", { NULL }, 3361, "udp" },
+ { "dj-ilm", { NULL }, 3362, "tcp" },
+ { "dj-ilm", { NULL }, 3362, "udp" },
+ { "nati-vi-server", { NULL }, 3363, "tcp" },
+ { "nati-vi-server", { NULL }, 3363, "udp" },
+ { "creativeserver", { NULL }, 3364, "tcp" },
+ { "creativeserver", { NULL }, 3364, "udp" },
+ { "contentserver", { NULL }, 3365, "tcp" },
+ { "contentserver", { NULL }, 3365, "udp" },
+ { "creativepartnr", { NULL }, 3366, "tcp" },
+ { "creativepartnr", { NULL }, 3366, "udp" },
+ { "tip2", { NULL }, 3372, "tcp" },
+ { "tip2", { NULL }, 3372, "udp" },
+ { "lavenir-lm", { NULL }, 3373, "tcp" },
+ { "lavenir-lm", { NULL }, 3373, "udp" },
+ { "cluster-disc", { NULL }, 3374, "tcp" },
+ { "cluster-disc", { NULL }, 3374, "udp" },
+ { "vsnm-agent", { NULL }, 3375, "tcp" },
+ { "vsnm-agent", { NULL }, 3375, "udp" },
+ { "cdbroker", { NULL }, 3376, "tcp" },
+ { "cdbroker", { NULL }, 3376, "udp" },
+ { "cogsys-lm", { NULL }, 3377, "tcp" },
+ { "cogsys-lm", { NULL }, 3377, "udp" },
+ { "wsicopy", { NULL }, 3378, "tcp" },
+ { "wsicopy", { NULL }, 3378, "udp" },
+ { "socorfs", { NULL }, 3379, "tcp" },
+ { "socorfs", { NULL }, 3379, "udp" },
+ { "sns-channels", { NULL }, 3380, "tcp" },
+ { "sns-channels", { NULL }, 3380, "udp" },
+ { "geneous", { NULL }, 3381, "tcp" },
+ { "geneous", { NULL }, 3381, "udp" },
+ { "fujitsu-neat", { NULL }, 3382, "tcp" },
+ { "fujitsu-neat", { NULL }, 3382, "udp" },
+ { "esp-lm", { NULL }, 3383, "tcp" },
+ { "esp-lm", { NULL }, 3383, "udp" },
+ { "hp-clic", { NULL }, 3384, "tcp" },
+ { "hp-clic", { NULL }, 3384, "udp" },
+ { "qnxnetman", { NULL }, 3385, "tcp" },
+ { "qnxnetman", { NULL }, 3385, "udp" },
+ { "gprs-data", { NULL }, 3386, "tcp" },
+ { "gprs-sig", { NULL }, 3386, "udp" },
+ { "backroomnet", { NULL }, 3387, "tcp" },
+ { "backroomnet", { NULL }, 3387, "udp" },
+ { "cbserver", { NULL }, 3388, "tcp" },
+ { "cbserver", { NULL }, 3388, "udp" },
+ { "ms-wbt-server", { NULL }, 3389, "tcp" },
+ { "ms-wbt-server", { NULL }, 3389, "udp" },
+ { "dsc", { NULL }, 3390, "tcp" },
+ { "dsc", { NULL }, 3390, "udp" },
+ { "savant", { NULL }, 3391, "tcp" },
+ { "savant", { NULL }, 3391, "udp" },
+ { "efi-lm", { NULL }, 3392, "tcp" },
+ { "efi-lm", { NULL }, 3392, "udp" },
+ { "d2k-tapestry1", { NULL }, 3393, "tcp" },
+ { "d2k-tapestry1", { NULL }, 3393, "udp" },
+ { "d2k-tapestry2", { NULL }, 3394, "tcp" },
+ { "d2k-tapestry2", { NULL }, 3394, "udp" },
+ { "dyna-lm", { NULL }, 3395, "tcp" },
+ { "dyna-lm", { NULL }, 3395, "udp" },
+ { "printer_agent", { NULL }, 3396, "tcp" },
+ { "printer_agent", { NULL }, 3396, "udp" },
+ { "cloanto-lm", { NULL }, 3397, "tcp" },
+ { "cloanto-lm", { NULL }, 3397, "udp" },
+ { "mercantile", { NULL }, 3398, "tcp" },
+ { "mercantile", { NULL }, 3398, "udp" },
+ { "csms", { NULL }, 3399, "tcp" },
+ { "csms", { NULL }, 3399, "udp" },
+ { "csms2", { NULL }, 3400, "tcp" },
+ { "csms2", { NULL }, 3400, "udp" },
+ { "filecast", { NULL }, 3401, "tcp" },
+ { "filecast", { NULL }, 3401, "udp" },
+ { "fxaengine-net", { NULL }, 3402, "tcp" },
+ { "fxaengine-net", { NULL }, 3402, "udp" },
+ { "nokia-ann-ch1", { NULL }, 3405, "tcp" },
+ { "nokia-ann-ch1", { NULL }, 3405, "udp" },
+ { "nokia-ann-ch2", { NULL }, 3406, "tcp" },
+ { "nokia-ann-ch2", { NULL }, 3406, "udp" },
+ { "ldap-admin", { NULL }, 3407, "tcp" },
+ { "ldap-admin", { NULL }, 3407, "udp" },
+ { "BESApi", { NULL }, 3408, "tcp" },
+ { "BESApi", { NULL }, 3408, "udp" },
+ { "networklens", { NULL }, 3409, "tcp" },
+ { "networklens", { NULL }, 3409, "udp" },
+ { "networklenss", { NULL }, 3410, "tcp" },
+ { "networklenss", { NULL }, 3410, "udp" },
+ { "biolink-auth", { NULL }, 3411, "tcp" },
+ { "biolink-auth", { NULL }, 3411, "udp" },
+ { "xmlblaster", { NULL }, 3412, "tcp" },
+ { "xmlblaster", { NULL }, 3412, "udp" },
+ { "svnet", { NULL }, 3413, "tcp" },
+ { "svnet", { NULL }, 3413, "udp" },
+ { "wip-port", { NULL }, 3414, "tcp" },
+ { "wip-port", { NULL }, 3414, "udp" },
+ { "bcinameservice", { NULL }, 3415, "tcp" },
+ { "bcinameservice", { NULL }, 3415, "udp" },
+ { "commandport", { NULL }, 3416, "tcp" },
+ { "commandport", { NULL }, 3416, "udp" },
+ { "csvr", { NULL }, 3417, "tcp" },
+ { "csvr", { NULL }, 3417, "udp" },
+ { "rnmap", { NULL }, 3418, "tcp" },
+ { "rnmap", { NULL }, 3418, "udp" },
+ { "softaudit", { NULL }, 3419, "tcp" },
+ { "softaudit", { NULL }, 3419, "udp" },
+ { "ifcp-port", { NULL }, 3420, "tcp" },
+ { "ifcp-port", { NULL }, 3420, "udp" },
+ { "bmap", { NULL }, 3421, "tcp" },
+ { "bmap", { NULL }, 3421, "udp" },
+ { "rusb-sys-port", { NULL }, 3422, "tcp" },
+ { "rusb-sys-port", { NULL }, 3422, "udp" },
+ { "xtrm", { NULL }, 3423, "tcp" },
+ { "xtrm", { NULL }, 3423, "udp" },
+ { "xtrms", { NULL }, 3424, "tcp" },
+ { "xtrms", { NULL }, 3424, "udp" },
+ { "agps-port", { NULL }, 3425, "tcp" },
+ { "agps-port", { NULL }, 3425, "udp" },
+ { "arkivio", { NULL }, 3426, "tcp" },
+ { "arkivio", { NULL }, 3426, "udp" },
+ { "websphere-snmp", { NULL }, 3427, "tcp" },
+ { "websphere-snmp", { NULL }, 3427, "udp" },
+ { "twcss", { NULL }, 3428, "tcp" },
+ { "twcss", { NULL }, 3428, "udp" },
+ { "gcsp", { NULL }, 3429, "tcp" },
+ { "gcsp", { NULL }, 3429, "udp" },
+ { "ssdispatch", { NULL }, 3430, "tcp" },
+ { "ssdispatch", { NULL }, 3430, "udp" },
+ { "ndl-als", { NULL }, 3431, "tcp" },
+ { "ndl-als", { NULL }, 3431, "udp" },
+ { "osdcp", { NULL }, 3432, "tcp" },
+ { "osdcp", { NULL }, 3432, "udp" },
+ { "alta-smp", { NULL }, 3433, "tcp" },
+ { "alta-smp", { NULL }, 3433, "udp" },
+ { "opencm", { NULL }, 3434, "tcp" },
+ { "opencm", { NULL }, 3434, "udp" },
+ { "pacom", { NULL }, 3435, "tcp" },
+ { "pacom", { NULL }, 3435, "udp" },
+ { "gc-config", { NULL }, 3436, "tcp" },
+ { "gc-config", { NULL }, 3436, "udp" },
+ { "autocueds", { NULL }, 3437, "tcp" },
+ { "autocueds", { NULL }, 3437, "udp" },
+ { "spiral-admin", { NULL }, 3438, "tcp" },
+ { "spiral-admin", { NULL }, 3438, "udp" },
+ { "hri-port", { NULL }, 3439, "tcp" },
+ { "hri-port", { NULL }, 3439, "udp" },
+ { "ans-console", { NULL }, 3440, "tcp" },
+ { "ans-console", { NULL }, 3440, "udp" },
+ { "connect-client", { NULL }, 3441, "tcp" },
+ { "connect-client", { NULL }, 3441, "udp" },
+ { "connect-server", { NULL }, 3442, "tcp" },
+ { "connect-server", { NULL }, 3442, "udp" },
+ { "ov-nnm-websrv", { NULL }, 3443, "tcp" },
+ { "ov-nnm-websrv", { NULL }, 3443, "udp" },
+ { "denali-server", { NULL }, 3444, "tcp" },
+ { "denali-server", { NULL }, 3444, "udp" },
+ { "monp", { NULL }, 3445, "tcp" },
+ { "monp", { NULL }, 3445, "udp" },
+ { "3comfaxrpc", { NULL }, 3446, "tcp" },
+ { "3comfaxrpc", { NULL }, 3446, "udp" },
+ { "directnet", { NULL }, 3447, "tcp" },
+ { "directnet", { NULL }, 3447, "udp" },
+ { "dnc-port", { NULL }, 3448, "tcp" },
+ { "dnc-port", { NULL }, 3448, "udp" },
+ { "hotu-chat", { NULL }, 3449, "tcp" },
+ { "hotu-chat", { NULL }, 3449, "udp" },
+ { "castorproxy", { NULL }, 3450, "tcp" },
+ { "castorproxy", { NULL }, 3450, "udp" },
+ { "asam", { NULL }, 3451, "tcp" },
+ { "asam", { NULL }, 3451, "udp" },
+ { "sabp-signal", { NULL }, 3452, "tcp" },
+ { "sabp-signal", { NULL }, 3452, "udp" },
+ { "pscupd", { NULL }, 3453, "tcp" },
+ { "pscupd", { NULL }, 3453, "udp" },
+ { "mira", { NULL }, 3454, "tcp" },
+ { "prsvp", { NULL }, 3455, "tcp" },
+ { "prsvp", { NULL }, 3455, "udp" },
+ { "vat", { NULL }, 3456, "tcp" },
+ { "vat", { NULL }, 3456, "udp" },
+ { "vat-control", { NULL }, 3457, "tcp" },
+ { "vat-control", { NULL }, 3457, "udp" },
+ { "d3winosfi", { NULL }, 3458, "tcp" },
+ { "d3winosfi", { NULL }, 3458, "udp" },
+ { "integral", { NULL }, 3459, "tcp" },
+ { "integral", { NULL }, 3459, "udp" },
+ { "edm-manager", { NULL }, 3460, "tcp" },
+ { "edm-manager", { NULL }, 3460, "udp" },
+ { "edm-stager", { NULL }, 3461, "tcp" },
+ { "edm-stager", { NULL }, 3461, "udp" },
+ { "edm-std-notify", { NULL }, 3462, "tcp" },
+ { "edm-std-notify", { NULL }, 3462, "udp" },
+ { "edm-adm-notify", { NULL }, 3463, "tcp" },
+ { "edm-adm-notify", { NULL }, 3463, "udp" },
+ { "edm-mgr-sync", { NULL }, 3464, "tcp" },
+ { "edm-mgr-sync", { NULL }, 3464, "udp" },
+ { "edm-mgr-cntrl", { NULL }, 3465, "tcp" },
+ { "edm-mgr-cntrl", { NULL }, 3465, "udp" },
+ { "workflow", { NULL }, 3466, "tcp" },
+ { "workflow", { NULL }, 3466, "udp" },
+ { "rcst", { NULL }, 3467, "tcp" },
+ { "rcst", { NULL }, 3467, "udp" },
+ { "ttcmremotectrl", { NULL }, 3468, "tcp" },
+ { "ttcmremotectrl", { NULL }, 3468, "udp" },
+ { "pluribus", { NULL }, 3469, "tcp" },
+ { "pluribus", { NULL }, 3469, "udp" },
+ { "jt400", { NULL }, 3470, "tcp" },
+ { "jt400", { NULL }, 3470, "udp" },
+ { "jt400-ssl", { NULL }, 3471, "tcp" },
+ { "jt400-ssl", { NULL }, 3471, "udp" },
+ { "jaugsremotec-1", { NULL }, 3472, "tcp" },
+ { "jaugsremotec-1", { NULL }, 3472, "udp" },
+ { "jaugsremotec-2", { NULL }, 3473, "tcp" },
+ { "jaugsremotec-2", { NULL }, 3473, "udp" },
+ { "ttntspauto", { NULL }, 3474, "tcp" },
+ { "ttntspauto", { NULL }, 3474, "udp" },
+ { "genisar-port", { NULL }, 3475, "tcp" },
+ { "genisar-port", { NULL }, 3475, "udp" },
+ { "nppmp", { NULL }, 3476, "tcp" },
+ { "nppmp", { NULL }, 3476, "udp" },
+ { "ecomm", { NULL }, 3477, "tcp" },
+ { "ecomm", { NULL }, 3477, "udp" },
+ { "stun", { NULL }, 3478, "tcp" },
+ { "stun", { NULL }, 3478, "udp" },
+ { "turn", { NULL }, 3478, "tcp" },
+ { "turn", { NULL }, 3478, "udp" },
+ { "stun-behavior", { NULL }, 3478, "tcp" },
+ { "stun-behavior", { NULL }, 3478, "udp" },
+ { "twrpc", { NULL }, 3479, "tcp" },
+ { "twrpc", { NULL }, 3479, "udp" },
+ { "plethora", { NULL }, 3480, "tcp" },
+ { "plethora", { NULL }, 3480, "udp" },
+ { "cleanerliverc", { NULL }, 3481, "tcp" },
+ { "cleanerliverc", { NULL }, 3481, "udp" },
+ { "vulture", { NULL }, 3482, "tcp" },
+ { "vulture", { NULL }, 3482, "udp" },
+ { "slim-devices", { NULL }, 3483, "tcp" },
+ { "slim-devices", { NULL }, 3483, "udp" },
+ { "gbs-stp", { NULL }, 3484, "tcp" },
+ { "gbs-stp", { NULL }, 3484, "udp" },
+ { "celatalk", { NULL }, 3485, "tcp" },
+ { "celatalk", { NULL }, 3485, "udp" },
+ { "ifsf-hb-port", { NULL }, 3486, "tcp" },
+ { "ifsf-hb-port", { NULL }, 3486, "udp" },
+ { "ltctcp", { NULL }, 3487, "tcp" },
+ { "ltcudp", { NULL }, 3487, "udp" },
+ { "fs-rh-srv", { NULL }, 3488, "tcp" },
+ { "fs-rh-srv", { NULL }, 3488, "udp" },
+ { "dtp-dia", { NULL }, 3489, "tcp" },
+ { "dtp-dia", { NULL }, 3489, "udp" },
+ { "colubris", { NULL }, 3490, "tcp" },
+ { "colubris", { NULL }, 3490, "udp" },
+ { "swr-port", { NULL }, 3491, "tcp" },
+ { "swr-port", { NULL }, 3491, "udp" },
+ { "tvdumtray-port", { NULL }, 3492, "tcp" },
+ { "tvdumtray-port", { NULL }, 3492, "udp" },
+ { "nut", { NULL }, 3493, "tcp" },
+ { "nut", { NULL }, 3493, "udp" },
+ { "ibm3494", { NULL }, 3494, "tcp" },
+ { "ibm3494", { NULL }, 3494, "udp" },
+ { "seclayer-tcp", { NULL }, 3495, "tcp" },
+ { "seclayer-tcp", { NULL }, 3495, "udp" },
+ { "seclayer-tls", { NULL }, 3496, "tcp" },
+ { "seclayer-tls", { NULL }, 3496, "udp" },
+ { "ipether232port", { NULL }, 3497, "tcp" },
+ { "ipether232port", { NULL }, 3497, "udp" },
+ { "dashpas-port", { NULL }, 3498, "tcp" },
+ { "dashpas-port", { NULL }, 3498, "udp" },
+ { "sccip-media", { NULL }, 3499, "tcp" },
+ { "sccip-media", { NULL }, 3499, "udp" },
+ { "rtmp-port", { NULL }, 3500, "tcp" },
+ { "rtmp-port", { NULL }, 3500, "udp" },
+ { "isoft-p2p", { NULL }, 3501, "tcp" },
+ { "isoft-p2p", { NULL }, 3501, "udp" },
+ { "avinstalldisc", { NULL }, 3502, "tcp" },
+ { "avinstalldisc", { NULL }, 3502, "udp" },
+ { "lsp-ping", { NULL }, 3503, "tcp" },
+ { "lsp-ping", { NULL }, 3503, "udp" },
+ { "ironstorm", { NULL }, 3504, "tcp" },
+ { "ironstorm", { NULL }, 3504, "udp" },
+ { "ccmcomm", { NULL }, 3505, "tcp" },
+ { "ccmcomm", { NULL }, 3505, "udp" },
+ { "apc-3506", { NULL }, 3506, "tcp" },
+ { "apc-3506", { NULL }, 3506, "udp" },
+ { "nesh-broker", { NULL }, 3507, "tcp" },
+ { "nesh-broker", { NULL }, 3507, "udp" },
+ { "interactionweb", { NULL }, 3508, "tcp" },
+ { "interactionweb", { NULL }, 3508, "udp" },
+ { "vt-ssl", { NULL }, 3509, "tcp" },
+ { "vt-ssl", { NULL }, 3509, "udp" },
+ { "xss-port", { NULL }, 3510, "tcp" },
+ { "xss-port", { NULL }, 3510, "udp" },
+ { "webmail-2", { NULL }, 3511, "tcp" },
+ { "webmail-2", { NULL }, 3511, "udp" },
+ { "aztec", { NULL }, 3512, "tcp" },
+ { "aztec", { NULL }, 3512, "udp" },
+ { "arcpd", { NULL }, 3513, "tcp" },
+ { "arcpd", { NULL }, 3513, "udp" },
+ { "must-p2p", { NULL }, 3514, "tcp" },
+ { "must-p2p", { NULL }, 3514, "udp" },
+ { "must-backplane", { NULL }, 3515, "tcp" },
+ { "must-backplane", { NULL }, 3515, "udp" },
+ { "smartcard-port", { NULL }, 3516, "tcp" },
+ { "smartcard-port", { NULL }, 3516, "udp" },
+ { "802-11-iapp", { NULL }, 3517, "tcp" },
+ { "802-11-iapp", { NULL }, 3517, "udp" },
+ { "artifact-msg", { NULL }, 3518, "tcp" },
+ { "artifact-msg", { NULL }, 3518, "udp" },
+ { "nvmsgd", { NULL }, 3519, "tcp" },
+ { "galileo", { NULL }, 3519, "udp" },
+ { "galileolog", { NULL }, 3520, "tcp" },
+ { "galileolog", { NULL }, 3520, "udp" },
+ { "mc3ss", { NULL }, 3521, "tcp" },
+ { "mc3ss", { NULL }, 3521, "udp" },
+ { "nssocketport", { NULL }, 3522, "tcp" },
+ { "nssocketport", { NULL }, 3522, "udp" },
+ { "odeumservlink", { NULL }, 3523, "tcp" },
+ { "odeumservlink", { NULL }, 3523, "udp" },
+ { "ecmport", { NULL }, 3524, "tcp" },
+ { "ecmport", { NULL }, 3524, "udp" },
+ { "eisport", { NULL }, 3525, "tcp" },
+ { "eisport", { NULL }, 3525, "udp" },
+ { "starquiz-port", { NULL }, 3526, "tcp" },
+ { "starquiz-port", { NULL }, 3526, "udp" },
+ { "beserver-msg-q", { NULL }, 3527, "tcp" },
+ { "beserver-msg-q", { NULL }, 3527, "udp" },
+ { "jboss-iiop", { NULL }, 3528, "tcp" },
+ { "jboss-iiop", { NULL }, 3528, "udp" },
+ { "jboss-iiop-ssl", { NULL }, 3529, "tcp" },
+ { "jboss-iiop-ssl", { NULL }, 3529, "udp" },
+ { "gf", { NULL }, 3530, "tcp" },
+ { "gf", { NULL }, 3530, "udp" },
+ { "joltid", { NULL }, 3531, "tcp" },
+ { "joltid", { NULL }, 3531, "udp" },
+ { "raven-rmp", { NULL }, 3532, "tcp" },
+ { "raven-rmp", { NULL }, 3532, "udp" },
+ { "raven-rdp", { NULL }, 3533, "tcp" },
+ { "raven-rdp", { NULL }, 3533, "udp" },
+ { "urld-port", { NULL }, 3534, "tcp" },
+ { "urld-port", { NULL }, 3534, "udp" },
+ { "ms-la", { NULL }, 3535, "tcp" },
+ { "ms-la", { NULL }, 3535, "udp" },
+ { "snac", { NULL }, 3536, "tcp" },
+ { "snac", { NULL }, 3536, "udp" },
+ { "ni-visa-remote", { NULL }, 3537, "tcp" },
+ { "ni-visa-remote", { NULL }, 3537, "udp" },
+ { "ibm-diradm", { NULL }, 3538, "tcp" },
+ { "ibm-diradm", { NULL }, 3538, "udp" },
+ { "ibm-diradm-ssl", { NULL }, 3539, "tcp" },
+ { "ibm-diradm-ssl", { NULL }, 3539, "udp" },
+ { "pnrp-port", { NULL }, 3540, "tcp" },
+ { "pnrp-port", { NULL }, 3540, "udp" },
+ { "voispeed-port", { NULL }, 3541, "tcp" },
+ { "voispeed-port", { NULL }, 3541, "udp" },
+ { "hacl-monitor", { NULL }, 3542, "tcp" },
+ { "hacl-monitor", { NULL }, 3542, "udp" },
+ { "qftest-lookup", { NULL }, 3543, "tcp" },
+ { "qftest-lookup", { NULL }, 3543, "udp" },
+ { "teredo", { NULL }, 3544, "tcp" },
+ { "teredo", { NULL }, 3544, "udp" },
+ { "camac", { NULL }, 3545, "tcp" },
+ { "camac", { NULL }, 3545, "udp" },
+ { "symantec-sim", { NULL }, 3547, "tcp" },
+ { "symantec-sim", { NULL }, 3547, "udp" },
+ { "interworld", { NULL }, 3548, "tcp" },
+ { "interworld", { NULL }, 3548, "udp" },
+ { "tellumat-nms", { NULL }, 3549, "tcp" },
+ { "tellumat-nms", { NULL }, 3549, "udp" },
+ { "ssmpp", { NULL }, 3550, "tcp" },
+ { "ssmpp", { NULL }, 3550, "udp" },
+ { "apcupsd", { NULL }, 3551, "tcp" },
+ { "apcupsd", { NULL }, 3551, "udp" },
+ { "taserver", { NULL }, 3552, "tcp" },
+ { "taserver", { NULL }, 3552, "udp" },
+ { "rbr-discovery", { NULL }, 3553, "tcp" },
+ { "rbr-discovery", { NULL }, 3553, "udp" },
+ { "questnotify", { NULL }, 3554, "tcp" },
+ { "questnotify", { NULL }, 3554, "udp" },
+ { "razor", { NULL }, 3555, "tcp" },
+ { "razor", { NULL }, 3555, "udp" },
+ { "sky-transport", { NULL }, 3556, "tcp" },
+ { "sky-transport", { NULL }, 3556, "udp" },
+ { "personalos-001", { NULL }, 3557, "tcp" },
+ { "personalos-001", { NULL }, 3557, "udp" },
+ { "mcp-port", { NULL }, 3558, "tcp" },
+ { "mcp-port", { NULL }, 3558, "udp" },
+ { "cctv-port", { NULL }, 3559, "tcp" },
+ { "cctv-port", { NULL }, 3559, "udp" },
+ { "iniserve-port", { NULL }, 3560, "tcp" },
+ { "iniserve-port", { NULL }, 3560, "udp" },
+ { "bmc-onekey", { NULL }, 3561, "tcp" },
+ { "bmc-onekey", { NULL }, 3561, "udp" },
+ { "sdbproxy", { NULL }, 3562, "tcp" },
+ { "sdbproxy", { NULL }, 3562, "udp" },
+ { "watcomdebug", { NULL }, 3563, "tcp" },
+ { "watcomdebug", { NULL }, 3563, "udp" },
+ { "esimport", { NULL }, 3564, "tcp" },
+ { "esimport", { NULL }, 3564, "udp" },
+ { "m2pa", { NULL }, 3565, "tcp" },
+ { "m2pa", { NULL }, 3565, "sctp"},
+ { "quest-data-hub", { NULL }, 3566, "tcp" },
+ { "oap", { NULL }, 3567, "tcp" },
+ { "oap", { NULL }, 3567, "udp" },
+ { "oap-s", { NULL }, 3568, "tcp" },
+ { "oap-s", { NULL }, 3568, "udp" },
+ { "mbg-ctrl", { NULL }, 3569, "tcp" },
+ { "mbg-ctrl", { NULL }, 3569, "udp" },
+ { "mccwebsvr-port", { NULL }, 3570, "tcp" },
+ { "mccwebsvr-port", { NULL }, 3570, "udp" },
+ { "megardsvr-port", { NULL }, 3571, "tcp" },
+ { "megardsvr-port", { NULL }, 3571, "udp" },
+ { "megaregsvrport", { NULL }, 3572, "tcp" },
+ { "megaregsvrport", { NULL }, 3572, "udp" },
+ { "tag-ups-1", { NULL }, 3573, "tcp" },
+ { "tag-ups-1", { NULL }, 3573, "udp" },
+ { "dmaf-server", { NULL }, 3574, "tcp" },
+ { "dmaf-caster", { NULL }, 3574, "udp" },
+ { "ccm-port", { NULL }, 3575, "tcp" },
+ { "ccm-port", { NULL }, 3575, "udp" },
+ { "cmc-port", { NULL }, 3576, "tcp" },
+ { "cmc-port", { NULL }, 3576, "udp" },
+ { "config-port", { NULL }, 3577, "tcp" },
+ { "config-port", { NULL }, 3577, "udp" },
+ { "data-port", { NULL }, 3578, "tcp" },
+ { "data-port", { NULL }, 3578, "udp" },
+ { "ttat3lb", { NULL }, 3579, "tcp" },
+ { "ttat3lb", { NULL }, 3579, "udp" },
+ { "nati-svrloc", { NULL }, 3580, "tcp" },
+ { "nati-svrloc", { NULL }, 3580, "udp" },
+ { "kfxaclicensing", { NULL }, 3581, "tcp" },
+ { "kfxaclicensing", { NULL }, 3581, "udp" },
+ { "press", { NULL }, 3582, "tcp" },
+ { "press", { NULL }, 3582, "udp" },
+ { "canex-watch", { NULL }, 3583, "tcp" },
+ { "canex-watch", { NULL }, 3583, "udp" },
+ { "u-dbap", { NULL }, 3584, "tcp" },
+ { "u-dbap", { NULL }, 3584, "udp" },
+ { "emprise-lls", { NULL }, 3585, "tcp" },
+ { "emprise-lls", { NULL }, 3585, "udp" },
+ { "emprise-lsc", { NULL }, 3586, "tcp" },
+ { "emprise-lsc", { NULL }, 3586, "udp" },
+ { "p2pgroup", { NULL }, 3587, "tcp" },
+ { "p2pgroup", { NULL }, 3587, "udp" },
+ { "sentinel", { NULL }, 3588, "tcp" },
+ { "sentinel", { NULL }, 3588, "udp" },
+ { "isomair", { NULL }, 3589, "tcp" },
+ { "isomair", { NULL }, 3589, "udp" },
+ { "wv-csp-sms", { NULL }, 3590, "tcp" },
+ { "wv-csp-sms", { NULL }, 3590, "udp" },
+ { "gtrack-server", { NULL }, 3591, "tcp" },
+ { "gtrack-server", { NULL }, 3591, "udp" },
+ { "gtrack-ne", { NULL }, 3592, "tcp" },
+ { "gtrack-ne", { NULL }, 3592, "udp" },
+ { "bpmd", { NULL }, 3593, "tcp" },
+ { "bpmd", { NULL }, 3593, "udp" },
+ { "mediaspace", { NULL }, 3594, "tcp" },
+ { "mediaspace", { NULL }, 3594, "udp" },
+ { "shareapp", { NULL }, 3595, "tcp" },
+ { "shareapp", { NULL }, 3595, "udp" },
+ { "iw-mmogame", { NULL }, 3596, "tcp" },
+ { "iw-mmogame", { NULL }, 3596, "udp" },
+ { "a14", { NULL }, 3597, "tcp" },
+ { "a14", { NULL }, 3597, "udp" },
+ { "a15", { NULL }, 3598, "tcp" },
+ { "a15", { NULL }, 3598, "udp" },
+ { "quasar-server", { NULL }, 3599, "tcp" },
+ { "quasar-server", { NULL }, 3599, "udp" },
+ { "trap-daemon", { NULL }, 3600, "tcp" },
+ { "trap-daemon", { NULL }, 3600, "udp" },
+ { "visinet-gui", { NULL }, 3601, "tcp" },
+ { "visinet-gui", { NULL }, 3601, "udp" },
+ { "infiniswitchcl", { NULL }, 3602, "tcp" },
+ { "infiniswitchcl", { NULL }, 3602, "udp" },
+ { "int-rcv-cntrl", { NULL }, 3603, "tcp" },
+ { "int-rcv-cntrl", { NULL }, 3603, "udp" },
+ { "bmc-jmx-port", { NULL }, 3604, "tcp" },
+ { "bmc-jmx-port", { NULL }, 3604, "udp" },
+ { "comcam-io", { NULL }, 3605, "tcp" },
+ { "comcam-io", { NULL }, 3605, "udp" },
+ { "splitlock", { NULL }, 3606, "tcp" },
+ { "splitlock", { NULL }, 3606, "udp" },
+ { "precise-i3", { NULL }, 3607, "tcp" },
+ { "precise-i3", { NULL }, 3607, "udp" },
+ { "trendchip-dcp", { NULL }, 3608, "tcp" },
+ { "trendchip-dcp", { NULL }, 3608, "udp" },
+ { "cpdi-pidas-cm", { NULL }, 3609, "tcp" },
+ { "cpdi-pidas-cm", { NULL }, 3609, "udp" },
+ { "echonet", { NULL }, 3610, "tcp" },
+ { "echonet", { NULL }, 3610, "udp" },
+ { "six-degrees", { NULL }, 3611, "tcp" },
+ { "six-degrees", { NULL }, 3611, "udp" },
+ { "hp-dataprotect", { NULL }, 3612, "tcp" },
+ { "hp-dataprotect", { NULL }, 3612, "udp" },
+ { "alaris-disc", { NULL }, 3613, "tcp" },
+ { "alaris-disc", { NULL }, 3613, "udp" },
+ { "sigma-port", { NULL }, 3614, "tcp" },
+ { "sigma-port", { NULL }, 3614, "udp" },
+ { "start-network", { NULL }, 3615, "tcp" },
+ { "start-network", { NULL }, 3615, "udp" },
+ { "cd3o-protocol", { NULL }, 3616, "tcp" },
+ { "cd3o-protocol", { NULL }, 3616, "udp" },
+ { "sharp-server", { NULL }, 3617, "tcp" },
+ { "sharp-server", { NULL }, 3617, "udp" },
+ { "aairnet-1", { NULL }, 3618, "tcp" },
+ { "aairnet-1", { NULL }, 3618, "udp" },
+ { "aairnet-2", { NULL }, 3619, "tcp" },
+ { "aairnet-2", { NULL }, 3619, "udp" },
+ { "ep-pcp", { NULL }, 3620, "tcp" },
+ { "ep-pcp", { NULL }, 3620, "udp" },
+ { "ep-nsp", { NULL }, 3621, "tcp" },
+ { "ep-nsp", { NULL }, 3621, "udp" },
+ { "ff-lr-port", { NULL }, 3622, "tcp" },
+ { "ff-lr-port", { NULL }, 3622, "udp" },
+ { "haipe-discover", { NULL }, 3623, "tcp" },
+ { "haipe-discover", { NULL }, 3623, "udp" },
+ { "dist-upgrade", { NULL }, 3624, "tcp" },
+ { "dist-upgrade", { NULL }, 3624, "udp" },
+ { "volley", { NULL }, 3625, "tcp" },
+ { "volley", { NULL }, 3625, "udp" },
+ { "bvcdaemon-port", { NULL }, 3626, "tcp" },
+ { "bvcdaemon-port", { NULL }, 3626, "udp" },
+ { "jamserverport", { NULL }, 3627, "tcp" },
+ { "jamserverport", { NULL }, 3627, "udp" },
+ { "ept-machine", { NULL }, 3628, "tcp" },
+ { "ept-machine", { NULL }, 3628, "udp" },
+ { "escvpnet", { NULL }, 3629, "tcp" },
+ { "escvpnet", { NULL }, 3629, "udp" },
+ { "cs-remote-db", { NULL }, 3630, "tcp" },
+ { "cs-remote-db", { NULL }, 3630, "udp" },
+ { "cs-services", { NULL }, 3631, "tcp" },
+ { "cs-services", { NULL }, 3631, "udp" },
+ { "distcc", { NULL }, 3632, "tcp" },
+ { "distcc", { NULL }, 3632, "udp" },
+ { "wacp", { NULL }, 3633, "tcp" },
+ { "wacp", { NULL }, 3633, "udp" },
+ { "hlibmgr", { NULL }, 3634, "tcp" },
+ { "hlibmgr", { NULL }, 3634, "udp" },
+ { "sdo", { NULL }, 3635, "tcp" },
+ { "sdo", { NULL }, 3635, "udp" },
+ { "servistaitsm", { NULL }, 3636, "tcp" },
+ { "servistaitsm", { NULL }, 3636, "udp" },
+ { "scservp", { NULL }, 3637, "tcp" },
+ { "scservp", { NULL }, 3637, "udp" },
+ { "ehp-backup", { NULL }, 3638, "tcp" },
+ { "ehp-backup", { NULL }, 3638, "udp" },
+ { "xap-ha", { NULL }, 3639, "tcp" },
+ { "xap-ha", { NULL }, 3639, "udp" },
+ { "netplay-port1", { NULL }, 3640, "tcp" },
+ { "netplay-port1", { NULL }, 3640, "udp" },
+ { "netplay-port2", { NULL }, 3641, "tcp" },
+ { "netplay-port2", { NULL }, 3641, "udp" },
+ { "juxml-port", { NULL }, 3642, "tcp" },
+ { "juxml-port", { NULL }, 3642, "udp" },
+ { "audiojuggler", { NULL }, 3643, "tcp" },
+ { "audiojuggler", { NULL }, 3643, "udp" },
+ { "ssowatch", { NULL }, 3644, "tcp" },
+ { "ssowatch", { NULL }, 3644, "udp" },
+ { "cyc", { NULL }, 3645, "tcp" },
+ { "cyc", { NULL }, 3645, "udp" },
+ { "xss-srv-port", { NULL }, 3646, "tcp" },
+ { "xss-srv-port", { NULL }, 3646, "udp" },
+ { "splitlock-gw", { NULL }, 3647, "tcp" },
+ { "splitlock-gw", { NULL }, 3647, "udp" },
+ { "fjcp", { NULL }, 3648, "tcp" },
+ { "fjcp", { NULL }, 3648, "udp" },
+ { "nmmp", { NULL }, 3649, "tcp" },
+ { "nmmp", { NULL }, 3649, "udp" },
+ { "prismiq-plugin", { NULL }, 3650, "tcp" },
+ { "prismiq-plugin", { NULL }, 3650, "udp" },
+ { "xrpc-registry", { NULL }, 3651, "tcp" },
+ { "xrpc-registry", { NULL }, 3651, "udp" },
+ { "vxcrnbuport", { NULL }, 3652, "tcp" },
+ { "vxcrnbuport", { NULL }, 3652, "udp" },
+ { "tsp", { NULL }, 3653, "tcp" },
+ { "tsp", { NULL }, 3653, "udp" },
+ { "vaprtm", { NULL }, 3654, "tcp" },
+ { "vaprtm", { NULL }, 3654, "udp" },
+ { "abatemgr", { NULL }, 3655, "tcp" },
+ { "abatemgr", { NULL }, 3655, "udp" },
+ { "abatjss", { NULL }, 3656, "tcp" },
+ { "abatjss", { NULL }, 3656, "udp" },
+ { "immedianet-bcn", { NULL }, 3657, "tcp" },
+ { "immedianet-bcn", { NULL }, 3657, "udp" },
+ { "ps-ams", { NULL }, 3658, "tcp" },
+ { "ps-ams", { NULL }, 3658, "udp" },
+ { "apple-sasl", { NULL }, 3659, "tcp" },
+ { "apple-sasl", { NULL }, 3659, "udp" },
+ { "can-nds-ssl", { NULL }, 3660, "tcp" },
+ { "can-nds-ssl", { NULL }, 3660, "udp" },
+ { "can-ferret-ssl", { NULL }, 3661, "tcp" },
+ { "can-ferret-ssl", { NULL }, 3661, "udp" },
+ { "pserver", { NULL }, 3662, "tcp" },
+ { "pserver", { NULL }, 3662, "udp" },
+ { "dtp", { NULL }, 3663, "tcp" },
+ { "dtp", { NULL }, 3663, "udp" },
+ { "ups-engine", { NULL }, 3664, "tcp" },
+ { "ups-engine", { NULL }, 3664, "udp" },
+ { "ent-engine", { NULL }, 3665, "tcp" },
+ { "ent-engine", { NULL }, 3665, "udp" },
+ { "eserver-pap", { NULL }, 3666, "tcp" },
+ { "eserver-pap", { NULL }, 3666, "udp" },
+ { "infoexch", { NULL }, 3667, "tcp" },
+ { "infoexch", { NULL }, 3667, "udp" },
+ { "dell-rm-port", { NULL }, 3668, "tcp" },
+ { "dell-rm-port", { NULL }, 3668, "udp" },
+ { "casanswmgmt", { NULL }, 3669, "tcp" },
+ { "casanswmgmt", { NULL }, 3669, "udp" },
+ { "smile", { NULL }, 3670, "tcp" },
+ { "smile", { NULL }, 3670, "udp" },
+ { "efcp", { NULL }, 3671, "tcp" },
+ { "efcp", { NULL }, 3671, "udp" },
+ { "lispworks-orb", { NULL }, 3672, "tcp" },
+ { "lispworks-orb", { NULL }, 3672, "udp" },
+ { "mediavault-gui", { NULL }, 3673, "tcp" },
+ { "mediavault-gui", { NULL }, 3673, "udp" },
+ { "wininstall-ipc", { NULL }, 3674, "tcp" },
+ { "wininstall-ipc", { NULL }, 3674, "udp" },
+ { "calltrax", { NULL }, 3675, "tcp" },
+ { "calltrax", { NULL }, 3675, "udp" },
+ { "va-pacbase", { NULL }, 3676, "tcp" },
+ { "va-pacbase", { NULL }, 3676, "udp" },
+ { "roverlog", { NULL }, 3677, "tcp" },
+ { "roverlog", { NULL }, 3677, "udp" },
+ { "ipr-dglt", { NULL }, 3678, "tcp" },
+ { "ipr-dglt", { NULL }, 3678, "udp" },
+ { "newton-dock", { NULL }, 3679, "tcp" },
+ { "newton-dock", { NULL }, 3679, "udp" },
+ { "npds-tracker", { NULL }, 3680, "tcp" },
+ { "npds-tracker", { NULL }, 3680, "udp" },
+ { "bts-x73", { NULL }, 3681, "tcp" },
+ { "bts-x73", { NULL }, 3681, "udp" },
+ { "cas-mapi", { NULL }, 3682, "tcp" },
+ { "cas-mapi", { NULL }, 3682, "udp" },
+ { "bmc-ea", { NULL }, 3683, "tcp" },
+ { "bmc-ea", { NULL }, 3683, "udp" },
+ { "faxstfx-port", { NULL }, 3684, "tcp" },
+ { "faxstfx-port", { NULL }, 3684, "udp" },
+ { "dsx-agent", { NULL }, 3685, "tcp" },
+ { "dsx-agent", { NULL }, 3685, "udp" },
+ { "tnmpv2", { NULL }, 3686, "tcp" },
+ { "tnmpv2", { NULL }, 3686, "udp" },
+ { "simple-push", { NULL }, 3687, "tcp" },
+ { "simple-push", { NULL }, 3687, "udp" },
+ { "simple-push-s", { NULL }, 3688, "tcp" },
+ { "simple-push-s", { NULL }, 3688, "udp" },
+ { "daap", { NULL }, 3689, "tcp" },
+ { "daap", { NULL }, 3689, "udp" },
+ { "svn", { NULL }, 3690, "tcp" },
+ { "svn", { NULL }, 3690, "udp" },
+ { "magaya-network", { NULL }, 3691, "tcp" },
+ { "magaya-network", { NULL }, 3691, "udp" },
+ { "intelsync", { NULL }, 3692, "tcp" },
+ { "intelsync", { NULL }, 3692, "udp" },
+ { "bmc-data-coll", { NULL }, 3695, "tcp" },
+ { "bmc-data-coll", { NULL }, 3695, "udp" },
+ { "telnetcpcd", { NULL }, 3696, "tcp" },
+ { "telnetcpcd", { NULL }, 3696, "udp" },
+ { "nw-license", { NULL }, 3697, "tcp" },
+ { "nw-license", { NULL }, 3697, "udp" },
+ { "sagectlpanel", { NULL }, 3698, "tcp" },
+ { "sagectlpanel", { NULL }, 3698, "udp" },
+ { "kpn-icw", { NULL }, 3699, "tcp" },
+ { "kpn-icw", { NULL }, 3699, "udp" },
+ { "lrs-paging", { NULL }, 3700, "tcp" },
+ { "lrs-paging", { NULL }, 3700, "udp" },
+ { "netcelera", { NULL }, 3701, "tcp" },
+ { "netcelera", { NULL }, 3701, "udp" },
+ { "ws-discovery", { NULL }, 3702, "tcp" },
+ { "ws-discovery", { NULL }, 3702, "udp" },
+ { "adobeserver-3", { NULL }, 3703, "tcp" },
+ { "adobeserver-3", { NULL }, 3703, "udp" },
+ { "adobeserver-4", { NULL }, 3704, "tcp" },
+ { "adobeserver-4", { NULL }, 3704, "udp" },
+ { "adobeserver-5", { NULL }, 3705, "tcp" },
+ { "adobeserver-5", { NULL }, 3705, "udp" },
+ { "rt-event", { NULL }, 3706, "tcp" },
+ { "rt-event", { NULL }, 3706, "udp" },
+ { "rt-event-s", { NULL }, 3707, "tcp" },
+ { "rt-event-s", { NULL }, 3707, "udp" },
+ { "sun-as-iiops", { NULL }, 3708, "tcp" },
+ { "sun-as-iiops", { NULL }, 3708, "udp" },
+ { "ca-idms", { NULL }, 3709, "tcp" },
+ { "ca-idms", { NULL }, 3709, "udp" },
+ { "portgate-auth", { NULL }, 3710, "tcp" },
+ { "portgate-auth", { NULL }, 3710, "udp" },
+ { "edb-server2", { NULL }, 3711, "tcp" },
+ { "edb-server2", { NULL }, 3711, "udp" },
+ { "sentinel-ent", { NULL }, 3712, "tcp" },
+ { "sentinel-ent", { NULL }, 3712, "udp" },
+ { "tftps", { NULL }, 3713, "tcp" },
+ { "tftps", { NULL }, 3713, "udp" },
+ { "delos-dms", { NULL }, 3714, "tcp" },
+ { "delos-dms", { NULL }, 3714, "udp" },
+ { "anoto-rendezv", { NULL }, 3715, "tcp" },
+ { "anoto-rendezv", { NULL }, 3715, "udp" },
+ { "wv-csp-sms-cir", { NULL }, 3716, "tcp" },
+ { "wv-csp-sms-cir", { NULL }, 3716, "udp" },
+ { "wv-csp-udp-cir", { NULL }, 3717, "tcp" },
+ { "wv-csp-udp-cir", { NULL }, 3717, "udp" },
+ { "opus-services", { NULL }, 3718, "tcp" },
+ { "opus-services", { NULL }, 3718, "udp" },
+ { "itelserverport", { NULL }, 3719, "tcp" },
+ { "itelserverport", { NULL }, 3719, "udp" },
+ { "ufastro-instr", { NULL }, 3720, "tcp" },
+ { "ufastro-instr", { NULL }, 3720, "udp" },
+ { "xsync", { NULL }, 3721, "tcp" },
+ { "xsync", { NULL }, 3721, "udp" },
+ { "xserveraid", { NULL }, 3722, "tcp" },
+ { "xserveraid", { NULL }, 3722, "udp" },
+ { "sychrond", { NULL }, 3723, "tcp" },
+ { "sychrond", { NULL }, 3723, "udp" },
+ { "blizwow", { NULL }, 3724, "tcp" },
+ { "blizwow", { NULL }, 3724, "udp" },
+ { "na-er-tip", { NULL }, 3725, "tcp" },
+ { "na-er-tip", { NULL }, 3725, "udp" },
+ { "array-manager", { NULL }, 3726, "tcp" },
+ { "array-manager", { NULL }, 3726, "udp" },
+ { "e-mdu", { NULL }, 3727, "tcp" },
+ { "e-mdu", { NULL }, 3727, "udp" },
+ { "e-woa", { NULL }, 3728, "tcp" },
+ { "e-woa", { NULL }, 3728, "udp" },
+ { "fksp-audit", { NULL }, 3729, "tcp" },
+ { "fksp-audit", { NULL }, 3729, "udp" },
+ { "client-ctrl", { NULL }, 3730, "tcp" },
+ { "client-ctrl", { NULL }, 3730, "udp" },
+ { "smap", { NULL }, 3731, "tcp" },
+ { "smap", { NULL }, 3731, "udp" },
+ { "m-wnn", { NULL }, 3732, "tcp" },
+ { "m-wnn", { NULL }, 3732, "udp" },
+ { "multip-msg", { NULL }, 3733, "tcp" },
+ { "multip-msg", { NULL }, 3733, "udp" },
+ { "synel-data", { NULL }, 3734, "tcp" },
+ { "synel-data", { NULL }, 3734, "udp" },
+ { "pwdis", { NULL }, 3735, "tcp" },
+ { "pwdis", { NULL }, 3735, "udp" },
+ { "rs-rmi", { NULL }, 3736, "tcp" },
+ { "rs-rmi", { NULL }, 3736, "udp" },
+ { "xpanel", { NULL }, 3737, "tcp" },
+ { "versatalk", { NULL }, 3738, "tcp" },
+ { "versatalk", { NULL }, 3738, "udp" },
+ { "launchbird-lm", { NULL }, 3739, "tcp" },
+ { "launchbird-lm", { NULL }, 3739, "udp" },
+ { "heartbeat", { NULL }, 3740, "tcp" },
+ { "heartbeat", { NULL }, 3740, "udp" },
+ { "wysdma", { NULL }, 3741, "tcp" },
+ { "wysdma", { NULL }, 3741, "udp" },
+ { "cst-port", { NULL }, 3742, "tcp" },
+ { "cst-port", { NULL }, 3742, "udp" },
+ { "ipcs-command", { NULL }, 3743, "tcp" },
+ { "ipcs-command", { NULL }, 3743, "udp" },
+ { "sasg", { NULL }, 3744, "tcp" },
+ { "sasg", { NULL }, 3744, "udp" },
+ { "gw-call-port", { NULL }, 3745, "tcp" },
+ { "gw-call-port", { NULL }, 3745, "udp" },
+ { "linktest", { NULL }, 3746, "tcp" },
+ { "linktest", { NULL }, 3746, "udp" },
+ { "linktest-s", { NULL }, 3747, "tcp" },
+ { "linktest-s", { NULL }, 3747, "udp" },
+ { "webdata", { NULL }, 3748, "tcp" },
+ { "webdata", { NULL }, 3748, "udp" },
+ { "cimtrak", { NULL }, 3749, "tcp" },
+ { "cimtrak", { NULL }, 3749, "udp" },
+ { "cbos-ip-port", { NULL }, 3750, "tcp" },
+ { "cbos-ip-port", { NULL }, 3750, "udp" },
+ { "gprs-cube", { NULL }, 3751, "tcp" },
+ { "gprs-cube", { NULL }, 3751, "udp" },
+ { "vipremoteagent", { NULL }, 3752, "tcp" },
+ { "vipremoteagent", { NULL }, 3752, "udp" },
+ { "nattyserver", { NULL }, 3753, "tcp" },
+ { "nattyserver", { NULL }, 3753, "udp" },
+ { "timestenbroker", { NULL }, 3754, "tcp" },
+ { "timestenbroker", { NULL }, 3754, "udp" },
+ { "sas-remote-hlp", { NULL }, 3755, "tcp" },
+ { "sas-remote-hlp", { NULL }, 3755, "udp" },
+ { "canon-capt", { NULL }, 3756, "tcp" },
+ { "canon-capt", { NULL }, 3756, "udp" },
+ { "grf-port", { NULL }, 3757, "tcp" },
+ { "grf-port", { NULL }, 3757, "udp" },
+ { "apw-registry", { NULL }, 3758, "tcp" },
+ { "apw-registry", { NULL }, 3758, "udp" },
+ { "exapt-lmgr", { NULL }, 3759, "tcp" },
+ { "exapt-lmgr", { NULL }, 3759, "udp" },
+ { "adtempusclient", { NULL }, 3760, "tcp" },
+ { "adtempusclient", { NULL }, 3760, "udp" },
+ { "gsakmp", { NULL }, 3761, "tcp" },
+ { "gsakmp", { NULL }, 3761, "udp" },
+ { "gbs-smp", { NULL }, 3762, "tcp" },
+ { "gbs-smp", { NULL }, 3762, "udp" },
+ { "xo-wave", { NULL }, 3763, "tcp" },
+ { "xo-wave", { NULL }, 3763, "udp" },
+ { "mni-prot-rout", { NULL }, 3764, "tcp" },
+ { "mni-prot-rout", { NULL }, 3764, "udp" },
+ { "rtraceroute", { NULL }, 3765, "tcp" },
+ { "rtraceroute", { NULL }, 3765, "udp" },
+ { "listmgr-port", { NULL }, 3767, "tcp" },
+ { "listmgr-port", { NULL }, 3767, "udp" },
+ { "rblcheckd", { NULL }, 3768, "tcp" },
+ { "rblcheckd", { NULL }, 3768, "udp" },
+ { "haipe-otnk", { NULL }, 3769, "tcp" },
+ { "haipe-otnk", { NULL }, 3769, "udp" },
+ { "cindycollab", { NULL }, 3770, "tcp" },
+ { "cindycollab", { NULL }, 3770, "udp" },
+ { "paging-port", { NULL }, 3771, "tcp" },
+ { "paging-port", { NULL }, 3771, "udp" },
+ { "ctp", { NULL }, 3772, "tcp" },
+ { "ctp", { NULL }, 3772, "udp" },
+ { "ctdhercules", { NULL }, 3773, "tcp" },
+ { "ctdhercules", { NULL }, 3773, "udp" },
+ { "zicom", { NULL }, 3774, "tcp" },
+ { "zicom", { NULL }, 3774, "udp" },
+ { "ispmmgr", { NULL }, 3775, "tcp" },
+ { "ispmmgr", { NULL }, 3775, "udp" },
+ { "dvcprov-port", { NULL }, 3776, "tcp" },
+ { "dvcprov-port", { NULL }, 3776, "udp" },
+ { "jibe-eb", { NULL }, 3777, "tcp" },
+ { "jibe-eb", { NULL }, 3777, "udp" },
+ { "c-h-it-port", { NULL }, 3778, "tcp" },
+ { "c-h-it-port", { NULL }, 3778, "udp" },
+ { "cognima", { NULL }, 3779, "tcp" },
+ { "cognima", { NULL }, 3779, "udp" },
+ { "nnp", { NULL }, 3780, "tcp" },
+ { "nnp", { NULL }, 3780, "udp" },
+ { "abcvoice-port", { NULL }, 3781, "tcp" },
+ { "abcvoice-port", { NULL }, 3781, "udp" },
+ { "iso-tp0s", { NULL }, 3782, "tcp" },
+ { "iso-tp0s", { NULL }, 3782, "udp" },
+ { "bim-pem", { NULL }, 3783, "tcp" },
+ { "bim-pem", { NULL }, 3783, "udp" },
+ { "bfd-control", { NULL }, 3784, "tcp" },
+ { "bfd-control", { NULL }, 3784, "udp" },
+ { "bfd-echo", { NULL }, 3785, "tcp" },
+ { "bfd-echo", { NULL }, 3785, "udp" },
+ { "upstriggervsw", { NULL }, 3786, "tcp" },
+ { "upstriggervsw", { NULL }, 3786, "udp" },
+ { "fintrx", { NULL }, 3787, "tcp" },
+ { "fintrx", { NULL }, 3787, "udp" },
+ { "isrp-port", { NULL }, 3788, "tcp" },
+ { "isrp-port", { NULL }, 3788, "udp" },
+ { "remotedeploy", { NULL }, 3789, "tcp" },
+ { "remotedeploy", { NULL }, 3789, "udp" },
+ { "quickbooksrds", { NULL }, 3790, "tcp" },
+ { "quickbooksrds", { NULL }, 3790, "udp" },
+ { "tvnetworkvideo", { NULL }, 3791, "tcp" },
+ { "tvnetworkvideo", { NULL }, 3791, "udp" },
+ { "sitewatch", { NULL }, 3792, "tcp" },
+ { "sitewatch", { NULL }, 3792, "udp" },
+ { "dcsoftware", { NULL }, 3793, "tcp" },
+ { "dcsoftware", { NULL }, 3793, "udp" },
+ { "jaus", { NULL }, 3794, "tcp" },
+ { "jaus", { NULL }, 3794, "udp" },
+ { "myblast", { NULL }, 3795, "tcp" },
+ { "myblast", { NULL }, 3795, "udp" },
+ { "spw-dialer", { NULL }, 3796, "tcp" },
+ { "spw-dialer", { NULL }, 3796, "udp" },
+ { "idps", { NULL }, 3797, "tcp" },
+ { "idps", { NULL }, 3797, "udp" },
+ { "minilock", { NULL }, 3798, "tcp" },
+ { "minilock", { NULL }, 3798, "udp" },
+ { "radius-dynauth", { NULL }, 3799, "tcp" },
+ { "radius-dynauth", { NULL }, 3799, "udp" },
+ { "pwgpsi", { NULL }, 3800, "tcp" },
+ { "pwgpsi", { NULL }, 3800, "udp" },
+ { "ibm-mgr", { NULL }, 3801, "tcp" },
+ { "ibm-mgr", { NULL }, 3801, "udp" },
+ { "vhd", { NULL }, 3802, "tcp" },
+ { "vhd", { NULL }, 3802, "udp" },
+ { "soniqsync", { NULL }, 3803, "tcp" },
+ { "soniqsync", { NULL }, 3803, "udp" },
+ { "iqnet-port", { NULL }, 3804, "tcp" },
+ { "iqnet-port", { NULL }, 3804, "udp" },
+ { "tcpdataserver", { NULL }, 3805, "tcp" },
+ { "tcpdataserver", { NULL }, 3805, "udp" },
+ { "wsmlb", { NULL }, 3806, "tcp" },
+ { "wsmlb", { NULL }, 3806, "udp" },
+ { "spugna", { NULL }, 3807, "tcp" },
+ { "spugna", { NULL }, 3807, "udp" },
+ { "sun-as-iiops-ca", { NULL }, 3808, "tcp" },
+ { "sun-as-iiops-ca", { NULL }, 3808, "udp" },
+ { "apocd", { NULL }, 3809, "tcp" },
+ { "apocd", { NULL }, 3809, "udp" },
+ { "wlanauth", { NULL }, 3810, "tcp" },
+ { "wlanauth", { NULL }, 3810, "udp" },
+ { "amp", { NULL }, 3811, "tcp" },
+ { "amp", { NULL }, 3811, "udp" },
+ { "neto-wol-server", { NULL }, 3812, "tcp" },
+ { "neto-wol-server", { NULL }, 3812, "udp" },
+ { "rap-ip", { NULL }, 3813, "tcp" },
+ { "rap-ip", { NULL }, 3813, "udp" },
+ { "neto-dcs", { NULL }, 3814, "tcp" },
+ { "neto-dcs", { NULL }, 3814, "udp" },
+ { "lansurveyorxml", { NULL }, 3815, "tcp" },
+ { "lansurveyorxml", { NULL }, 3815, "udp" },
+ { "sunlps-http", { NULL }, 3816, "tcp" },
+ { "sunlps-http", { NULL }, 3816, "udp" },
+ { "tapeware", { NULL }, 3817, "tcp" },
+ { "tapeware", { NULL }, 3817, "udp" },
+ { "crinis-hb", { NULL }, 3818, "tcp" },
+ { "crinis-hb", { NULL }, 3818, "udp" },
+ { "epl-slp", { NULL }, 3819, "tcp" },
+ { "epl-slp", { NULL }, 3819, "udp" },
+ { "scp", { NULL }, 3820, "tcp" },
+ { "scp", { NULL }, 3820, "udp" },
+ { "pmcp", { NULL }, 3821, "tcp" },
+ { "pmcp", { NULL }, 3821, "udp" },
+ { "acp-discovery", { NULL }, 3822, "tcp" },
+ { "acp-discovery", { NULL }, 3822, "udp" },
+ { "acp-conduit", { NULL }, 3823, "tcp" },
+ { "acp-conduit", { NULL }, 3823, "udp" },
+ { "acp-policy", { NULL }, 3824, "tcp" },
+ { "acp-policy", { NULL }, 3824, "udp" },
+ { "ffserver", { NULL }, 3825, "tcp" },
+ { "ffserver", { NULL }, 3825, "udp" },
+ { "wormux", { NULL }, 3826, "tcp" },
+ { "wormux", { NULL }, 3826, "udp" },
+ { "netmpi", { NULL }, 3827, "tcp" },
+ { "netmpi", { NULL }, 3827, "udp" },
+ { "neteh", { NULL }, 3828, "tcp" },
+ { "neteh", { NULL }, 3828, "udp" },
+ { "neteh-ext", { NULL }, 3829, "tcp" },
+ { "neteh-ext", { NULL }, 3829, "udp" },
+ { "cernsysmgmtagt", { NULL }, 3830, "tcp" },
+ { "cernsysmgmtagt", { NULL }, 3830, "udp" },
+ { "dvapps", { NULL }, 3831, "tcp" },
+ { "dvapps", { NULL }, 3831, "udp" },
+ { "xxnetserver", { NULL }, 3832, "tcp" },
+ { "xxnetserver", { NULL }, 3832, "udp" },
+ { "aipn-auth", { NULL }, 3833, "tcp" },
+ { "aipn-auth", { NULL }, 3833, "udp" },
+ { "spectardata", { NULL }, 3834, "tcp" },
+ { "spectardata", { NULL }, 3834, "udp" },
+ { "spectardb", { NULL }, 3835, "tcp" },
+ { "spectardb", { NULL }, 3835, "udp" },
+ { "markem-dcp", { NULL }, 3836, "tcp" },
+ { "markem-dcp", { NULL }, 3836, "udp" },
+ { "mkm-discovery", { NULL }, 3837, "tcp" },
+ { "mkm-discovery", { NULL }, 3837, "udp" },
+ { "sos", { NULL }, 3838, "tcp" },
+ { "sos", { NULL }, 3838, "udp" },
+ { "amx-rms", { NULL }, 3839, "tcp" },
+ { "amx-rms", { NULL }, 3839, "udp" },
+ { "flirtmitmir", { NULL }, 3840, "tcp" },
+ { "flirtmitmir", { NULL }, 3840, "udp" },
+ { "zfirm-shiprush3", { NULL }, 3841, "tcp" },
+ { "zfirm-shiprush3", { NULL }, 3841, "udp" },
+ { "nhci", { NULL }, 3842, "tcp" },
+ { "nhci", { NULL }, 3842, "udp" },
+ { "quest-agent", { NULL }, 3843, "tcp" },
+ { "quest-agent", { NULL }, 3843, "udp" },
+ { "rnm", { NULL }, 3844, "tcp" },
+ { "rnm", { NULL }, 3844, "udp" },
+ { "v-one-spp", { NULL }, 3845, "tcp" },
+ { "v-one-spp", { NULL }, 3845, "udp" },
+ { "an-pcp", { NULL }, 3846, "tcp" },
+ { "an-pcp", { NULL }, 3846, "udp" },
+ { "msfw-control", { NULL }, 3847, "tcp" },
+ { "msfw-control", { NULL }, 3847, "udp" },
+ { "item", { NULL }, 3848, "tcp" },
+ { "item", { NULL }, 3848, "udp" },
+ { "spw-dnspreload", { NULL }, 3849, "tcp" },
+ { "spw-dnspreload", { NULL }, 3849, "udp" },
+ { "qtms-bootstrap", { NULL }, 3850, "tcp" },
+ { "qtms-bootstrap", { NULL }, 3850, "udp" },
+ { "spectraport", { NULL }, 3851, "tcp" },
+ { "spectraport", { NULL }, 3851, "udp" },
+ { "sse-app-config", { NULL }, 3852, "tcp" },
+ { "sse-app-config", { NULL }, 3852, "udp" },
+ { "sscan", { NULL }, 3853, "tcp" },
+ { "sscan", { NULL }, 3853, "udp" },
+ { "stryker-com", { NULL }, 3854, "tcp" },
+ { "stryker-com", { NULL }, 3854, "udp" },
+ { "opentrac", { NULL }, 3855, "tcp" },
+ { "opentrac", { NULL }, 3855, "udp" },
+ { "informer", { NULL }, 3856, "tcp" },
+ { "informer", { NULL }, 3856, "udp" },
+ { "trap-port", { NULL }, 3857, "tcp" },
+ { "trap-port", { NULL }, 3857, "udp" },
+ { "trap-port-mom", { NULL }, 3858, "tcp" },
+ { "trap-port-mom", { NULL }, 3858, "udp" },
+ { "nav-port", { NULL }, 3859, "tcp" },
+ { "nav-port", { NULL }, 3859, "udp" },
+ { "sasp", { NULL }, 3860, "tcp" },
+ { "sasp", { NULL }, 3860, "udp" },
+ { "winshadow-hd", { NULL }, 3861, "tcp" },
+ { "winshadow-hd", { NULL }, 3861, "udp" },
+ { "giga-pocket", { NULL }, 3862, "tcp" },
+ { "giga-pocket", { NULL }, 3862, "udp" },
+ { "asap-tcp", { NULL }, 3863, "tcp" },
+ { "asap-udp", { NULL }, 3863, "udp" },
+ { "asap-sctp", { NULL }, 3863, "sctp"},
+ { "asap-tcp-tls", { NULL }, 3864, "tcp" },
+ { "asap-sctp-tls", { NULL }, 3864, "sctp"},
+ { "xpl", { NULL }, 3865, "tcp" },
+ { "xpl", { NULL }, 3865, "udp" },
+ { "dzdaemon", { NULL }, 3866, "tcp" },
+ { "dzdaemon", { NULL }, 3866, "udp" },
+ { "dzoglserver", { NULL }, 3867, "tcp" },
+ { "dzoglserver", { NULL }, 3867, "udp" },
+ { "diameter", { NULL }, 3868, "tcp" },
+ { "diameter", { NULL }, 3868, "sctp"},
+ { "ovsam-mgmt", { NULL }, 3869, "tcp" },
+ { "ovsam-mgmt", { NULL }, 3869, "udp" },
+ { "ovsam-d-agent", { NULL }, 3870, "tcp" },
+ { "ovsam-d-agent", { NULL }, 3870, "udp" },
+ { "avocent-adsap", { NULL }, 3871, "tcp" },
+ { "avocent-adsap", { NULL }, 3871, "udp" },
+ { "oem-agent", { NULL }, 3872, "tcp" },
+ { "oem-agent", { NULL }, 3872, "udp" },
+ { "fagordnc", { NULL }, 3873, "tcp" },
+ { "fagordnc", { NULL }, 3873, "udp" },
+ { "sixxsconfig", { NULL }, 3874, "tcp" },
+ { "sixxsconfig", { NULL }, 3874, "udp" },
+ { "pnbscada", { NULL }, 3875, "tcp" },
+ { "pnbscada", { NULL }, 3875, "udp" },
+ { "dl_agent", { NULL }, 3876, "tcp" },
+ { "dl_agent", { NULL }, 3876, "udp" },
+ { "xmpcr-interface", { NULL }, 3877, "tcp" },
+ { "xmpcr-interface", { NULL }, 3877, "udp" },
+ { "fotogcad", { NULL }, 3878, "tcp" },
+ { "fotogcad", { NULL }, 3878, "udp" },
+ { "appss-lm", { NULL }, 3879, "tcp" },
+ { "appss-lm", { NULL }, 3879, "udp" },
+ { "igrs", { NULL }, 3880, "tcp" },
+ { "igrs", { NULL }, 3880, "udp" },
+ { "idac", { NULL }, 3881, "tcp" },
+ { "idac", { NULL }, 3881, "udp" },
+ { "msdts1", { NULL }, 3882, "tcp" },
+ { "msdts1", { NULL }, 3882, "udp" },
+ { "vrpn", { NULL }, 3883, "tcp" },
+ { "vrpn", { NULL }, 3883, "udp" },
+ { "softrack-meter", { NULL }, 3884, "tcp" },
+ { "softrack-meter", { NULL }, 3884, "udp" },
+ { "topflow-ssl", { NULL }, 3885, "tcp" },
+ { "topflow-ssl", { NULL }, 3885, "udp" },
+ { "nei-management", { NULL }, 3886, "tcp" },
+ { "nei-management", { NULL }, 3886, "udp" },
+ { "ciphire-data", { NULL }, 3887, "tcp" },
+ { "ciphire-data", { NULL }, 3887, "udp" },
+ { "ciphire-serv", { NULL }, 3888, "tcp" },
+ { "ciphire-serv", { NULL }, 3888, "udp" },
+ { "dandv-tester", { NULL }, 3889, "tcp" },
+ { "dandv-tester", { NULL }, 3889, "udp" },
+ { "ndsconnect", { NULL }, 3890, "tcp" },
+ { "ndsconnect", { NULL }, 3890, "udp" },
+ { "rtc-pm-port", { NULL }, 3891, "tcp" },
+ { "rtc-pm-port", { NULL }, 3891, "udp" },
+ { "pcc-image-port", { NULL }, 3892, "tcp" },
+ { "pcc-image-port", { NULL }, 3892, "udp" },
+ { "cgi-starapi", { NULL }, 3893, "tcp" },
+ { "cgi-starapi", { NULL }, 3893, "udp" },
+ { "syam-agent", { NULL }, 3894, "tcp" },
+ { "syam-agent", { NULL }, 3894, "udp" },
+ { "syam-smc", { NULL }, 3895, "tcp" },
+ { "syam-smc", { NULL }, 3895, "udp" },
+ { "sdo-tls", { NULL }, 3896, "tcp" },
+ { "sdo-tls", { NULL }, 3896, "udp" },
+ { "sdo-ssh", { NULL }, 3897, "tcp" },
+ { "sdo-ssh", { NULL }, 3897, "udp" },
+ { "senip", { NULL }, 3898, "tcp" },
+ { "senip", { NULL }, 3898, "udp" },
+ { "itv-control", { NULL }, 3899, "tcp" },
+ { "itv-control", { NULL }, 3899, "udp" },
+ { "udt_os", { NULL }, 3900, "tcp" },
+ { "udt_os", { NULL }, 3900, "udp" },
+ { "nimsh", { NULL }, 3901, "tcp" },
+ { "nimsh", { NULL }, 3901, "udp" },
+ { "nimaux", { NULL }, 3902, "tcp" },
+ { "nimaux", { NULL }, 3902, "udp" },
+ { "charsetmgr", { NULL }, 3903, "tcp" },
+ { "charsetmgr", { NULL }, 3903, "udp" },
+ { "omnilink-port", { NULL }, 3904, "tcp" },
+ { "omnilink-port", { NULL }, 3904, "udp" },
+ { "mupdate", { NULL }, 3905, "tcp" },
+ { "mupdate", { NULL }, 3905, "udp" },
+ { "topovista-data", { NULL }, 3906, "tcp" },
+ { "topovista-data", { NULL }, 3906, "udp" },
+ { "imoguia-port", { NULL }, 3907, "tcp" },
+ { "imoguia-port", { NULL }, 3907, "udp" },
+ { "hppronetman", { NULL }, 3908, "tcp" },
+ { "hppronetman", { NULL }, 3908, "udp" },
+ { "surfcontrolcpa", { NULL }, 3909, "tcp" },
+ { "surfcontrolcpa", { NULL }, 3909, "udp" },
+ { "prnrequest", { NULL }, 3910, "tcp" },
+ { "prnrequest", { NULL }, 3910, "udp" },
+ { "prnstatus", { NULL }, 3911, "tcp" },
+ { "prnstatus", { NULL }, 3911, "udp" },
+ { "gbmt-stars", { NULL }, 3912, "tcp" },
+ { "gbmt-stars", { NULL }, 3912, "udp" },
+ { "listcrt-port", { NULL }, 3913, "tcp" },
+ { "listcrt-port", { NULL }, 3913, "udp" },
+ { "listcrt-port-2", { NULL }, 3914, "tcp" },
+ { "listcrt-port-2", { NULL }, 3914, "udp" },
+ { "agcat", { NULL }, 3915, "tcp" },
+ { "agcat", { NULL }, 3915, "udp" },
+ { "wysdmc", { NULL }, 3916, "tcp" },
+ { "wysdmc", { NULL }, 3916, "udp" },
+ { "aftmux", { NULL }, 3917, "tcp" },
+ { "aftmux", { NULL }, 3917, "udp" },
+ { "pktcablemmcops", { NULL }, 3918, "tcp" },
+ { "pktcablemmcops", { NULL }, 3918, "udp" },
+ { "hyperip", { NULL }, 3919, "tcp" },
+ { "hyperip", { NULL }, 3919, "udp" },
+ { "exasoftport1", { NULL }, 3920, "tcp" },
+ { "exasoftport1", { NULL }, 3920, "udp" },
+ { "herodotus-net", { NULL }, 3921, "tcp" },
+ { "herodotus-net", { NULL }, 3921, "udp" },
+ { "sor-update", { NULL }, 3922, "tcp" },
+ { "sor-update", { NULL }, 3922, "udp" },
+ { "symb-sb-port", { NULL }, 3923, "tcp" },
+ { "symb-sb-port", { NULL }, 3923, "udp" },
+ { "mpl-gprs-port", { NULL }, 3924, "tcp" },
+ { "mpl-gprs-port", { NULL }, 3924, "udp" },
+ { "zmp", { NULL }, 3925, "tcp" },
+ { "zmp", { NULL }, 3925, "udp" },
+ { "winport", { NULL }, 3926, "tcp" },
+ { "winport", { NULL }, 3926, "udp" },
+ { "natdataservice", { NULL }, 3927, "tcp" },
+ { "natdataservice", { NULL }, 3927, "udp" },
+ { "netboot-pxe", { NULL }, 3928, "tcp" },
+ { "netboot-pxe", { NULL }, 3928, "udp" },
+ { "smauth-port", { NULL }, 3929, "tcp" },
+ { "smauth-port", { NULL }, 3929, "udp" },
+ { "syam-webserver", { NULL }, 3930, "tcp" },
+ { "syam-webserver", { NULL }, 3930, "udp" },
+ { "msr-plugin-port", { NULL }, 3931, "tcp" },
+ { "msr-plugin-port", { NULL }, 3931, "udp" },
+ { "dyn-site", { NULL }, 3932, "tcp" },
+ { "dyn-site", { NULL }, 3932, "udp" },
+ { "plbserve-port", { NULL }, 3933, "tcp" },
+ { "plbserve-port", { NULL }, 3933, "udp" },
+ { "sunfm-port", { NULL }, 3934, "tcp" },
+ { "sunfm-port", { NULL }, 3934, "udp" },
+ { "sdp-portmapper", { NULL }, 3935, "tcp" },
+ { "sdp-portmapper", { NULL }, 3935, "udp" },
+ { "mailprox", { NULL }, 3936, "tcp" },
+ { "mailprox", { NULL }, 3936, "udp" },
+ { "dvbservdsc", { NULL }, 3937, "tcp" },
+ { "dvbservdsc", { NULL }, 3937, "udp" },
+ { "dbcontrol_agent", { NULL }, 3938, "tcp" },
+ { "dbcontrol_agent", { NULL }, 3938, "udp" },
+ { "aamp", { NULL }, 3939, "tcp" },
+ { "aamp", { NULL }, 3939, "udp" },
+ { "xecp-node", { NULL }, 3940, "tcp" },
+ { "xecp-node", { NULL }, 3940, "udp" },
+ { "homeportal-web", { NULL }, 3941, "tcp" },
+ { "homeportal-web", { NULL }, 3941, "udp" },
+ { "srdp", { NULL }, 3942, "tcp" },
+ { "srdp", { NULL }, 3942, "udp" },
+ { "tig", { NULL }, 3943, "tcp" },
+ { "tig", { NULL }, 3943, "udp" },
+ { "sops", { NULL }, 3944, "tcp" },
+ { "sops", { NULL }, 3944, "udp" },
+ { "emcads", { NULL }, 3945, "tcp" },
+ { "emcads", { NULL }, 3945, "udp" },
+ { "backupedge", { NULL }, 3946, "tcp" },
+ { "backupedge", { NULL }, 3946, "udp" },
+ { "ccp", { NULL }, 3947, "tcp" },
+ { "ccp", { NULL }, 3947, "udp" },
+ { "apdap", { NULL }, 3948, "tcp" },
+ { "apdap", { NULL }, 3948, "udp" },
+ { "drip", { NULL }, 3949, "tcp" },
+ { "drip", { NULL }, 3949, "udp" },
+ { "namemunge", { NULL }, 3950, "tcp" },
+ { "namemunge", { NULL }, 3950, "udp" },
+ { "pwgippfax", { NULL }, 3951, "tcp" },
+ { "pwgippfax", { NULL }, 3951, "udp" },
+ { "i3-sessionmgr", { NULL }, 3952, "tcp" },
+ { "i3-sessionmgr", { NULL }, 3952, "udp" },
+ { "xmlink-connect", { NULL }, 3953, "tcp" },
+ { "xmlink-connect", { NULL }, 3953, "udp" },
+ { "adrep", { NULL }, 3954, "tcp" },
+ { "adrep", { NULL }, 3954, "udp" },
+ { "p2pcommunity", { NULL }, 3955, "tcp" },
+ { "p2pcommunity", { NULL }, 3955, "udp" },
+ { "gvcp", { NULL }, 3956, "tcp" },
+ { "gvcp", { NULL }, 3956, "udp" },
+ { "mqe-broker", { NULL }, 3957, "tcp" },
+ { "mqe-broker", { NULL }, 3957, "udp" },
+ { "mqe-agent", { NULL }, 3958, "tcp" },
+ { "mqe-agent", { NULL }, 3958, "udp" },
+ { "treehopper", { NULL }, 3959, "tcp" },
+ { "treehopper", { NULL }, 3959, "udp" },
+ { "bess", { NULL }, 3960, "tcp" },
+ { "bess", { NULL }, 3960, "udp" },
+ { "proaxess", { NULL }, 3961, "tcp" },
+ { "proaxess", { NULL }, 3961, "udp" },
+ { "sbi-agent", { NULL }, 3962, "tcp" },
+ { "sbi-agent", { NULL }, 3962, "udp" },
+ { "thrp", { NULL }, 3963, "tcp" },
+ { "thrp", { NULL }, 3963, "udp" },
+ { "sasggprs", { NULL }, 3964, "tcp" },
+ { "sasggprs", { NULL }, 3964, "udp" },
+ { "ati-ip-to-ncpe", { NULL }, 3965, "tcp" },
+ { "ati-ip-to-ncpe", { NULL }, 3965, "udp" },
+ { "bflckmgr", { NULL }, 3966, "tcp" },
+ { "bflckmgr", { NULL }, 3966, "udp" },
+ { "ppsms", { NULL }, 3967, "tcp" },
+ { "ppsms", { NULL }, 3967, "udp" },
+ { "ianywhere-dbns", { NULL }, 3968, "tcp" },
+ { "ianywhere-dbns", { NULL }, 3968, "udp" },
+ { "landmarks", { NULL }, 3969, "tcp" },
+ { "landmarks", { NULL }, 3969, "udp" },
+ { "lanrevagent", { NULL }, 3970, "tcp" },
+ { "lanrevagent", { NULL }, 3970, "udp" },
+ { "lanrevserver", { NULL }, 3971, "tcp" },
+ { "lanrevserver", { NULL }, 3971, "udp" },
+ { "iconp", { NULL }, 3972, "tcp" },
+ { "iconp", { NULL }, 3972, "udp" },
+ { "progistics", { NULL }, 3973, "tcp" },
+ { "progistics", { NULL }, 3973, "udp" },
+ { "citysearch", { NULL }, 3974, "tcp" },
+ { "citysearch", { NULL }, 3974, "udp" },
+ { "airshot", { NULL }, 3975, "tcp" },
+ { "airshot", { NULL }, 3975, "udp" },
+ { "opswagent", { NULL }, 3976, "tcp" },
+ { "opswagent", { NULL }, 3976, "udp" },
+ { "opswmanager", { NULL }, 3977, "tcp" },
+ { "opswmanager", { NULL }, 3977, "udp" },
+ { "secure-cfg-svr", { NULL }, 3978, "tcp" },
+ { "secure-cfg-svr", { NULL }, 3978, "udp" },
+ { "smwan", { NULL }, 3979, "tcp" },
+ { "smwan", { NULL }, 3979, "udp" },
+ { "acms", { NULL }, 3980, "tcp" },
+ { "acms", { NULL }, 3980, "udp" },
+ { "starfish", { NULL }, 3981, "tcp" },
+ { "starfish", { NULL }, 3981, "udp" },
+ { "eis", { NULL }, 3982, "tcp" },
+ { "eis", { NULL }, 3982, "udp" },
+ { "eisp", { NULL }, 3983, "tcp" },
+ { "eisp", { NULL }, 3983, "udp" },
+ { "mapper-nodemgr", { NULL }, 3984, "tcp" },
+ { "mapper-nodemgr", { NULL }, 3984, "udp" },
+ { "mapper-mapethd", { NULL }, 3985, "tcp" },
+ { "mapper-mapethd", { NULL }, 3985, "udp" },
+ { "mapper-ws_ethd", { NULL }, 3986, "tcp" },
+ { "mapper-ws_ethd", { NULL }, 3986, "udp" },
+ { "centerline", { NULL }, 3987, "tcp" },
+ { "centerline", { NULL }, 3987, "udp" },
+ { "dcs-config", { NULL }, 3988, "tcp" },
+ { "dcs-config", { NULL }, 3988, "udp" },
+ { "bv-queryengine", { NULL }, 3989, "tcp" },
+ { "bv-queryengine", { NULL }, 3989, "udp" },
+ { "bv-is", { NULL }, 3990, "tcp" },
+ { "bv-is", { NULL }, 3990, "udp" },
+ { "bv-smcsrv", { NULL }, 3991, "tcp" },
+ { "bv-smcsrv", { NULL }, 3991, "udp" },
+ { "bv-ds", { NULL }, 3992, "tcp" },
+ { "bv-ds", { NULL }, 3992, "udp" },
+ { "bv-agent", { NULL }, 3993, "tcp" },
+ { "bv-agent", { NULL }, 3993, "udp" },
+ { "iss-mgmt-ssl", { NULL }, 3995, "tcp" },
+ { "iss-mgmt-ssl", { NULL }, 3995, "udp" },
+ { "abcsoftware", { NULL }, 3996, "tcp" },
+ { "abcsoftware", { NULL }, 3996, "udp" },
+ { "agentsease-db", { NULL }, 3997, "tcp" },
+ { "agentsease-db", { NULL }, 3997, "udp" },
+ { "dnx", { NULL }, 3998, "tcp" },
+ { "dnx", { NULL }, 3998, "udp" },
+ { "nvcnet", { NULL }, 3999, "tcp" },
+ { "nvcnet", { NULL }, 3999, "udp" },
+ { "terabase", { NULL }, 4000, "tcp" },
+ { "terabase", { NULL }, 4000, "udp" },
+ { "newoak", { NULL }, 4001, "tcp" },
+ { "newoak", { NULL }, 4001, "udp" },
+ { "pxc-spvr-ft", { NULL }, 4002, "tcp" },
+ { "pxc-spvr-ft", { NULL }, 4002, "udp" },
+ { "pxc-splr-ft", { NULL }, 4003, "tcp" },
+ { "pxc-splr-ft", { NULL }, 4003, "udp" },
+ { "pxc-roid", { NULL }, 4004, "tcp" },
+ { "pxc-roid", { NULL }, 4004, "udp" },
+ { "pxc-pin", { NULL }, 4005, "tcp" },
+ { "pxc-pin", { NULL }, 4005, "udp" },
+ { "pxc-spvr", { NULL }, 4006, "tcp" },
+ { "pxc-spvr", { NULL }, 4006, "udp" },
+ { "pxc-splr", { NULL }, 4007, "tcp" },
+ { "pxc-splr", { NULL }, 4007, "udp" },
+ { "netcheque", { NULL }, 4008, "tcp" },
+ { "netcheque", { NULL }, 4008, "udp" },
+ { "chimera-hwm", { NULL }, 4009, "tcp" },
+ { "chimera-hwm", { NULL }, 4009, "udp" },
+ { "samsung-unidex", { NULL }, 4010, "tcp" },
+ { "samsung-unidex", { NULL }, 4010, "udp" },
+ { "altserviceboot", { NULL }, 4011, "tcp" },
+ { "altserviceboot", { NULL }, 4011, "udp" },
+ { "pda-gate", { NULL }, 4012, "tcp" },
+ { "pda-gate", { NULL }, 4012, "udp" },
+ { "acl-manager", { NULL }, 4013, "tcp" },
+ { "acl-manager", { NULL }, 4013, "udp" },
+ { "taiclock", { NULL }, 4014, "tcp" },
+ { "taiclock", { NULL }, 4014, "udp" },
+ { "talarian-mcast1", { NULL }, 4015, "tcp" },
+ { "talarian-mcast1", { NULL }, 4015, "udp" },
+ { "talarian-mcast2", { NULL }, 4016, "tcp" },
+ { "talarian-mcast2", { NULL }, 4016, "udp" },
+ { "talarian-mcast3", { NULL }, 4017, "tcp" },
+ { "talarian-mcast3", { NULL }, 4017, "udp" },
+ { "talarian-mcast4", { NULL }, 4018, "tcp" },
+ { "talarian-mcast4", { NULL }, 4018, "udp" },
+ { "talarian-mcast5", { NULL }, 4019, "tcp" },
+ { "talarian-mcast5", { NULL }, 4019, "udp" },
+ { "trap", { NULL }, 4020, "tcp" },
+ { "trap", { NULL }, 4020, "udp" },
+ { "nexus-portal", { NULL }, 4021, "tcp" },
+ { "nexus-portal", { NULL }, 4021, "udp" },
+ { "dnox", { NULL }, 4022, "tcp" },
+ { "dnox", { NULL }, 4022, "udp" },
+ { "esnm-zoning", { NULL }, 4023, "tcp" },
+ { "esnm-zoning", { NULL }, 4023, "udp" },
+ { "tnp1-port", { NULL }, 4024, "tcp" },
+ { "tnp1-port", { NULL }, 4024, "udp" },
+ { "partimage", { NULL }, 4025, "tcp" },
+ { "partimage", { NULL }, 4025, "udp" },
+ { "as-debug", { NULL }, 4026, "tcp" },
+ { "as-debug", { NULL }, 4026, "udp" },
+ { "bxp", { NULL }, 4027, "tcp" },
+ { "bxp", { NULL }, 4027, "udp" },
+ { "dtserver-port", { NULL }, 4028, "tcp" },
+ { "dtserver-port", { NULL }, 4028, "udp" },
+ { "ip-qsig", { NULL }, 4029, "tcp" },
+ { "ip-qsig", { NULL }, 4029, "udp" },
+ { "jdmn-port", { NULL }, 4030, "tcp" },
+ { "jdmn-port", { NULL }, 4030, "udp" },
+ { "suucp", { NULL }, 4031, "tcp" },
+ { "suucp", { NULL }, 4031, "udp" },
+ { "vrts-auth-port", { NULL }, 4032, "tcp" },
+ { "vrts-auth-port", { NULL }, 4032, "udp" },
+ { "sanavigator", { NULL }, 4033, "tcp" },
+ { "sanavigator", { NULL }, 4033, "udp" },
+ { "ubxd", { NULL }, 4034, "tcp" },
+ { "ubxd", { NULL }, 4034, "udp" },
+ { "wap-push-http", { NULL }, 4035, "tcp" },
+ { "wap-push-http", { NULL }, 4035, "udp" },
+ { "wap-push-https", { NULL }, 4036, "tcp" },
+ { "wap-push-https", { NULL }, 4036, "udp" },
+ { "ravehd", { NULL }, 4037, "tcp" },
+ { "ravehd", { NULL }, 4037, "udp" },
+ { "fazzt-ptp", { NULL }, 4038, "tcp" },
+ { "fazzt-ptp", { NULL }, 4038, "udp" },
+ { "fazzt-admin", { NULL }, 4039, "tcp" },
+ { "fazzt-admin", { NULL }, 4039, "udp" },
+ { "yo-main", { NULL }, 4040, "tcp" },
+ { "yo-main", { NULL }, 4040, "udp" },
+ { "houston", { NULL }, 4041, "tcp" },
+ { "houston", { NULL }, 4041, "udp" },
+ { "ldxp", { NULL }, 4042, "tcp" },
+ { "ldxp", { NULL }, 4042, "udp" },
+ { "nirp", { NULL }, 4043, "tcp" },
+ { "nirp", { NULL }, 4043, "udp" },
+ { "ltp", { NULL }, 4044, "tcp" },
+ { "ltp", { NULL }, 4044, "udp" },
+ { "npp", { NULL }, 4045, "tcp" },
+ { "npp", { NULL }, 4045, "udp" },
+ { "acp-proto", { NULL }, 4046, "tcp" },
+ { "acp-proto", { NULL }, 4046, "udp" },
+ { "ctp-state", { NULL }, 4047, "tcp" },
+ { "ctp-state", { NULL }, 4047, "udp" },
+ { "wafs", { NULL }, 4049, "tcp" },
+ { "wafs", { NULL }, 4049, "udp" },
+ { "cisco-wafs", { NULL }, 4050, "tcp" },
+ { "cisco-wafs", { NULL }, 4050, "udp" },
+ { "cppdp", { NULL }, 4051, "tcp" },
+ { "cppdp", { NULL }, 4051, "udp" },
+ { "interact", { NULL }, 4052, "tcp" },
+ { "interact", { NULL }, 4052, "udp" },
+ { "ccu-comm-1", { NULL }, 4053, "tcp" },
+ { "ccu-comm-1", { NULL }, 4053, "udp" },
+ { "ccu-comm-2", { NULL }, 4054, "tcp" },
+ { "ccu-comm-2", { NULL }, 4054, "udp" },
+ { "ccu-comm-3", { NULL }, 4055, "tcp" },
+ { "ccu-comm-3", { NULL }, 4055, "udp" },
+ { "lms", { NULL }, 4056, "tcp" },
+ { "lms", { NULL }, 4056, "udp" },
+ { "wfm", { NULL }, 4057, "tcp" },
+ { "wfm", { NULL }, 4057, "udp" },
+ { "kingfisher", { NULL }, 4058, "tcp" },
+ { "kingfisher", { NULL }, 4058, "udp" },
+ { "dlms-cosem", { NULL }, 4059, "tcp" },
+ { "dlms-cosem", { NULL }, 4059, "udp" },
+ { "dsmeter_iatc", { NULL }, 4060, "tcp" },
+ { "dsmeter_iatc", { NULL }, 4060, "udp" },
+ { "ice-location", { NULL }, 4061, "tcp" },
+ { "ice-location", { NULL }, 4061, "udp" },
+ { "ice-slocation", { NULL }, 4062, "tcp" },
+ { "ice-slocation", { NULL }, 4062, "udp" },
+ { "ice-router", { NULL }, 4063, "tcp" },
+ { "ice-router", { NULL }, 4063, "udp" },
+ { "ice-srouter", { NULL }, 4064, "tcp" },
+ { "ice-srouter", { NULL }, 4064, "udp" },
+ { "avanti_cdp", { NULL }, 4065, "tcp" },
+ { "avanti_cdp", { NULL }, 4065, "udp" },
+ { "pmas", { NULL }, 4066, "tcp" },
+ { "pmas", { NULL }, 4066, "udp" },
+ { "idp", { NULL }, 4067, "tcp" },
+ { "idp", { NULL }, 4067, "udp" },
+ { "ipfltbcst", { NULL }, 4068, "tcp" },
+ { "ipfltbcst", { NULL }, 4068, "udp" },
+ { "minger", { NULL }, 4069, "tcp" },
+ { "minger", { NULL }, 4069, "udp" },
+ { "tripe", { NULL }, 4070, "tcp" },
+ { "tripe", { NULL }, 4070, "udp" },
+ { "aibkup", { NULL }, 4071, "tcp" },
+ { "aibkup", { NULL }, 4071, "udp" },
+ { "zieto-sock", { NULL }, 4072, "tcp" },
+ { "zieto-sock", { NULL }, 4072, "udp" },
+ { "iRAPP", { NULL }, 4073, "tcp" },
+ { "iRAPP", { NULL }, 4073, "udp" },
+ { "cequint-cityid", { NULL }, 4074, "tcp" },
+ { "cequint-cityid", { NULL }, 4074, "udp" },
+ { "perimlan", { NULL }, 4075, "tcp" },
+ { "perimlan", { NULL }, 4075, "udp" },
+ { "seraph", { NULL }, 4076, "tcp" },
+ { "seraph", { NULL }, 4076, "udp" },
+ { "ascomalarm", { NULL }, 4077, "udp" },
+ { "cssp", { NULL }, 4078, "tcp" },
+ { "santools", { NULL }, 4079, "tcp" },
+ { "santools", { NULL }, 4079, "udp" },
+ { "lorica-in", { NULL }, 4080, "tcp" },
+ { "lorica-in", { NULL }, 4080, "udp" },
+ { "lorica-in-sec", { NULL }, 4081, "tcp" },
+ { "lorica-in-sec", { NULL }, 4081, "udp" },
+ { "lorica-out", { NULL }, 4082, "tcp" },
+ { "lorica-out", { NULL }, 4082, "udp" },
+ { "lorica-out-sec", { NULL }, 4083, "tcp" },
+ { "lorica-out-sec", { NULL }, 4083, "udp" },
+ { "fortisphere-vm", { NULL }, 4084, "udp" },
+ { "ezmessagesrv", { NULL }, 4085, "tcp" },
+ { "ftsync", { NULL }, 4086, "udp" },
+ { "applusservice", { NULL }, 4087, "tcp" },
+ { "npsp", { NULL }, 4088, "tcp" },
+ { "opencore", { NULL }, 4089, "tcp" },
+ { "opencore", { NULL }, 4089, "udp" },
+ { "omasgport", { NULL }, 4090, "tcp" },
+ { "omasgport", { NULL }, 4090, "udp" },
+ { "ewinstaller", { NULL }, 4091, "tcp" },
+ { "ewinstaller", { NULL }, 4091, "udp" },
+ { "ewdgs", { NULL }, 4092, "tcp" },
+ { "ewdgs", { NULL }, 4092, "udp" },
+ { "pvxpluscs", { NULL }, 4093, "tcp" },
+ { "pvxpluscs", { NULL }, 4093, "udp" },
+ { "sysrqd", { NULL }, 4094, "tcp" },
+ { "sysrqd", { NULL }, 4094, "udp" },
+ { "xtgui", { NULL }, 4095, "tcp" },
+ { "xtgui", { NULL }, 4095, "udp" },
+ { "bre", { NULL }, 4096, "tcp" },
+ { "bre", { NULL }, 4096, "udp" },
+ { "patrolview", { NULL }, 4097, "tcp" },
+ { "patrolview", { NULL }, 4097, "udp" },
+ { "drmsfsd", { NULL }, 4098, "tcp" },
+ { "drmsfsd", { NULL }, 4098, "udp" },
+ { "dpcp", { NULL }, 4099, "tcp" },
+ { "dpcp", { NULL }, 4099, "udp" },
+ { "igo-incognito", { NULL }, 4100, "tcp" },
+ { "igo-incognito", { NULL }, 4100, "udp" },
+ { "brlp-0", { NULL }, 4101, "tcp" },
+ { "brlp-0", { NULL }, 4101, "udp" },
+ { "brlp-1", { NULL }, 4102, "tcp" },
+ { "brlp-1", { NULL }, 4102, "udp" },
+ { "brlp-2", { NULL }, 4103, "tcp" },
+ { "brlp-2", { NULL }, 4103, "udp" },
+ { "brlp-3", { NULL }, 4104, "tcp" },
+ { "brlp-3", { NULL }, 4104, "udp" },
+ { "shofarplayer", { NULL }, 4105, "tcp" },
+ { "shofarplayer", { NULL }, 4105, "udp" },
+ { "synchronite", { NULL }, 4106, "tcp" },
+ { "synchronite", { NULL }, 4106, "udp" },
+ { "j-ac", { NULL }, 4107, "tcp" },
+ { "j-ac", { NULL }, 4107, "udp" },
+ { "accel", { NULL }, 4108, "tcp" },
+ { "accel", { NULL }, 4108, "udp" },
+ { "izm", { NULL }, 4109, "tcp" },
+ { "izm", { NULL }, 4109, "udp" },
+ { "g2tag", { NULL }, 4110, "tcp" },
+ { "g2tag", { NULL }, 4110, "udp" },
+ { "xgrid", { NULL }, 4111, "tcp" },
+ { "xgrid", { NULL }, 4111, "udp" },
+ { "apple-vpns-rp", { NULL }, 4112, "tcp" },
+ { "apple-vpns-rp", { NULL }, 4112, "udp" },
+ { "aipn-reg", { NULL }, 4113, "tcp" },
+ { "aipn-reg", { NULL }, 4113, "udp" },
+ { "jomamqmonitor", { NULL }, 4114, "tcp" },
+ { "jomamqmonitor", { NULL }, 4114, "udp" },
+ { "cds", { NULL }, 4115, "tcp" },
+ { "cds", { NULL }, 4115, "udp" },
+ { "smartcard-tls", { NULL }, 4116, "tcp" },
+ { "smartcard-tls", { NULL }, 4116, "udp" },
+ { "hillrserv", { NULL }, 4117, "tcp" },
+ { "hillrserv", { NULL }, 4117, "udp" },
+ { "netscript", { NULL }, 4118, "tcp" },
+ { "netscript", { NULL }, 4118, "udp" },
+ { "assuria-slm", { NULL }, 4119, "tcp" },
+ { "assuria-slm", { NULL }, 4119, "udp" },
+ { "e-builder", { NULL }, 4121, "tcp" },
+ { "e-builder", { NULL }, 4121, "udp" },
+ { "fprams", { NULL }, 4122, "tcp" },
+ { "fprams", { NULL }, 4122, "udp" },
+ { "z-wave", { NULL }, 4123, "tcp" },
+ { "z-wave", { NULL }, 4123, "udp" },
+ { "tigv2", { NULL }, 4124, "tcp" },
+ { "tigv2", { NULL }, 4124, "udp" },
+ { "opsview-envoy", { NULL }, 4125, "tcp" },
+ { "opsview-envoy", { NULL }, 4125, "udp" },
+ { "ddrepl", { NULL }, 4126, "tcp" },
+ { "ddrepl", { NULL }, 4126, "udp" },
+ { "unikeypro", { NULL }, 4127, "tcp" },
+ { "unikeypro", { NULL }, 4127, "udp" },
+ { "nufw", { NULL }, 4128, "tcp" },
+ { "nufw", { NULL }, 4128, "udp" },
+ { "nuauth", { NULL }, 4129, "tcp" },
+ { "nuauth", { NULL }, 4129, "udp" },
+ { "fronet", { NULL }, 4130, "tcp" },
+ { "fronet", { NULL }, 4130, "udp" },
+ { "stars", { NULL }, 4131, "tcp" },
+ { "stars", { NULL }, 4131, "udp" },
+ { "nuts_dem", { NULL }, 4132, "tcp" },
+ { "nuts_dem", { NULL }, 4132, "udp" },
+ { "nuts_bootp", { NULL }, 4133, "tcp" },
+ { "nuts_bootp", { NULL }, 4133, "udp" },
+ { "nifty-hmi", { NULL }, 4134, "tcp" },
+ { "nifty-hmi", { NULL }, 4134, "udp" },
+ { "cl-db-attach", { NULL }, 4135, "tcp" },
+ { "cl-db-attach", { NULL }, 4135, "udp" },
+ { "cl-db-request", { NULL }, 4136, "tcp" },
+ { "cl-db-request", { NULL }, 4136, "udp" },
+ { "cl-db-remote", { NULL }, 4137, "tcp" },
+ { "cl-db-remote", { NULL }, 4137, "udp" },
+ { "nettest", { NULL }, 4138, "tcp" },
+ { "nettest", { NULL }, 4138, "udp" },
+ { "thrtx", { NULL }, 4139, "tcp" },
+ { "thrtx", { NULL }, 4139, "udp" },
+ { "cedros_fds", { NULL }, 4140, "tcp" },
+ { "cedros_fds", { NULL }, 4140, "udp" },
+ { "oirtgsvc", { NULL }, 4141, "tcp" },
+ { "oirtgsvc", { NULL }, 4141, "udp" },
+ { "oidocsvc", { NULL }, 4142, "tcp" },
+ { "oidocsvc", { NULL }, 4142, "udp" },
+ { "oidsr", { NULL }, 4143, "tcp" },
+ { "oidsr", { NULL }, 4143, "udp" },
+ { "vvr-control", { NULL }, 4145, "tcp" },
+ { "vvr-control", { NULL }, 4145, "udp" },
+ { "tgcconnect", { NULL }, 4146, "tcp" },
+ { "tgcconnect", { NULL }, 4146, "udp" },
+ { "vrxpservman", { NULL }, 4147, "tcp" },
+ { "vrxpservman", { NULL }, 4147, "udp" },
+ { "hhb-handheld", { NULL }, 4148, "tcp" },
+ { "hhb-handheld", { NULL }, 4148, "udp" },
+ { "agslb", { NULL }, 4149, "tcp" },
+ { "agslb", { NULL }, 4149, "udp" },
+ { "PowerAlert-nsa", { NULL }, 4150, "tcp" },
+ { "PowerAlert-nsa", { NULL }, 4150, "udp" },
+ { "menandmice_noh", { NULL }, 4151, "tcp" },
+ { "menandmice_noh", { NULL }, 4151, "udp" },
+ { "idig_mux", { NULL }, 4152, "tcp" },
+ { "idig_mux", { NULL }, 4152, "udp" },
+ { "mbl-battd", { NULL }, 4153, "tcp" },
+ { "mbl-battd", { NULL }, 4153, "udp" },
+ { "atlinks", { NULL }, 4154, "tcp" },
+ { "atlinks", { NULL }, 4154, "udp" },
+ { "bzr", { NULL }, 4155, "tcp" },
+ { "bzr", { NULL }, 4155, "udp" },
+ { "stat-results", { NULL }, 4156, "tcp" },
+ { "stat-results", { NULL }, 4156, "udp" },
+ { "stat-scanner", { NULL }, 4157, "tcp" },
+ { "stat-scanner", { NULL }, 4157, "udp" },
+ { "stat-cc", { NULL }, 4158, "tcp" },
+ { "stat-cc", { NULL }, 4158, "udp" },
+ { "nss", { NULL }, 4159, "tcp" },
+ { "nss", { NULL }, 4159, "udp" },
+ { "jini-discovery", { NULL }, 4160, "tcp" },
+ { "jini-discovery", { NULL }, 4160, "udp" },
+ { "omscontact", { NULL }, 4161, "tcp" },
+ { "omscontact", { NULL }, 4161, "udp" },
+ { "omstopology", { NULL }, 4162, "tcp" },
+ { "omstopology", { NULL }, 4162, "udp" },
+ { "silverpeakpeer", { NULL }, 4163, "tcp" },
+ { "silverpeakpeer", { NULL }, 4163, "udp" },
+ { "silverpeakcomm", { NULL }, 4164, "tcp" },
+ { "silverpeakcomm", { NULL }, 4164, "udp" },
+ { "altcp", { NULL }, 4165, "tcp" },
+ { "altcp", { NULL }, 4165, "udp" },
+ { "joost", { NULL }, 4166, "tcp" },
+ { "joost", { NULL }, 4166, "udp" },
+ { "ddgn", { NULL }, 4167, "tcp" },
+ { "ddgn", { NULL }, 4167, "udp" },
+ { "pslicser", { NULL }, 4168, "tcp" },
+ { "pslicser", { NULL }, 4168, "udp" },
+ { "iadt", { NULL }, 4169, "tcp" },
+ { "iadt-disc", { NULL }, 4169, "udp" },
+ { "d-cinema-csp", { NULL }, 4170, "tcp" },
+ { "ml-svnet", { NULL }, 4171, "tcp" },
+ { "pcoip", { NULL }, 4172, "tcp" },
+ { "pcoip", { NULL }, 4172, "udp" },
+ { "smcluster", { NULL }, 4174, "tcp" },
+ { "bccp", { NULL }, 4175, "tcp" },
+ { "tl-ipcproxy", { NULL }, 4176, "tcp" },
+ { "wello", { NULL }, 4177, "tcp" },
+ { "wello", { NULL }, 4177, "udp" },
+ { "storman", { NULL }, 4178, "tcp" },
+ { "storman", { NULL }, 4178, "udp" },
+ { "MaxumSP", { NULL }, 4179, "tcp" },
+ { "MaxumSP", { NULL }, 4179, "udp" },
+ { "httpx", { NULL }, 4180, "tcp" },
+ { "httpx", { NULL }, 4180, "udp" },
+ { "macbak", { NULL }, 4181, "tcp" },
+ { "macbak", { NULL }, 4181, "udp" },
+ { "pcptcpservice", { NULL }, 4182, "tcp" },
+ { "pcptcpservice", { NULL }, 4182, "udp" },
+ { "gmmp", { NULL }, 4183, "tcp" },
+ { "gmmp", { NULL }, 4183, "udp" },
+ { "universe_suite", { NULL }, 4184, "tcp" },
+ { "universe_suite", { NULL }, 4184, "udp" },
+ { "wcpp", { NULL }, 4185, "tcp" },
+ { "wcpp", { NULL }, 4185, "udp" },
+ { "boxbackupstore", { NULL }, 4186, "tcp" },
+ { "csc_proxy", { NULL }, 4187, "tcp" },
+ { "vatata", { NULL }, 4188, "tcp" },
+ { "vatata", { NULL }, 4188, "udp" },
+ { "pcep", { NULL }, 4189, "tcp" },
+ { "sieve", { NULL }, 4190, "tcp" },
+ { "dsmipv6", { NULL }, 4191, "udp" },
+ { "azeti", { NULL }, 4192, "tcp" },
+ { "azeti-bd", { NULL }, 4192, "udp" },
+ { "pvxplusio", { NULL }, 4193, "tcp" },
+ { "eims-admin", { NULL }, 4199, "tcp" },
+ { "eims-admin", { NULL }, 4199, "udp" },
+ { "corelccam", { NULL }, 4300, "tcp" },
+ { "corelccam", { NULL }, 4300, "udp" },
+ { "d-data", { NULL }, 4301, "tcp" },
+ { "d-data", { NULL }, 4301, "udp" },
+ { "d-data-control", { NULL }, 4302, "tcp" },
+ { "d-data-control", { NULL }, 4302, "udp" },
+ { "srcp", { NULL }, 4303, "tcp" },
+ { "srcp", { NULL }, 4303, "udp" },
+ { "owserver", { NULL }, 4304, "tcp" },
+ { "owserver", { NULL }, 4304, "udp" },
+ { "batman", { NULL }, 4305, "tcp" },
+ { "batman", { NULL }, 4305, "udp" },
+ { "pinghgl", { NULL }, 4306, "tcp" },
+ { "pinghgl", { NULL }, 4306, "udp" },
+ { "visicron-vs", { NULL }, 4307, "tcp" },
+ { "visicron-vs", { NULL }, 4307, "udp" },
+ { "compx-lockview", { NULL }, 4308, "tcp" },
+ { "compx-lockview", { NULL }, 4308, "udp" },
+ { "dserver", { NULL }, 4309, "tcp" },
+ { "dserver", { NULL }, 4309, "udp" },
+ { "mirrtex", { NULL }, 4310, "tcp" },
+ { "mirrtex", { NULL }, 4310, "udp" },
+ { "p6ssmc", { NULL }, 4311, "tcp" },
+ { "pscl-mgt", { NULL }, 4312, "tcp" },
+ { "perrla", { NULL }, 4313, "tcp" },
+ { "fdt-rcatp", { NULL }, 4320, "tcp" },
+ { "fdt-rcatp", { NULL }, 4320, "udp" },
+ { "rwhois", { NULL }, 4321, "tcp" },
+ { "rwhois", { NULL }, 4321, "udp" },
+ { "trim-event", { NULL }, 4322, "tcp" },
+ { "trim-event", { NULL }, 4322, "udp" },
+ { "trim-ice", { NULL }, 4323, "tcp" },
+ { "trim-ice", { NULL }, 4323, "udp" },
+ { "balour", { NULL }, 4324, "tcp" },
+ { "balour", { NULL }, 4324, "udp" },
+ { "geognosisman", { NULL }, 4325, "tcp" },
+ { "geognosisman", { NULL }, 4325, "udp" },
+ { "geognosis", { NULL }, 4326, "tcp" },
+ { "geognosis", { NULL }, 4326, "udp" },
+ { "jaxer-web", { NULL }, 4327, "tcp" },
+ { "jaxer-web", { NULL }, 4327, "udp" },
+ { "jaxer-manager", { NULL }, 4328, "tcp" },
+ { "jaxer-manager", { NULL }, 4328, "udp" },
+ { "publiqare-sync", { NULL }, 4329, "tcp" },
+ { "gaia", { NULL }, 4340, "tcp" },
+ { "gaia", { NULL }, 4340, "udp" },
+ { "lisp-data", { NULL }, 4341, "tcp" },
+ { "lisp-data", { NULL }, 4341, "udp" },
+ { "lisp-cons", { NULL }, 4342, "tcp" },
+ { "lisp-control", { NULL }, 4342, "udp" },
+ { "unicall", { NULL }, 4343, "tcp" },
+ { "unicall", { NULL }, 4343, "udp" },
+ { "vinainstall", { NULL }, 4344, "tcp" },
+ { "vinainstall", { NULL }, 4344, "udp" },
+ { "m4-network-as", { NULL }, 4345, "tcp" },
+ { "m4-network-as", { NULL }, 4345, "udp" },
+ { "elanlm", { NULL }, 4346, "tcp" },
+ { "elanlm", { NULL }, 4346, "udp" },
+ { "lansurveyor", { NULL }, 4347, "tcp" },
+ { "lansurveyor", { NULL }, 4347, "udp" },
+ { "itose", { NULL }, 4348, "tcp" },
+ { "itose", { NULL }, 4348, "udp" },
+ { "fsportmap", { NULL }, 4349, "tcp" },
+ { "fsportmap", { NULL }, 4349, "udp" },
+ { "net-device", { NULL }, 4350, "tcp" },
+ { "net-device", { NULL }, 4350, "udp" },
+ { "plcy-net-svcs", { NULL }, 4351, "tcp" },
+ { "plcy-net-svcs", { NULL }, 4351, "udp" },
+ { "pjlink", { NULL }, 4352, "tcp" },
+ { "pjlink", { NULL }, 4352, "udp" },
+ { "f5-iquery", { NULL }, 4353, "tcp" },
+ { "f5-iquery", { NULL }, 4353, "udp" },
+ { "qsnet-trans", { NULL }, 4354, "tcp" },
+ { "qsnet-trans", { NULL }, 4354, "udp" },
+ { "qsnet-workst", { NULL }, 4355, "tcp" },
+ { "qsnet-workst", { NULL }, 4355, "udp" },
+ { "qsnet-assist", { NULL }, 4356, "tcp" },
+ { "qsnet-assist", { NULL }, 4356, "udp" },
+ { "qsnet-cond", { NULL }, 4357, "tcp" },
+ { "qsnet-cond", { NULL }, 4357, "udp" },
+ { "qsnet-nucl", { NULL }, 4358, "tcp" },
+ { "qsnet-nucl", { NULL }, 4358, "udp" },
+ { "omabcastltkm", { NULL }, 4359, "tcp" },
+ { "omabcastltkm", { NULL }, 4359, "udp" },
+ { "matrix_vnet", { NULL }, 4360, "tcp" },
+ { "nacnl", { NULL }, 4361, "udp" },
+ { "afore-vdp-disc", { NULL }, 4362, "udp" },
+ { "wxbrief", { NULL }, 4368, "tcp" },
+ { "wxbrief", { NULL }, 4368, "udp" },
+ { "epmd", { NULL }, 4369, "tcp" },
+ { "epmd", { NULL }, 4369, "udp" },
+ { "elpro_tunnel", { NULL }, 4370, "tcp" },
+ { "elpro_tunnel", { NULL }, 4370, "udp" },
+ { "l2c-control", { NULL }, 4371, "tcp" },
+ { "l2c-disc", { NULL }, 4371, "udp" },
+ { "l2c-data", { NULL }, 4372, "tcp" },
+ { "l2c-data", { NULL }, 4372, "udp" },
+ { "remctl", { NULL }, 4373, "tcp" },
+ { "remctl", { NULL }, 4373, "udp" },
+ { "psi-ptt", { NULL }, 4374, "tcp" },
+ { "tolteces", { NULL }, 4375, "tcp" },
+ { "tolteces", { NULL }, 4375, "udp" },
+ { "bip", { NULL }, 4376, "tcp" },
+ { "bip", { NULL }, 4376, "udp" },
+ { "cp-spxsvr", { NULL }, 4377, "tcp" },
+ { "cp-spxsvr", { NULL }, 4377, "udp" },
+ { "cp-spxdpy", { NULL }, 4378, "tcp" },
+ { "cp-spxdpy", { NULL }, 4378, "udp" },
+ { "ctdb", { NULL }, 4379, "tcp" },
+ { "ctdb", { NULL }, 4379, "udp" },
+ { "xandros-cms", { NULL }, 4389, "tcp" },
+ { "xandros-cms", { NULL }, 4389, "udp" },
+ { "wiegand", { NULL }, 4390, "tcp" },
+ { "wiegand", { NULL }, 4390, "udp" },
+ { "apwi-imserver", { NULL }, 4391, "tcp" },
+ { "apwi-rxserver", { NULL }, 4392, "tcp" },
+ { "apwi-rxspooler", { NULL }, 4393, "tcp" },
+ { "apwi-disc", { NULL }, 4394, "udp" },
+ { "omnivisionesx", { NULL }, 4395, "tcp" },
+ { "omnivisionesx", { NULL }, 4395, "udp" },
+ { "fly", { NULL }, 4396, "tcp" },
+ { "ds-srv", { NULL }, 4400, "tcp" },
+ { "ds-srv", { NULL }, 4400, "udp" },
+ { "ds-srvr", { NULL }, 4401, "tcp" },
+ { "ds-srvr", { NULL }, 4401, "udp" },
+ { "ds-clnt", { NULL }, 4402, "tcp" },
+ { "ds-clnt", { NULL }, 4402, "udp" },
+ { "ds-user", { NULL }, 4403, "tcp" },
+ { "ds-user", { NULL }, 4403, "udp" },
+ { "ds-admin", { NULL }, 4404, "tcp" },
+ { "ds-admin", { NULL }, 4404, "udp" },
+ { "ds-mail", { NULL }, 4405, "tcp" },
+ { "ds-mail", { NULL }, 4405, "udp" },
+ { "ds-slp", { NULL }, 4406, "tcp" },
+ { "ds-slp", { NULL }, 4406, "udp" },
+ { "nacagent", { NULL }, 4407, "tcp" },
+ { "slscc", { NULL }, 4408, "tcp" },
+ { "netcabinet-com", { NULL }, 4409, "tcp" },
+ { "itwo-server", { NULL }, 4410, "tcp" },
+ { "netrockey6", { NULL }, 4425, "tcp" },
+ { "netrockey6", { NULL }, 4425, "udp" },
+ { "beacon-port-2", { NULL }, 4426, "tcp" },
+ { "beacon-port-2", { NULL }, 4426, "udp" },
+ { "drizzle", { NULL }, 4427, "tcp" },
+ { "omviserver", { NULL }, 4428, "tcp" },
+ { "omviagent", { NULL }, 4429, "tcp" },
+ { "rsqlserver", { NULL }, 4430, "tcp" },
+ { "rsqlserver", { NULL }, 4430, "udp" },
+ { "wspipe", { NULL }, 4431, "tcp" },
+ { "netblox", { NULL }, 4441, "udp" },
+ { "saris", { NULL }, 4442, "tcp" },
+ { "saris", { NULL }, 4442, "udp" },
+ { "pharos", { NULL }, 4443, "tcp" },
+ { "pharos", { NULL }, 4443, "udp" },
+ { "krb524", { NULL }, 4444, "tcp" },
+ { "krb524", { NULL }, 4444, "udp" },
+ { "nv-video", { NULL }, 4444, "tcp" },
+ { "nv-video", { NULL }, 4444, "udp" },
+ { "upnotifyp", { NULL }, 4445, "tcp" },
+ { "upnotifyp", { NULL }, 4445, "udp" },
+ { "n1-fwp", { NULL }, 4446, "tcp" },
+ { "n1-fwp", { NULL }, 4446, "udp" },
+ { "n1-rmgmt", { NULL }, 4447, "tcp" },
+ { "n1-rmgmt", { NULL }, 4447, "udp" },
+ { "asc-slmd", { NULL }, 4448, "tcp" },
+ { "asc-slmd", { NULL }, 4448, "udp" },
+ { "privatewire", { NULL }, 4449, "tcp" },
+ { "privatewire", { NULL }, 4449, "udp" },
+ { "camp", { NULL }, 4450, "tcp" },
+ { "camp", { NULL }, 4450, "udp" },
+ { "ctisystemmsg", { NULL }, 4451, "tcp" },
+ { "ctisystemmsg", { NULL }, 4451, "udp" },
+ { "ctiprogramload", { NULL }, 4452, "tcp" },
+ { "ctiprogramload", { NULL }, 4452, "udp" },
+ { "nssalertmgr", { NULL }, 4453, "tcp" },
+ { "nssalertmgr", { NULL }, 4453, "udp" },
+ { "nssagentmgr", { NULL }, 4454, "tcp" },
+ { "nssagentmgr", { NULL }, 4454, "udp" },
+ { "prchat-user", { NULL }, 4455, "tcp" },
+ { "prchat-user", { NULL }, 4455, "udp" },
+ { "prchat-server", { NULL }, 4456, "tcp" },
+ { "prchat-server", { NULL }, 4456, "udp" },
+ { "prRegister", { NULL }, 4457, "tcp" },
+ { "prRegister", { NULL }, 4457, "udp" },
+ { "mcp", { NULL }, 4458, "tcp" },
+ { "mcp", { NULL }, 4458, "udp" },
+ { "hpssmgmt", { NULL }, 4484, "tcp" },
+ { "hpssmgmt", { NULL }, 4484, "udp" },
+ { "assyst-dr", { NULL }, 4485, "tcp" },
+ { "icms", { NULL }, 4486, "tcp" },
+ { "icms", { NULL }, 4486, "udp" },
+ { "prex-tcp", { NULL }, 4487, "tcp" },
+ { "awacs-ice", { NULL }, 4488, "tcp" },
+ { "awacs-ice", { NULL }, 4488, "udp" },
+ { "ipsec-nat-t", { NULL }, 4500, "tcp" },
+ { "ipsec-nat-t", { NULL }, 4500, "udp" },
+ { "ehs", { NULL }, 4535, "tcp" },
+ { "ehs", { NULL }, 4535, "udp" },
+ { "ehs-ssl", { NULL }, 4536, "tcp" },
+ { "ehs-ssl", { NULL }, 4536, "udp" },
+ { "wssauthsvc", { NULL }, 4537, "tcp" },
+ { "wssauthsvc", { NULL }, 4537, "udp" },
+ { "swx-gate", { NULL }, 4538, "tcp" },
+ { "swx-gate", { NULL }, 4538, "udp" },
+ { "worldscores", { NULL }, 4545, "tcp" },
+ { "worldscores", { NULL }, 4545, "udp" },
+ { "sf-lm", { NULL }, 4546, "tcp" },
+ { "sf-lm", { NULL }, 4546, "udp" },
+ { "lanner-lm", { NULL }, 4547, "tcp" },
+ { "lanner-lm", { NULL }, 4547, "udp" },
+ { "synchromesh", { NULL }, 4548, "tcp" },
+ { "synchromesh", { NULL }, 4548, "udp" },
+ { "aegate", { NULL }, 4549, "tcp" },
+ { "aegate", { NULL }, 4549, "udp" },
+ { "gds-adppiw-db", { NULL }, 4550, "tcp" },
+ { "gds-adppiw-db", { NULL }, 4550, "udp" },
+ { "ieee-mih", { NULL }, 4551, "tcp" },
+ { "ieee-mih", { NULL }, 4551, "udp" },
+ { "menandmice-mon", { NULL }, 4552, "tcp" },
+ { "menandmice-mon", { NULL }, 4552, "udp" },
+ { "icshostsvc", { NULL }, 4553, "tcp" },
+ { "msfrs", { NULL }, 4554, "tcp" },
+ { "msfrs", { NULL }, 4554, "udp" },
+ { "rsip", { NULL }, 4555, "tcp" },
+ { "rsip", { NULL }, 4555, "udp" },
+ { "dtn-bundle-tcp", { NULL }, 4556, "tcp" },
+ { "dtn-bundle-udp", { NULL }, 4556, "udp" },
+ { "mtcevrunqss", { NULL }, 4557, "udp" },
+ { "mtcevrunqman", { NULL }, 4558, "udp" },
+ { "hylafax", { NULL }, 4559, "tcp" },
+ { "hylafax", { NULL }, 4559, "udp" },
+ { "kwtc", { NULL }, 4566, "tcp" },
+ { "kwtc", { NULL }, 4566, "udp" },
+ { "tram", { NULL }, 4567, "tcp" },
+ { "tram", { NULL }, 4567, "udp" },
+ { "bmc-reporting", { NULL }, 4568, "tcp" },
+ { "bmc-reporting", { NULL }, 4568, "udp" },
+ { "iax", { NULL }, 4569, "tcp" },
+ { "iax", { NULL }, 4569, "udp" },
+ { "rid", { NULL }, 4590, "tcp" },
+ { "l3t-at-an", { NULL }, 4591, "tcp" },
+ { "l3t-at-an", { NULL }, 4591, "udp" },
+ { "hrpd-ith-at-an", { NULL }, 4592, "udp" },
+ { "ipt-anri-anri", { NULL }, 4593, "tcp" },
+ { "ipt-anri-anri", { NULL }, 4593, "udp" },
+ { "ias-session", { NULL }, 4594, "tcp" },
+ { "ias-session", { NULL }, 4594, "udp" },
+ { "ias-paging", { NULL }, 4595, "tcp" },
+ { "ias-paging", { NULL }, 4595, "udp" },
+ { "ias-neighbor", { NULL }, 4596, "tcp" },
+ { "ias-neighbor", { NULL }, 4596, "udp" },
+ { "a21-an-1xbs", { NULL }, 4597, "tcp" },
+ { "a21-an-1xbs", { NULL }, 4597, "udp" },
+ { "a16-an-an", { NULL }, 4598, "tcp" },
+ { "a16-an-an", { NULL }, 4598, "udp" },
+ { "a17-an-an", { NULL }, 4599, "tcp" },
+ { "a17-an-an", { NULL }, 4599, "udp" },
+ { "piranha1", { NULL }, 4600, "tcp" },
+ { "piranha1", { NULL }, 4600, "udp" },
+ { "piranha2", { NULL }, 4601, "tcp" },
+ { "piranha2", { NULL }, 4601, "udp" },
+ { "mtsserver", { NULL }, 4602, "tcp" },
+ { "menandmice-upg", { NULL }, 4603, "tcp" },
+ { "playsta2-app", { NULL }, 4658, "tcp" },
+ { "playsta2-app", { NULL }, 4658, "udp" },
+ { "playsta2-lob", { NULL }, 4659, "tcp" },
+ { "playsta2-lob", { NULL }, 4659, "udp" },
+ { "smaclmgr", { NULL }, 4660, "tcp" },
+ { "smaclmgr", { NULL }, 4660, "udp" },
+ { "kar2ouche", { NULL }, 4661, "tcp" },
+ { "kar2ouche", { NULL }, 4661, "udp" },
+ { "oms", { NULL }, 4662, "tcp" },
+ { "oms", { NULL }, 4662, "udp" },
+ { "noteit", { NULL }, 4663, "tcp" },
+ { "noteit", { NULL }, 4663, "udp" },
+ { "ems", { NULL }, 4664, "tcp" },
+ { "ems", { NULL }, 4664, "udp" },
+ { "contclientms", { NULL }, 4665, "tcp" },
+ { "contclientms", { NULL }, 4665, "udp" },
+ { "eportcomm", { NULL }, 4666, "tcp" },
+ { "eportcomm", { NULL }, 4666, "udp" },
+ { "mmacomm", { NULL }, 4667, "tcp" },
+ { "mmacomm", { NULL }, 4667, "udp" },
+ { "mmaeds", { NULL }, 4668, "tcp" },
+ { "mmaeds", { NULL }, 4668, "udp" },
+ { "eportcommdata", { NULL }, 4669, "tcp" },
+ { "eportcommdata", { NULL }, 4669, "udp" },
+ { "light", { NULL }, 4670, "tcp" },
+ { "light", { NULL }, 4670, "udp" },
+ { "acter", { NULL }, 4671, "tcp" },
+ { "acter", { NULL }, 4671, "udp" },
+ { "rfa", { NULL }, 4672, "tcp" },
+ { "rfa", { NULL }, 4672, "udp" },
+ { "cxws", { NULL }, 4673, "tcp" },
+ { "cxws", { NULL }, 4673, "udp" },
+ { "appiq-mgmt", { NULL }, 4674, "tcp" },
+ { "appiq-mgmt", { NULL }, 4674, "udp" },
+ { "dhct-status", { NULL }, 4675, "tcp" },
+ { "dhct-status", { NULL }, 4675, "udp" },
+ { "dhct-alerts", { NULL }, 4676, "tcp" },
+ { "dhct-alerts", { NULL }, 4676, "udp" },
+ { "bcs", { NULL }, 4677, "tcp" },
+ { "bcs", { NULL }, 4677, "udp" },
+ { "traversal", { NULL }, 4678, "tcp" },
+ { "traversal", { NULL }, 4678, "udp" },
+ { "mgesupervision", { NULL }, 4679, "tcp" },
+ { "mgesupervision", { NULL }, 4679, "udp" },
+ { "mgemanagement", { NULL }, 4680, "tcp" },
+ { "mgemanagement", { NULL }, 4680, "udp" },
+ { "parliant", { NULL }, 4681, "tcp" },
+ { "parliant", { NULL }, 4681, "udp" },
+ { "finisar", { NULL }, 4682, "tcp" },
+ { "finisar", { NULL }, 4682, "udp" },
+ { "spike", { NULL }, 4683, "tcp" },
+ { "spike", { NULL }, 4683, "udp" },
+ { "rfid-rp1", { NULL }, 4684, "tcp" },
+ { "rfid-rp1", { NULL }, 4684, "udp" },
+ { "autopac", { NULL }, 4685, "tcp" },
+ { "autopac", { NULL }, 4685, "udp" },
+ { "msp-os", { NULL }, 4686, "tcp" },
+ { "msp-os", { NULL }, 4686, "udp" },
+ { "nst", { NULL }, 4687, "tcp" },
+ { "nst", { NULL }, 4687, "udp" },
+ { "mobile-p2p", { NULL }, 4688, "tcp" },
+ { "mobile-p2p", { NULL }, 4688, "udp" },
+ { "altovacentral", { NULL }, 4689, "tcp" },
+ { "altovacentral", { NULL }, 4689, "udp" },
+ { "prelude", { NULL }, 4690, "tcp" },
+ { "prelude", { NULL }, 4690, "udp" },
+ { "mtn", { NULL }, 4691, "tcp" },
+ { "mtn", { NULL }, 4691, "udp" },
+ { "conspiracy", { NULL }, 4692, "tcp" },
+ { "conspiracy", { NULL }, 4692, "udp" },
+ { "netxms-agent", { NULL }, 4700, "tcp" },
+ { "netxms-agent", { NULL }, 4700, "udp" },
+ { "netxms-mgmt", { NULL }, 4701, "tcp" },
+ { "netxms-mgmt", { NULL }, 4701, "udp" },
+ { "netxms-sync", { NULL }, 4702, "tcp" },
+ { "netxms-sync", { NULL }, 4702, "udp" },
+ { "npqes-test", { NULL }, 4703, "tcp" },
+ { "assuria-ins", { NULL }, 4704, "tcp" },
+ { "truckstar", { NULL }, 4725, "tcp" },
+ { "truckstar", { NULL }, 4725, "udp" },
+ { "a26-fap-fgw", { NULL }, 4726, "udp" },
+ { "fcis", { NULL }, 4727, "tcp" },
+ { "fcis-disc", { NULL }, 4727, "udp" },
+ { "capmux", { NULL }, 4728, "tcp" },
+ { "capmux", { NULL }, 4728, "udp" },
+ { "gsmtap", { NULL }, 4729, "udp" },
+ { "gearman", { NULL }, 4730, "tcp" },
+ { "gearman", { NULL }, 4730, "udp" },
+ { "remcap", { NULL }, 4731, "tcp" },
+ { "ohmtrigger", { NULL }, 4732, "udp" },
+ { "resorcs", { NULL }, 4733, "tcp" },
+ { "ipdr-sp", { NULL }, 4737, "tcp" },
+ { "ipdr-sp", { NULL }, 4737, "udp" },
+ { "solera-lpn", { NULL }, 4738, "tcp" },
+ { "solera-lpn", { NULL }, 4738, "udp" },
+ { "ipfix", { NULL }, 4739, "tcp" },
+ { "ipfix", { NULL }, 4739, "udp" },
+ { "ipfix", { NULL }, 4739, "sctp"},
+ { "ipfixs", { NULL }, 4740, "tcp" },
+ { "ipfixs", { NULL }, 4740, "sctp"},
+ { "ipfixs", { NULL }, 4740, "udp" },
+ { "lumimgrd", { NULL }, 4741, "tcp" },
+ { "lumimgrd", { NULL }, 4741, "udp" },
+ { "sicct", { NULL }, 4742, "tcp" },
+ { "sicct-sdp", { NULL }, 4742, "udp" },
+ { "openhpid", { NULL }, 4743, "tcp" },
+ { "openhpid", { NULL }, 4743, "udp" },
+ { "ifsp", { NULL }, 4744, "tcp" },
+ { "ifsp", { NULL }, 4744, "udp" },
+ { "fmp", { NULL }, 4745, "tcp" },
+ { "fmp", { NULL }, 4745, "udp" },
+ { "profilemac", { NULL }, 4749, "tcp" },
+ { "profilemac", { NULL }, 4749, "udp" },
+ { "ssad", { NULL }, 4750, "tcp" },
+ { "ssad", { NULL }, 4750, "udp" },
+ { "spocp", { NULL }, 4751, "tcp" },
+ { "spocp", { NULL }, 4751, "udp" },
+ { "snap", { NULL }, 4752, "tcp" },
+ { "snap", { NULL }, 4752, "udp" },
+ { "bfd-multi-ctl", { NULL }, 4784, "tcp" },
+ { "bfd-multi-ctl", { NULL }, 4784, "udp" },
+ { "cncp", { NULL }, 4785, "udp" },
+ { "smart-install", { NULL }, 4786, "tcp" },
+ { "sia-ctrl-plane", { NULL }, 4787, "tcp" },
+ { "iims", { NULL }, 4800, "tcp" },
+ { "iims", { NULL }, 4800, "udp" },
+ { "iwec", { NULL }, 4801, "tcp" },
+ { "iwec", { NULL }, 4801, "udp" },
+ { "ilss", { NULL }, 4802, "tcp" },
+ { "ilss", { NULL }, 4802, "udp" },
+ { "notateit", { NULL }, 4803, "tcp" },
+ { "notateit-disc", { NULL }, 4803, "udp" },
+ { "aja-ntv4-disc", { NULL }, 4804, "udp" },
+ { "htcp", { NULL }, 4827, "tcp" },
+ { "htcp", { NULL }, 4827, "udp" },
+ { "varadero-0", { NULL }, 4837, "tcp" },
+ { "varadero-0", { NULL }, 4837, "udp" },
+ { "varadero-1", { NULL }, 4838, "tcp" },
+ { "varadero-1", { NULL }, 4838, "udp" },
+ { "varadero-2", { NULL }, 4839, "tcp" },
+ { "varadero-2", { NULL }, 4839, "udp" },
+ { "opcua-tcp", { NULL }, 4840, "tcp" },
+ { "opcua-udp", { NULL }, 4840, "udp" },
+ { "quosa", { NULL }, 4841, "tcp" },
+ { "quosa", { NULL }, 4841, "udp" },
+ { "gw-asv", { NULL }, 4842, "tcp" },
+ { "gw-asv", { NULL }, 4842, "udp" },
+ { "opcua-tls", { NULL }, 4843, "tcp" },
+ { "opcua-tls", { NULL }, 4843, "udp" },
+ { "gw-log", { NULL }, 4844, "tcp" },
+ { "gw-log", { NULL }, 4844, "udp" },
+ { "wcr-remlib", { NULL }, 4845, "tcp" },
+ { "wcr-remlib", { NULL }, 4845, "udp" },
+ { "contamac_icm", { NULL }, 4846, "tcp" },
+ { "contamac_icm", { NULL }, 4846, "udp" },
+ { "wfc", { NULL }, 4847, "tcp" },
+ { "wfc", { NULL }, 4847, "udp" },
+ { "appserv-http", { NULL }, 4848, "tcp" },
+ { "appserv-http", { NULL }, 4848, "udp" },
+ { "appserv-https", { NULL }, 4849, "tcp" },
+ { "appserv-https", { NULL }, 4849, "udp" },
+ { "sun-as-nodeagt", { NULL }, 4850, "tcp" },
+ { "sun-as-nodeagt", { NULL }, 4850, "udp" },
+ { "derby-repli", { NULL }, 4851, "tcp" },
+ { "derby-repli", { NULL }, 4851, "udp" },
+ { "unify-debug", { NULL }, 4867, "tcp" },
+ { "unify-debug", { NULL }, 4867, "udp" },
+ { "phrelay", { NULL }, 4868, "tcp" },
+ { "phrelay", { NULL }, 4868, "udp" },
+ { "phrelaydbg", { NULL }, 4869, "tcp" },
+ { "phrelaydbg", { NULL }, 4869, "udp" },
+ { "cc-tracking", { NULL }, 4870, "tcp" },
+ { "cc-tracking", { NULL }, 4870, "udp" },
+ { "wired", { NULL }, 4871, "tcp" },
+ { "wired", { NULL }, 4871, "udp" },
+ { "tritium-can", { NULL }, 4876, "tcp" },
+ { "tritium-can", { NULL }, 4876, "udp" },
+ { "lmcs", { NULL }, 4877, "tcp" },
+ { "lmcs", { NULL }, 4877, "udp" },
+ { "inst-discovery", { NULL }, 4878, "udp" },
+ { "wsdl-event", { NULL }, 4879, "tcp" },
+ { "hislip", { NULL }, 4880, "tcp" },
+ { "socp-t", { NULL }, 4881, "udp" },
+ { "socp-c", { NULL }, 4882, "udp" },
+ { "wmlserver", { NULL }, 4883, "tcp" },
+ { "hivestor", { NULL }, 4884, "tcp" },
+ { "hivestor", { NULL }, 4884, "udp" },
+ { "abbs", { NULL }, 4885, "tcp" },
+ { "abbs", { NULL }, 4885, "udp" },
+ { "lyskom", { NULL }, 4894, "tcp" },
+ { "lyskom", { NULL }, 4894, "udp" },
+ { "radmin-port", { NULL }, 4899, "tcp" },
+ { "radmin-port", { NULL }, 4899, "udp" },
+ { "hfcs", { NULL }, 4900, "tcp" },
+ { "hfcs", { NULL }, 4900, "udp" },
+ { "flr_agent", { NULL }, 4901, "tcp" },
+ { "magiccontrol", { NULL }, 4902, "tcp" },
+ { "lutap", { NULL }, 4912, "tcp" },
+ { "lutcp", { NULL }, 4913, "tcp" },
+ { "bones", { NULL }, 4914, "tcp" },
+ { "bones", { NULL }, 4914, "udp" },
+ { "frcs", { NULL }, 4915, "tcp" },
+ { "atsc-mh-ssc", { NULL }, 4937, "udp" },
+ { "eq-office-4940", { NULL }, 4940, "tcp" },
+ { "eq-office-4940", { NULL }, 4940, "udp" },
+ { "eq-office-4941", { NULL }, 4941, "tcp" },
+ { "eq-office-4941", { NULL }, 4941, "udp" },
+ { "eq-office-4942", { NULL }, 4942, "tcp" },
+ { "eq-office-4942", { NULL }, 4942, "udp" },
+ { "munin", { NULL }, 4949, "tcp" },
+ { "munin", { NULL }, 4949, "udp" },
+ { "sybasesrvmon", { NULL }, 4950, "tcp" },
+ { "sybasesrvmon", { NULL }, 4950, "udp" },
+ { "pwgwims", { NULL }, 4951, "tcp" },
+ { "pwgwims", { NULL }, 4951, "udp" },
+ { "sagxtsds", { NULL }, 4952, "tcp" },
+ { "sagxtsds", { NULL }, 4952, "udp" },
+ { "dbsyncarbiter", { NULL }, 4953, "tcp" },
+ { "ccss-qmm", { NULL }, 4969, "tcp" },
+ { "ccss-qmm", { NULL }, 4969, "udp" },
+ { "ccss-qsm", { NULL }, 4970, "tcp" },
+ { "ccss-qsm", { NULL }, 4970, "udp" },
+ { "webyast", { NULL }, 4984, "tcp" },
+ { "gerhcs", { NULL }, 4985, "tcp" },
+ { "mrip", { NULL }, 4986, "tcp" },
+ { "mrip", { NULL }, 4986, "udp" },
+ { "smar-se-port1", { NULL }, 4987, "tcp" },
+ { "smar-se-port1", { NULL }, 4987, "udp" },
+ { "smar-se-port2", { NULL }, 4988, "tcp" },
+ { "smar-se-port2", { NULL }, 4988, "udp" },
+ { "parallel", { NULL }, 4989, "tcp" },
+ { "parallel", { NULL }, 4989, "udp" },
+ { "busycal", { NULL }, 4990, "tcp" },
+ { "busycal", { NULL }, 4990, "udp" },
+ { "vrt", { NULL }, 4991, "tcp" },
+ { "vrt", { NULL }, 4991, "udp" },
+ { "hfcs-manager", { NULL }, 4999, "tcp" },
+ { "hfcs-manager", { NULL }, 4999, "udp" },
+ { "commplex-main", { NULL }, 5000, "tcp" },
+ { "commplex-main", { NULL }, 5000, "udp" },
+ { "commplex-link", { NULL }, 5001, "tcp" },
+ { "commplex-link", { NULL }, 5001, "udp" },
+ { "rfe", { NULL }, 5002, "tcp" },
+ { "rfe", { NULL }, 5002, "udp" },
+ { "fmpro-internal", { NULL }, 5003, "tcp" },
+ { "fmpro-internal", { NULL }, 5003, "udp" },
+ { "avt-profile-1", { NULL }, 5004, "tcp" },
+ { "avt-profile-1", { NULL }, 5004, "udp" },
+ { "avt-profile-1", { NULL }, 5004, "dccp"},
+ { "avt-profile-2", { NULL }, 5005, "tcp" },
+ { "avt-profile-2", { NULL }, 5005, "udp" },
+ { "avt-profile-2", { NULL }, 5005, "dccp"},
+ { "wsm-server", { NULL }, 5006, "tcp" },
+ { "wsm-server", { NULL }, 5006, "udp" },
+ { "wsm-server-ssl", { NULL }, 5007, "tcp" },
+ { "wsm-server-ssl", { NULL }, 5007, "udp" },
+ { "synapsis-edge", { NULL }, 5008, "tcp" },
+ { "synapsis-edge", { NULL }, 5008, "udp" },
+ { "winfs", { NULL }, 5009, "tcp" },
+ { "winfs", { NULL }, 5009, "udp" },
+ { "telelpathstart", { NULL }, 5010, "tcp" },
+ { "telelpathstart", { NULL }, 5010, "udp" },
+ { "telelpathattack", { NULL }, 5011, "tcp" },
+ { "telelpathattack", { NULL }, 5011, "udp" },
+ { "nsp", { NULL }, 5012, "tcp" },
+ { "nsp", { NULL }, 5012, "udp" },
+ { "fmpro-v6", { NULL }, 5013, "tcp" },
+ { "fmpro-v6", { NULL }, 5013, "udp" },
+ { "onpsocket", { NULL }, 5014, "udp" },
+ { "fmwp", { NULL }, 5015, "tcp" },
+ { "zenginkyo-1", { NULL }, 5020, "tcp" },
+ { "zenginkyo-1", { NULL }, 5020, "udp" },
+ { "zenginkyo-2", { NULL }, 5021, "tcp" },
+ { "zenginkyo-2", { NULL }, 5021, "udp" },
+ { "mice", { NULL }, 5022, "tcp" },
+ { "mice", { NULL }, 5022, "udp" },
+ { "htuilsrv", { NULL }, 5023, "tcp" },
+ { "htuilsrv", { NULL }, 5023, "udp" },
+ { "scpi-telnet", { NULL }, 5024, "tcp" },
+ { "scpi-telnet", { NULL }, 5024, "udp" },
+ { "scpi-raw", { NULL }, 5025, "tcp" },
+ { "scpi-raw", { NULL }, 5025, "udp" },
+ { "strexec-d", { NULL }, 5026, "tcp" },
+ { "strexec-d", { NULL }, 5026, "udp" },
+ { "strexec-s", { NULL }, 5027, "tcp" },
+ { "strexec-s", { NULL }, 5027, "udp" },
+ { "qvr", { NULL }, 5028, "tcp" },
+ { "infobright", { NULL }, 5029, "tcp" },
+ { "infobright", { NULL }, 5029, "udp" },
+ { "surfpass", { NULL }, 5030, "tcp" },
+ { "surfpass", { NULL }, 5030, "udp" },
+ { "dmp", { NULL }, 5031, "udp" },
+ { "asnaacceler8db", { NULL }, 5042, "tcp" },
+ { "asnaacceler8db", { NULL }, 5042, "udp" },
+ { "swxadmin", { NULL }, 5043, "tcp" },
+ { "swxadmin", { NULL }, 5043, "udp" },
+ { "lxi-evntsvc", { NULL }, 5044, "tcp" },
+ { "lxi-evntsvc", { NULL }, 5044, "udp" },
+ { "osp", { NULL }, 5045, "tcp" },
+ { "vpm-udp", { NULL }, 5046, "udp" },
+ { "iscape", { NULL }, 5047, "udp" },
+ { "texai", { NULL }, 5048, "tcp" },
+ { "ivocalize", { NULL }, 5049, "tcp" },
+ { "ivocalize", { NULL }, 5049, "udp" },
+ { "mmcc", { NULL }, 5050, "tcp" },
+ { "mmcc", { NULL }, 5050, "udp" },
+ { "ita-agent", { NULL }, 5051, "tcp" },
+ { "ita-agent", { NULL }, 5051, "udp" },
+ { "ita-manager", { NULL }, 5052, "tcp" },
+ { "ita-manager", { NULL }, 5052, "udp" },
+ { "rlm", { NULL }, 5053, "tcp" },
+ { "rlm-admin", { NULL }, 5054, "tcp" },
+ { "unot", { NULL }, 5055, "tcp" },
+ { "unot", { NULL }, 5055, "udp" },
+ { "intecom-ps1", { NULL }, 5056, "tcp" },
+ { "intecom-ps1", { NULL }, 5056, "udp" },
+ { "intecom-ps2", { NULL }, 5057, "tcp" },
+ { "intecom-ps2", { NULL }, 5057, "udp" },
+ { "locus-disc", { NULL }, 5058, "udp" },
+ { "sds", { NULL }, 5059, "tcp" },
+ { "sds", { NULL }, 5059, "udp" },
+ { "sip", { NULL }, 5060, "tcp" },
+ { "sip", { NULL }, 5060, "udp" },
+ { "sip-tls", { NULL }, 5061, "tcp" },
+ { "sip-tls", { NULL }, 5061, "udp" },
+ { "na-localise", { NULL }, 5062, "tcp" },
+ { "na-localise", { NULL }, 5062, "udp" },
+ { "csrpc", { NULL }, 5063, "tcp" },
+ { "ca-1", { NULL }, 5064, "tcp" },
+ { "ca-1", { NULL }, 5064, "udp" },
+ { "ca-2", { NULL }, 5065, "tcp" },
+ { "ca-2", { NULL }, 5065, "udp" },
+ { "stanag-5066", { NULL }, 5066, "tcp" },
+ { "stanag-5066", { NULL }, 5066, "udp" },
+ { "authentx", { NULL }, 5067, "tcp" },
+ { "authentx", { NULL }, 5067, "udp" },
+ { "bitforestsrv", { NULL }, 5068, "tcp" },
+ { "i-net-2000-npr", { NULL }, 5069, "tcp" },
+ { "i-net-2000-npr", { NULL }, 5069, "udp" },
+ { "vtsas", { NULL }, 5070, "tcp" },
+ { "vtsas", { NULL }, 5070, "udp" },
+ { "powerschool", { NULL }, 5071, "tcp" },
+ { "powerschool", { NULL }, 5071, "udp" },
+ { "ayiya", { NULL }, 5072, "tcp" },
+ { "ayiya", { NULL }, 5072, "udp" },
+ { "tag-pm", { NULL }, 5073, "tcp" },
+ { "tag-pm", { NULL }, 5073, "udp" },
+ { "alesquery", { NULL }, 5074, "tcp" },
+ { "alesquery", { NULL }, 5074, "udp" },
+ { "cp-spxrpts", { NULL }, 5079, "udp" },
+ { "onscreen", { NULL }, 5080, "tcp" },
+ { "onscreen", { NULL }, 5080, "udp" },
+ { "sdl-ets", { NULL }, 5081, "tcp" },
+ { "sdl-ets", { NULL }, 5081, "udp" },
+ { "qcp", { NULL }, 5082, "tcp" },
+ { "qcp", { NULL }, 5082, "udp" },
+ { "qfp", { NULL }, 5083, "tcp" },
+ { "qfp", { NULL }, 5083, "udp" },
+ { "llrp", { NULL }, 5084, "tcp" },
+ { "llrp", { NULL }, 5084, "udp" },
+ { "encrypted-llrp", { NULL }, 5085, "tcp" },
+ { "encrypted-llrp", { NULL }, 5085, "udp" },
+ { "aprigo-cs", { NULL }, 5086, "tcp" },
+ { "car", { NULL }, 5090, "sctp"},
+ { "cxtp", { NULL }, 5091, "sctp"},
+ { "magpie", { NULL }, 5092, "udp" },
+ { "sentinel-lm", { NULL }, 5093, "tcp" },
+ { "sentinel-lm", { NULL }, 5093, "udp" },
+ { "hart-ip", { NULL }, 5094, "tcp" },
+ { "hart-ip", { NULL }, 5094, "udp" },
+ { "sentlm-srv2srv", { NULL }, 5099, "tcp" },
+ { "sentlm-srv2srv", { NULL }, 5099, "udp" },
+ { "socalia", { NULL }, 5100, "tcp" },
+ { "socalia", { NULL }, 5100, "udp" },
+ { "talarian-tcp", { NULL }, 5101, "tcp" },
+ { "talarian-udp", { NULL }, 5101, "udp" },
+ { "oms-nonsecure", { NULL }, 5102, "tcp" },
+ { "oms-nonsecure", { NULL }, 5102, "udp" },
+ { "actifio-c2c", { NULL }, 5103, "tcp" },
+ { "tinymessage", { NULL }, 5104, "udp" },
+ { "hughes-ap", { NULL }, 5105, "udp" },
+ { "taep-as-svc", { NULL }, 5111, "tcp" },
+ { "taep-as-svc", { NULL }, 5111, "udp" },
+ { "pm-cmdsvr", { NULL }, 5112, "tcp" },
+ { "pm-cmdsvr", { NULL }, 5112, "udp" },
+ { "ev-services", { NULL }, 5114, "tcp" },
+ { "autobuild", { NULL }, 5115, "tcp" },
+ { "emb-proj-cmd", { NULL }, 5116, "udp" },
+ { "gradecam", { NULL }, 5117, "tcp" },
+ { "nbt-pc", { NULL }, 5133, "tcp" },
+ { "nbt-pc", { NULL }, 5133, "udp" },
+ { "ppactivation", { NULL }, 5134, "tcp" },
+ { "erp-scale", { NULL }, 5135, "tcp" },
+ { "minotaur-sa", { NULL }, 5136, "udp" },
+ { "ctsd", { NULL }, 5137, "tcp" },
+ { "ctsd", { NULL }, 5137, "udp" },
+ { "rmonitor_secure", { NULL }, 5145, "tcp" },
+ { "rmonitor_secure", { NULL }, 5145, "udp" },
+ { "social-alarm", { NULL }, 5146, "tcp" },
+ { "atmp", { NULL }, 5150, "tcp" },
+ { "atmp", { NULL }, 5150, "udp" },
+ { "esri_sde", { NULL }, 5151, "tcp" },
+ { "esri_sde", { NULL }, 5151, "udp" },
+ { "sde-discovery", { NULL }, 5152, "tcp" },
+ { "sde-discovery", { NULL }, 5152, "udp" },
+ { "toruxserver", { NULL }, 5153, "tcp" },
+ { "bzflag", { NULL }, 5154, "tcp" },
+ { "bzflag", { NULL }, 5154, "udp" },
+ { "asctrl-agent", { NULL }, 5155, "tcp" },
+ { "asctrl-agent", { NULL }, 5155, "udp" },
+ { "rugameonline", { NULL }, 5156, "tcp" },
+ { "mediat", { NULL }, 5157, "tcp" },
+ { "snmpssh", { NULL }, 5161, "tcp" },
+ { "snmpssh-trap", { NULL }, 5162, "tcp" },
+ { "sbackup", { NULL }, 5163, "tcp" },
+ { "vpa", { NULL }, 5164, "tcp" },
+ { "vpa-disc", { NULL }, 5164, "udp" },
+ { "ife_icorp", { NULL }, 5165, "tcp" },
+ { "ife_icorp", { NULL }, 5165, "udp" },
+ { "winpcs", { NULL }, 5166, "tcp" },
+ { "winpcs", { NULL }, 5166, "udp" },
+ { "scte104", { NULL }, 5167, "tcp" },
+ { "scte104", { NULL }, 5167, "udp" },
+ { "scte30", { NULL }, 5168, "tcp" },
+ { "scte30", { NULL }, 5168, "udp" },
+ { "aol", { NULL }, 5190, "tcp" },
+ { "aol", { NULL }, 5190, "udp" },
+ { "aol-1", { NULL }, 5191, "tcp" },
+ { "aol-1", { NULL }, 5191, "udp" },
+ { "aol-2", { NULL }, 5192, "tcp" },
+ { "aol-2", { NULL }, 5192, "udp" },
+ { "aol-3", { NULL }, 5193, "tcp" },
+ { "aol-3", { NULL }, 5193, "udp" },
+ { "cpscomm", { NULL }, 5194, "tcp" },
+ { "targus-getdata", { NULL }, 5200, "tcp" },
+ { "targus-getdata", { NULL }, 5200, "udp" },
+ { "targus-getdata1", { NULL }, 5201, "tcp" },
+ { "targus-getdata1", { NULL }, 5201, "udp" },
+ { "targus-getdata2", { NULL }, 5202, "tcp" },
+ { "targus-getdata2", { NULL }, 5202, "udp" },
+ { "targus-getdata3", { NULL }, 5203, "tcp" },
+ { "targus-getdata3", { NULL }, 5203, "udp" },
+ { "3exmp", { NULL }, 5221, "tcp" },
+ { "xmpp-client", { NULL }, 5222, "tcp" },
+ { "hpvirtgrp", { NULL }, 5223, "tcp" },
+ { "hpvirtgrp", { NULL }, 5223, "udp" },
+ { "hpvirtctrl", { NULL }, 5224, "tcp" },
+ { "hpvirtctrl", { NULL }, 5224, "udp" },
+ { "hp-server", { NULL }, 5225, "tcp" },
+ { "hp-server", { NULL }, 5225, "udp" },
+ { "hp-status", { NULL }, 5226, "tcp" },
+ { "hp-status", { NULL }, 5226, "udp" },
+ { "perfd", { NULL }, 5227, "tcp" },
+ { "perfd", { NULL }, 5227, "udp" },
+ { "hpvroom", { NULL }, 5228, "tcp" },
+ { "csedaemon", { NULL }, 5232, "tcp" },
+ { "enfs", { NULL }, 5233, "tcp" },
+ { "eenet", { NULL }, 5234, "tcp" },
+ { "eenet", { NULL }, 5234, "udp" },
+ { "galaxy-network", { NULL }, 5235, "tcp" },
+ { "galaxy-network", { NULL }, 5235, "udp" },
+ { "padl2sim", { NULL }, 5236, "tcp" },
+ { "padl2sim", { NULL }, 5236, "udp" },
+ { "mnet-discovery", { NULL }, 5237, "tcp" },
+ { "mnet-discovery", { NULL }, 5237, "udp" },
+ { "downtools", { NULL }, 5245, "tcp" },
+ { "downtools-disc", { NULL }, 5245, "udp" },
+ { "capwap-control", { NULL }, 5246, "udp" },
+ { "capwap-data", { NULL }, 5247, "udp" },
+ { "caacws", { NULL }, 5248, "tcp" },
+ { "caacws", { NULL }, 5248, "udp" },
+ { "caaclang2", { NULL }, 5249, "tcp" },
+ { "caaclang2", { NULL }, 5249, "udp" },
+ { "soagateway", { NULL }, 5250, "tcp" },
+ { "soagateway", { NULL }, 5250, "udp" },
+ { "caevms", { NULL }, 5251, "tcp" },
+ { "caevms", { NULL }, 5251, "udp" },
+ { "movaz-ssc", { NULL }, 5252, "tcp" },
+ { "movaz-ssc", { NULL }, 5252, "udp" },
+ { "kpdp", { NULL }, 5253, "tcp" },
+ { "3com-njack-1", { NULL }, 5264, "tcp" },
+ { "3com-njack-1", { NULL }, 5264, "udp" },
+ { "3com-njack-2", { NULL }, 5265, "tcp" },
+ { "3com-njack-2", { NULL }, 5265, "udp" },
+ { "xmpp-server", { NULL }, 5269, "tcp" },
+ { "xmp", { NULL }, 5270, "tcp" },
+ { "xmp", { NULL }, 5270, "udp" },
+ { "cuelink", { NULL }, 5271, "tcp" },
+ { "cuelink-disc", { NULL }, 5271, "udp" },
+ { "pk", { NULL }, 5272, "tcp" },
+ { "pk", { NULL }, 5272, "udp" },
+ { "xmpp-bosh", { NULL }, 5280, "tcp" },
+ { "undo-lm", { NULL }, 5281, "tcp" },
+ { "transmit-port", { NULL }, 5282, "tcp" },
+ { "transmit-port", { NULL }, 5282, "udp" },
+ { "presence", { NULL }, 5298, "tcp" },
+ { "presence", { NULL }, 5298, "udp" },
+ { "nlg-data", { NULL }, 5299, "tcp" },
+ { "nlg-data", { NULL }, 5299, "udp" },
+ { "hacl-hb", { NULL }, 5300, "tcp" },
+ { "hacl-hb", { NULL }, 5300, "udp" },
+ { "hacl-gs", { NULL }, 5301, "tcp" },
+ { "hacl-gs", { NULL }, 5301, "udp" },
+ { "hacl-cfg", { NULL }, 5302, "tcp" },
+ { "hacl-cfg", { NULL }, 5302, "udp" },
+ { "hacl-probe", { NULL }, 5303, "tcp" },
+ { "hacl-probe", { NULL }, 5303, "udp" },
+ { "hacl-local", { NULL }, 5304, "tcp" },
+ { "hacl-local", { NULL }, 5304, "udp" },
+ { "hacl-test", { NULL }, 5305, "tcp" },
+ { "hacl-test", { NULL }, 5305, "udp" },
+ { "sun-mc-grp", { NULL }, 5306, "tcp" },
+ { "sun-mc-grp", { NULL }, 5306, "udp" },
+ { "sco-aip", { NULL }, 5307, "tcp" },
+ { "sco-aip", { NULL }, 5307, "udp" },
+ { "cfengine", { NULL }, 5308, "tcp" },
+ { "cfengine", { NULL }, 5308, "udp" },
+ { "jprinter", { NULL }, 5309, "tcp" },
+ { "jprinter", { NULL }, 5309, "udp" },
+ { "outlaws", { NULL }, 5310, "tcp" },
+ { "outlaws", { NULL }, 5310, "udp" },
+ { "permabit-cs", { NULL }, 5312, "tcp" },
+ { "permabit-cs", { NULL }, 5312, "udp" },
+ { "rrdp", { NULL }, 5313, "tcp" },
+ { "rrdp", { NULL }, 5313, "udp" },
+ { "opalis-rbt-ipc", { NULL }, 5314, "tcp" },
+ { "opalis-rbt-ipc", { NULL }, 5314, "udp" },
+ { "hacl-poll", { NULL }, 5315, "tcp" },
+ { "hacl-poll", { NULL }, 5315, "udp" },
+ { "hpdevms", { NULL }, 5316, "tcp" },
+ { "hpdevms", { NULL }, 5316, "udp" },
+ { "bsfserver-zn", { NULL }, 5320, "tcp" },
+ { "bsfsvr-zn-ssl", { NULL }, 5321, "tcp" },
+ { "kfserver", { NULL }, 5343, "tcp" },
+ { "kfserver", { NULL }, 5343, "udp" },
+ { "xkotodrcp", { NULL }, 5344, "tcp" },
+ { "xkotodrcp", { NULL }, 5344, "udp" },
+ { "stuns", { NULL }, 5349, "tcp" },
+ { "stuns", { NULL }, 5349, "udp" },
+ { "turns", { NULL }, 5349, "tcp" },
+ { "turns", { NULL }, 5349, "udp" },
+ { "stun-behaviors", { NULL }, 5349, "tcp" },
+ { "stun-behaviors", { NULL }, 5349, "udp" },
+ { "nat-pmp-status", { NULL }, 5350, "tcp" },
+ { "nat-pmp-status", { NULL }, 5350, "udp" },
+ { "nat-pmp", { NULL }, 5351, "tcp" },
+ { "nat-pmp", { NULL }, 5351, "udp" },
+ { "dns-llq", { NULL }, 5352, "tcp" },
+ { "dns-llq", { NULL }, 5352, "udp" },
+ { "mdns", { NULL }, 5353, "tcp" },
+ { "mdns", { NULL }, 5353, "udp" },
+ { "mdnsresponder", { NULL }, 5354, "tcp" },
+ { "mdnsresponder", { NULL }, 5354, "udp" },
+ { "llmnr", { NULL }, 5355, "tcp" },
+ { "llmnr", { NULL }, 5355, "udp" },
+ { "ms-smlbiz", { NULL }, 5356, "tcp" },
+ { "ms-smlbiz", { NULL }, 5356, "udp" },
+ { "wsdapi", { NULL }, 5357, "tcp" },
+ { "wsdapi", { NULL }, 5357, "udp" },
+ { "wsdapi-s", { NULL }, 5358, "tcp" },
+ { "wsdapi-s", { NULL }, 5358, "udp" },
+ { "ms-alerter", { NULL }, 5359, "tcp" },
+ { "ms-alerter", { NULL }, 5359, "udp" },
+ { "ms-sideshow", { NULL }, 5360, "tcp" },
+ { "ms-sideshow", { NULL }, 5360, "udp" },
+ { "ms-s-sideshow", { NULL }, 5361, "tcp" },
+ { "ms-s-sideshow", { NULL }, 5361, "udp" },
+ { "serverwsd2", { NULL }, 5362, "tcp" },
+ { "serverwsd2", { NULL }, 5362, "udp" },
+ { "net-projection", { NULL }, 5363, "tcp" },
+ { "net-projection", { NULL }, 5363, "udp" },
+ { "stresstester", { NULL }, 5397, "tcp" },
+ { "stresstester", { NULL }, 5397, "udp" },
+ { "elektron-admin", { NULL }, 5398, "tcp" },
+ { "elektron-admin", { NULL }, 5398, "udp" },
+ { "securitychase", { NULL }, 5399, "tcp" },
+ { "securitychase", { NULL }, 5399, "udp" },
+ { "excerpt", { NULL }, 5400, "tcp" },
+ { "excerpt", { NULL }, 5400, "udp" },
+ { "excerpts", { NULL }, 5401, "tcp" },
+ { "excerpts", { NULL }, 5401, "udp" },
+ { "mftp", { NULL }, 5402, "tcp" },
+ { "mftp", { NULL }, 5402, "udp" },
+ { "hpoms-ci-lstn", { NULL }, 5403, "tcp" },
+ { "hpoms-ci-lstn", { NULL }, 5403, "udp" },
+ { "hpoms-dps-lstn", { NULL }, 5404, "tcp" },
+ { "hpoms-dps-lstn", { NULL }, 5404, "udp" },
+ { "netsupport", { NULL }, 5405, "tcp" },
+ { "netsupport", { NULL }, 5405, "udp" },
+ { "systemics-sox", { NULL }, 5406, "tcp" },
+ { "systemics-sox", { NULL }, 5406, "udp" },
+ { "foresyte-clear", { NULL }, 5407, "tcp" },
+ { "foresyte-clear", { NULL }, 5407, "udp" },
+ { "foresyte-sec", { NULL }, 5408, "tcp" },
+ { "foresyte-sec", { NULL }, 5408, "udp" },
+ { "salient-dtasrv", { NULL }, 5409, "tcp" },
+ { "salient-dtasrv", { NULL }, 5409, "udp" },
+ { "salient-usrmgr", { NULL }, 5410, "tcp" },
+ { "salient-usrmgr", { NULL }, 5410, "udp" },
+ { "actnet", { NULL }, 5411, "tcp" },
+ { "actnet", { NULL }, 5411, "udp" },
+ { "continuus", { NULL }, 5412, "tcp" },
+ { "continuus", { NULL }, 5412, "udp" },
+ { "wwiotalk", { NULL }, 5413, "tcp" },
+ { "wwiotalk", { NULL }, 5413, "udp" },
+ { "statusd", { NULL }, 5414, "tcp" },
+ { "statusd", { NULL }, 5414, "udp" },
+ { "ns-server", { NULL }, 5415, "tcp" },
+ { "ns-server", { NULL }, 5415, "udp" },
+ { "sns-gateway", { NULL }, 5416, "tcp" },
+ { "sns-gateway", { NULL }, 5416, "udp" },
+ { "sns-agent", { NULL }, 5417, "tcp" },
+ { "sns-agent", { NULL }, 5417, "udp" },
+ { "mcntp", { NULL }, 5418, "tcp" },
+ { "mcntp", { NULL }, 5418, "udp" },
+ { "dj-ice", { NULL }, 5419, "tcp" },
+ { "dj-ice", { NULL }, 5419, "udp" },
+ { "cylink-c", { NULL }, 5420, "tcp" },
+ { "cylink-c", { NULL }, 5420, "udp" },
+ { "netsupport2", { NULL }, 5421, "tcp" },
+ { "netsupport2", { NULL }, 5421, "udp" },
+ { "salient-mux", { NULL }, 5422, "tcp" },
+ { "salient-mux", { NULL }, 5422, "udp" },
+ { "virtualuser", { NULL }, 5423, "tcp" },
+ { "virtualuser", { NULL }, 5423, "udp" },
+ { "beyond-remote", { NULL }, 5424, "tcp" },
+ { "beyond-remote", { NULL }, 5424, "udp" },
+ { "br-channel", { NULL }, 5425, "tcp" },
+ { "br-channel", { NULL }, 5425, "udp" },
+ { "devbasic", { NULL }, 5426, "tcp" },
+ { "devbasic", { NULL }, 5426, "udp" },
+ { "sco-peer-tta", { NULL }, 5427, "tcp" },
+ { "sco-peer-tta", { NULL }, 5427, "udp" },
+ { "telaconsole", { NULL }, 5428, "tcp" },
+ { "telaconsole", { NULL }, 5428, "udp" },
+ { "base", { NULL }, 5429, "tcp" },
+ { "base", { NULL }, 5429, "udp" },
+ { "radec-corp", { NULL }, 5430, "tcp" },
+ { "radec-corp", { NULL }, 5430, "udp" },
+ { "park-agent", { NULL }, 5431, "tcp" },
+ { "park-agent", { NULL }, 5431, "udp" },
+ { "postgresql", { NULL }, 5432, "tcp" },
+ { "postgresql", { NULL }, 5432, "udp" },
+ { "pyrrho", { NULL }, 5433, "tcp" },
+ { "pyrrho", { NULL }, 5433, "udp" },
+ { "sgi-arrayd", { NULL }, 5434, "tcp" },
+ { "sgi-arrayd", { NULL }, 5434, "udp" },
+ { "sceanics", { NULL }, 5435, "tcp" },
+ { "sceanics", { NULL }, 5435, "udp" },
+ { "pmip6-cntl", { NULL }, 5436, "udp" },
+ { "pmip6-data", { NULL }, 5437, "udp" },
+ { "spss", { NULL }, 5443, "tcp" },
+ { "spss", { NULL }, 5443, "udp" },
+ { "surebox", { NULL }, 5453, "tcp" },
+ { "surebox", { NULL }, 5453, "udp" },
+ { "apc-5454", { NULL }, 5454, "tcp" },
+ { "apc-5454", { NULL }, 5454, "udp" },
+ { "apc-5455", { NULL }, 5455, "tcp" },
+ { "apc-5455", { NULL }, 5455, "udp" },
+ { "apc-5456", { NULL }, 5456, "tcp" },
+ { "apc-5456", { NULL }, 5456, "udp" },
+ { "silkmeter", { NULL }, 5461, "tcp" },
+ { "silkmeter", { NULL }, 5461, "udp" },
+ { "ttl-publisher", { NULL }, 5462, "tcp" },
+ { "ttl-publisher", { NULL }, 5462, "udp" },
+ { "ttlpriceproxy", { NULL }, 5463, "tcp" },
+ { "ttlpriceproxy", { NULL }, 5463, "udp" },
+ { "quailnet", { NULL }, 5464, "tcp" },
+ { "quailnet", { NULL }, 5464, "udp" },
+ { "netops-broker", { NULL }, 5465, "tcp" },
+ { "netops-broker", { NULL }, 5465, "udp" },
+ { "fcp-addr-srvr1", { NULL }, 5500, "tcp" },
+ { "fcp-addr-srvr1", { NULL }, 5500, "udp" },
+ { "fcp-addr-srvr2", { NULL }, 5501, "tcp" },
+ { "fcp-addr-srvr2", { NULL }, 5501, "udp" },
+ { "fcp-srvr-inst1", { NULL }, 5502, "tcp" },
+ { "fcp-srvr-inst1", { NULL }, 5502, "udp" },
+ { "fcp-srvr-inst2", { NULL }, 5503, "tcp" },
+ { "fcp-srvr-inst2", { NULL }, 5503, "udp" },
+ { "fcp-cics-gw1", { NULL }, 5504, "tcp" },
+ { "fcp-cics-gw1", { NULL }, 5504, "udp" },
+ { "checkoutdb", { NULL }, 5505, "tcp" },
+ { "checkoutdb", { NULL }, 5505, "udp" },
+ { "amc", { NULL }, 5506, "tcp" },
+ { "amc", { NULL }, 5506, "udp" },
+ { "sgi-eventmond", { NULL }, 5553, "tcp" },
+ { "sgi-eventmond", { NULL }, 5553, "udp" },
+ { "sgi-esphttp", { NULL }, 5554, "tcp" },
+ { "sgi-esphttp", { NULL }, 5554, "udp" },
+ { "personal-agent", { NULL }, 5555, "tcp" },
+ { "personal-agent", { NULL }, 5555, "udp" },
+ { "freeciv", { NULL }, 5556, "tcp" },
+ { "freeciv", { NULL }, 5556, "udp" },
+ { "farenet", { NULL }, 5557, "tcp" },
+ { "westec-connect", { NULL }, 5566, "tcp" },
+ { "m-oap", { NULL }, 5567, "tcp" },
+ { "m-oap", { NULL }, 5567, "udp" },
+ { "sdt", { NULL }, 5568, "tcp" },
+ { "sdt", { NULL }, 5568, "udp" },
+ { "sdmmp", { NULL }, 5573, "tcp" },
+ { "sdmmp", { NULL }, 5573, "udp" },
+ { "lsi-bobcat", { NULL }, 5574, "tcp" },
+ { "ora-oap", { NULL }, 5575, "tcp" },
+ { "fdtracks", { NULL }, 5579, "tcp" },
+ { "tmosms0", { NULL }, 5580, "tcp" },
+ { "tmosms0", { NULL }, 5580, "udp" },
+ { "tmosms1", { NULL }, 5581, "tcp" },
+ { "tmosms1", { NULL }, 5581, "udp" },
+ { "fac-restore", { NULL }, 5582, "tcp" },
+ { "fac-restore", { NULL }, 5582, "udp" },
+ { "tmo-icon-sync", { NULL }, 5583, "tcp" },
+ { "tmo-icon-sync", { NULL }, 5583, "udp" },
+ { "bis-web", { NULL }, 5584, "tcp" },
+ { "bis-web", { NULL }, 5584, "udp" },
+ { "bis-sync", { NULL }, 5585, "tcp" },
+ { "bis-sync", { NULL }, 5585, "udp" },
+ { "ininmessaging", { NULL }, 5597, "tcp" },
+ { "ininmessaging", { NULL }, 5597, "udp" },
+ { "mctfeed", { NULL }, 5598, "tcp" },
+ { "mctfeed", { NULL }, 5598, "udp" },
+ { "esinstall", { NULL }, 5599, "tcp" },
+ { "esinstall", { NULL }, 5599, "udp" },
+ { "esmmanager", { NULL }, 5600, "tcp" },
+ { "esmmanager", { NULL }, 5600, "udp" },
+ { "esmagent", { NULL }, 5601, "tcp" },
+ { "esmagent", { NULL }, 5601, "udp" },
+ { "a1-msc", { NULL }, 5602, "tcp" },
+ { "a1-msc", { NULL }, 5602, "udp" },
+ { "a1-bs", { NULL }, 5603, "tcp" },
+ { "a1-bs", { NULL }, 5603, "udp" },
+ { "a3-sdunode", { NULL }, 5604, "tcp" },
+ { "a3-sdunode", { NULL }, 5604, "udp" },
+ { "a4-sdunode", { NULL }, 5605, "tcp" },
+ { "a4-sdunode", { NULL }, 5605, "udp" },
+ { "ninaf", { NULL }, 5627, "tcp" },
+ { "ninaf", { NULL }, 5627, "udp" },
+ { "htrust", { NULL }, 5628, "tcp" },
+ { "htrust", { NULL }, 5628, "udp" },
+ { "symantec-sfdb", { NULL }, 5629, "tcp" },
+ { "symantec-sfdb", { NULL }, 5629, "udp" },
+ { "precise-comm", { NULL }, 5630, "tcp" },
+ { "precise-comm", { NULL }, 5630, "udp" },
+ { "pcanywheredata", { NULL }, 5631, "tcp" },
+ { "pcanywheredata", { NULL }, 5631, "udp" },
+ { "pcanywherestat", { NULL }, 5632, "tcp" },
+ { "pcanywherestat", { NULL }, 5632, "udp" },
+ { "beorl", { NULL }, 5633, "tcp" },
+ { "beorl", { NULL }, 5633, "udp" },
+ { "xprtld", { NULL }, 5634, "tcp" },
+ { "xprtld", { NULL }, 5634, "udp" },
+ { "sfmsso", { NULL }, 5635, "tcp" },
+ { "sfm-db-server", { NULL }, 5636, "tcp" },
+ { "cssc", { NULL }, 5637, "tcp" },
+ { "amqps", { NULL }, 5671, "tcp" },
+ { "amqps", { NULL }, 5671, "udp" },
+ { "amqp", { NULL }, 5672, "tcp" },
+ { "amqp", { NULL }, 5672, "udp" },
+ { "amqp", { NULL }, 5672, "sctp"},
+ { "jms", { NULL }, 5673, "tcp" },
+ { "jms", { NULL }, 5673, "udp" },
+ { "hyperscsi-port", { NULL }, 5674, "tcp" },
+ { "hyperscsi-port", { NULL }, 5674, "udp" },
+ { "v5ua", { NULL }, 5675, "tcp" },
+ { "v5ua", { NULL }, 5675, "udp" },
+ { "v5ua", { NULL }, 5675, "sctp"},
+ { "raadmin", { NULL }, 5676, "tcp" },
+ { "raadmin", { NULL }, 5676, "udp" },
+ { "questdb2-lnchr", { NULL }, 5677, "tcp" },
+ { "questdb2-lnchr", { NULL }, 5677, "udp" },
+ { "rrac", { NULL }, 5678, "tcp" },
+ { "rrac", { NULL }, 5678, "udp" },
+ { "dccm", { NULL }, 5679, "tcp" },
+ { "dccm", { NULL }, 5679, "udp" },
+ { "auriga-router", { NULL }, 5680, "tcp" },
+ { "auriga-router", { NULL }, 5680, "udp" },
+ { "ncxcp", { NULL }, 5681, "tcp" },
+ { "ncxcp", { NULL }, 5681, "udp" },
+ { "brightcore", { NULL }, 5682, "udp" },
+ { "ggz", { NULL }, 5688, "tcp" },
+ { "ggz", { NULL }, 5688, "udp" },
+ { "qmvideo", { NULL }, 5689, "tcp" },
+ { "qmvideo", { NULL }, 5689, "udp" },
+ { "proshareaudio", { NULL }, 5713, "tcp" },
+ { "proshareaudio", { NULL }, 5713, "udp" },
+ { "prosharevideo", { NULL }, 5714, "tcp" },
+ { "prosharevideo", { NULL }, 5714, "udp" },
+ { "prosharedata", { NULL }, 5715, "tcp" },
+ { "prosharedata", { NULL }, 5715, "udp" },
+ { "prosharerequest", { NULL }, 5716, "tcp" },
+ { "prosharerequest", { NULL }, 5716, "udp" },
+ { "prosharenotify", { NULL }, 5717, "tcp" },
+ { "prosharenotify", { NULL }, 5717, "udp" },
+ { "dpm", { NULL }, 5718, "tcp" },
+ { "dpm", { NULL }, 5718, "udp" },
+ { "dpm-agent", { NULL }, 5719, "tcp" },
+ { "dpm-agent", { NULL }, 5719, "udp" },
+ { "ms-licensing", { NULL }, 5720, "tcp" },
+ { "ms-licensing", { NULL }, 5720, "udp" },
+ { "dtpt", { NULL }, 5721, "tcp" },
+ { "dtpt", { NULL }, 5721, "udp" },
+ { "msdfsr", { NULL }, 5722, "tcp" },
+ { "msdfsr", { NULL }, 5722, "udp" },
+ { "omhs", { NULL }, 5723, "tcp" },
+ { "omhs", { NULL }, 5723, "udp" },
+ { "omsdk", { NULL }, 5724, "tcp" },
+ { "omsdk", { NULL }, 5724, "udp" },
+ { "ms-ilm", { NULL }, 5725, "tcp" },
+ { "ms-ilm-sts", { NULL }, 5726, "tcp" },
+ { "asgenf", { NULL }, 5727, "tcp" },
+ { "io-dist-data", { NULL }, 5728, "tcp" },
+ { "io-dist-group", { NULL }, 5728, "udp" },
+ { "openmail", { NULL }, 5729, "tcp" },
+ { "openmail", { NULL }, 5729, "udp" },
+ { "unieng", { NULL }, 5730, "tcp" },
+ { "unieng", { NULL }, 5730, "udp" },
+ { "ida-discover1", { NULL }, 5741, "tcp" },
+ { "ida-discover1", { NULL }, 5741, "udp" },
+ { "ida-discover2", { NULL }, 5742, "tcp" },
+ { "ida-discover2", { NULL }, 5742, "udp" },
+ { "watchdoc-pod", { NULL }, 5743, "tcp" },
+ { "watchdoc-pod", { NULL }, 5743, "udp" },
+ { "watchdoc", { NULL }, 5744, "tcp" },
+ { "watchdoc", { NULL }, 5744, "udp" },
+ { "fcopy-server", { NULL }, 5745, "tcp" },
+ { "fcopy-server", { NULL }, 5745, "udp" },
+ { "fcopys-server", { NULL }, 5746, "tcp" },
+ { "fcopys-server", { NULL }, 5746, "udp" },
+ { "tunatic", { NULL }, 5747, "tcp" },
+ { "tunatic", { NULL }, 5747, "udp" },
+ { "tunalyzer", { NULL }, 5748, "tcp" },
+ { "tunalyzer", { NULL }, 5748, "udp" },
+ { "rscd", { NULL }, 5750, "tcp" },
+ { "rscd", { NULL }, 5750, "udp" },
+ { "openmailg", { NULL }, 5755, "tcp" },
+ { "openmailg", { NULL }, 5755, "udp" },
+ { "x500ms", { NULL }, 5757, "tcp" },
+ { "x500ms", { NULL }, 5757, "udp" },
+ { "openmailns", { NULL }, 5766, "tcp" },
+ { "openmailns", { NULL }, 5766, "udp" },
+ { "s-openmail", { NULL }, 5767, "tcp" },
+ { "s-openmail", { NULL }, 5767, "udp" },
+ { "openmailpxy", { NULL }, 5768, "tcp" },
+ { "openmailpxy", { NULL }, 5768, "udp" },
+ { "spramsca", { NULL }, 5769, "tcp" },
+ { "spramsca", { NULL }, 5769, "udp" },
+ { "spramsd", { NULL }, 5770, "tcp" },
+ { "spramsd", { NULL }, 5770, "udp" },
+ { "netagent", { NULL }, 5771, "tcp" },
+ { "netagent", { NULL }, 5771, "udp" },
+ { "dali-port", { NULL }, 5777, "tcp" },
+ { "dali-port", { NULL }, 5777, "udp" },
+ { "vts-rpc", { NULL }, 5780, "tcp" },
+ { "3par-evts", { NULL }, 5781, "tcp" },
+ { "3par-evts", { NULL }, 5781, "udp" },
+ { "3par-mgmt", { NULL }, 5782, "tcp" },
+ { "3par-mgmt", { NULL }, 5782, "udp" },
+ { "3par-mgmt-ssl", { NULL }, 5783, "tcp" },
+ { "3par-mgmt-ssl", { NULL }, 5783, "udp" },
+ { "ibar", { NULL }, 5784, "udp" },
+ { "3par-rcopy", { NULL }, 5785, "tcp" },
+ { "3par-rcopy", { NULL }, 5785, "udp" },
+ { "cisco-redu", { NULL }, 5786, "udp" },
+ { "waascluster", { NULL }, 5787, "udp" },
+ { "xtreamx", { NULL }, 5793, "tcp" },
+ { "xtreamx", { NULL }, 5793, "udp" },
+ { "spdp", { NULL }, 5794, "udp" },
+ { "icmpd", { NULL }, 5813, "tcp" },
+ { "icmpd", { NULL }, 5813, "udp" },
+ { "spt-automation", { NULL }, 5814, "tcp" },
+ { "spt-automation", { NULL }, 5814, "udp" },
+ { "wherehoo", { NULL }, 5859, "tcp" },
+ { "wherehoo", { NULL }, 5859, "udp" },
+ { "ppsuitemsg", { NULL }, 5863, "tcp" },
+ { "ppsuitemsg", { NULL }, 5863, "udp" },
+ { "rfb", { NULL }, 5900, "tcp" },
+ { "rfb", { NULL }, 5900, "udp" },
+ { "cm", { NULL }, 5910, "tcp" },
+ { "cm", { NULL }, 5910, "udp" },
+ { "cpdlc", { NULL }, 5911, "tcp" },
+ { "cpdlc", { NULL }, 5911, "udp" },
+ { "fis", { NULL }, 5912, "tcp" },
+ { "fis", { NULL }, 5912, "udp" },
+ { "ads-c", { NULL }, 5913, "tcp" },
+ { "ads-c", { NULL }, 5913, "udp" },
+ { "indy", { NULL }, 5963, "tcp" },
+ { "indy", { NULL }, 5963, "udp" },
+ { "mppolicy-v5", { NULL }, 5968, "tcp" },
+ { "mppolicy-v5", { NULL }, 5968, "udp" },
+ { "mppolicy-mgr", { NULL }, 5969, "tcp" },
+ { "mppolicy-mgr", { NULL }, 5969, "udp" },
+ { "couchdb", { NULL }, 5984, "tcp" },
+ { "couchdb", { NULL }, 5984, "udp" },
+ { "wsman", { NULL }, 5985, "tcp" },
+ { "wsman", { NULL }, 5985, "udp" },
+ { "wsmans", { NULL }, 5986, "tcp" },
+ { "wsmans", { NULL }, 5986, "udp" },
+ { "wbem-rmi", { NULL }, 5987, "tcp" },
+ { "wbem-rmi", { NULL }, 5987, "udp" },
+ { "wbem-http", { NULL }, 5988, "tcp" },
+ { "wbem-http", { NULL }, 5988, "udp" },
+ { "wbem-https", { NULL }, 5989, "tcp" },
+ { "wbem-https", { NULL }, 5989, "udp" },
+ { "wbem-exp-https", { NULL }, 5990, "tcp" },
+ { "wbem-exp-https", { NULL }, 5990, "udp" },
+ { "nuxsl", { NULL }, 5991, "tcp" },
+ { "nuxsl", { NULL }, 5991, "udp" },
+ { "consul-insight", { NULL }, 5992, "tcp" },
+ { "consul-insight", { NULL }, 5992, "udp" },
+ { "cvsup", { NULL }, 5999, "tcp" },
+ { "cvsup", { NULL }, 5999, "udp" },
+ { "ndl-ahp-svc", { NULL }, 6064, "tcp" },
+ { "ndl-ahp-svc", { NULL }, 6064, "udp" },
+ { "winpharaoh", { NULL }, 6065, "tcp" },
+ { "winpharaoh", { NULL }, 6065, "udp" },
+ { "ewctsp", { NULL }, 6066, "tcp" },
+ { "ewctsp", { NULL }, 6066, "udp" },
+ { "gsmp", { NULL }, 6068, "tcp" },
+ { "gsmp", { NULL }, 6068, "udp" },
+ { "trip", { NULL }, 6069, "tcp" },
+ { "trip", { NULL }, 6069, "udp" },
+ { "messageasap", { NULL }, 6070, "tcp" },
+ { "messageasap", { NULL }, 6070, "udp" },
+ { "ssdtp", { NULL }, 6071, "tcp" },
+ { "ssdtp", { NULL }, 6071, "udp" },
+ { "diagnose-proc", { NULL }, 6072, "tcp" },
+ { "diagnose-proc", { NULL }, 6072, "udp" },
+ { "directplay8", { NULL }, 6073, "tcp" },
+ { "directplay8", { NULL }, 6073, "udp" },
+ { "max", { NULL }, 6074, "tcp" },
+ { "max", { NULL }, 6074, "udp" },
+ { "dpm-acm", { NULL }, 6075, "tcp" },
+ { "miami-bcast", { NULL }, 6083, "udp" },
+ { "p2p-sip", { NULL }, 6084, "tcp" },
+ { "konspire2b", { NULL }, 6085, "tcp" },
+ { "konspire2b", { NULL }, 6085, "udp" },
+ { "pdtp", { NULL }, 6086, "tcp" },
+ { "pdtp", { NULL }, 6086, "udp" },
+ { "ldss", { NULL }, 6087, "tcp" },
+ { "ldss", { NULL }, 6087, "udp" },
+ { "raxa-mgmt", { NULL }, 6099, "tcp" },
+ { "synchronet-db", { NULL }, 6100, "tcp" },
+ { "synchronet-db", { NULL }, 6100, "udp" },
+ { "synchronet-rtc", { NULL }, 6101, "tcp" },
+ { "synchronet-rtc", { NULL }, 6101, "udp" },
+ { "synchronet-upd", { NULL }, 6102, "tcp" },
+ { "synchronet-upd", { NULL }, 6102, "udp" },
+ { "rets", { NULL }, 6103, "tcp" },
+ { "rets", { NULL }, 6103, "udp" },
+ { "dbdb", { NULL }, 6104, "tcp" },
+ { "dbdb", { NULL }, 6104, "udp" },
+ { "primaserver", { NULL }, 6105, "tcp" },
+ { "primaserver", { NULL }, 6105, "udp" },
+ { "mpsserver", { NULL }, 6106, "tcp" },
+ { "mpsserver", { NULL }, 6106, "udp" },
+ { "etc-control", { NULL }, 6107, "tcp" },
+ { "etc-control", { NULL }, 6107, "udp" },
+ { "sercomm-scadmin", { NULL }, 6108, "tcp" },
+ { "sercomm-scadmin", { NULL }, 6108, "udp" },
+ { "globecast-id", { NULL }, 6109, "tcp" },
+ { "globecast-id", { NULL }, 6109, "udp" },
+ { "softcm", { NULL }, 6110, "tcp" },
+ { "softcm", { NULL }, 6110, "udp" },
+ { "spc", { NULL }, 6111, "tcp" },
+ { "spc", { NULL }, 6111, "udp" },
+ { "dtspcd", { NULL }, 6112, "tcp" },
+ { "dtspcd", { NULL }, 6112, "udp" },
+ { "dayliteserver", { NULL }, 6113, "tcp" },
+ { "wrspice", { NULL }, 6114, "tcp" },
+ { "xic", { NULL }, 6115, "tcp" },
+ { "xtlserv", { NULL }, 6116, "tcp" },
+ { "daylitetouch", { NULL }, 6117, "tcp" },
+ { "spdy", { NULL }, 6121, "tcp" },
+ { "bex-webadmin", { NULL }, 6122, "tcp" },
+ { "bex-webadmin", { NULL }, 6122, "udp" },
+ { "backup-express", { NULL }, 6123, "tcp" },
+ { "backup-express", { NULL }, 6123, "udp" },
+ { "pnbs", { NULL }, 6124, "tcp" },
+ { "pnbs", { NULL }, 6124, "udp" },
+ { "nbt-wol", { NULL }, 6133, "tcp" },
+ { "nbt-wol", { NULL }, 6133, "udp" },
+ { "pulsonixnls", { NULL }, 6140, "tcp" },
+ { "pulsonixnls", { NULL }, 6140, "udp" },
+ { "meta-corp", { NULL }, 6141, "tcp" },
+ { "meta-corp", { NULL }, 6141, "udp" },
+ { "aspentec-lm", { NULL }, 6142, "tcp" },
+ { "aspentec-lm", { NULL }, 6142, "udp" },
+ { "watershed-lm", { NULL }, 6143, "tcp" },
+ { "watershed-lm", { NULL }, 6143, "udp" },
+ { "statsci1-lm", { NULL }, 6144, "tcp" },
+ { "statsci1-lm", { NULL }, 6144, "udp" },
+ { "statsci2-lm", { NULL }, 6145, "tcp" },
+ { "statsci2-lm", { NULL }, 6145, "udp" },
+ { "lonewolf-lm", { NULL }, 6146, "tcp" },
+ { "lonewolf-lm", { NULL }, 6146, "udp" },
+ { "montage-lm", { NULL }, 6147, "tcp" },
+ { "montage-lm", { NULL }, 6147, "udp" },
+ { "ricardo-lm", { NULL }, 6148, "tcp" },
+ { "ricardo-lm", { NULL }, 6148, "udp" },
+ { "tal-pod", { NULL }, 6149, "tcp" },
+ { "tal-pod", { NULL }, 6149, "udp" },
+ { "efb-aci", { NULL }, 6159, "tcp" },
+ { "patrol-ism", { NULL }, 6161, "tcp" },
+ { "patrol-ism", { NULL }, 6161, "udp" },
+ { "patrol-coll", { NULL }, 6162, "tcp" },
+ { "patrol-coll", { NULL }, 6162, "udp" },
+ { "pscribe", { NULL }, 6163, "tcp" },
+ { "pscribe", { NULL }, 6163, "udp" },
+ { "lm-x", { NULL }, 6200, "tcp" },
+ { "lm-x", { NULL }, 6200, "udp" },
+ { "radmind", { NULL }, 6222, "tcp" },
+ { "radmind", { NULL }, 6222, "udp" },
+ { "jeol-nsdtp-1", { NULL }, 6241, "tcp" },
+ { "jeol-nsddp-1", { NULL }, 6241, "udp" },
+ { "jeol-nsdtp-2", { NULL }, 6242, "tcp" },
+ { "jeol-nsddp-2", { NULL }, 6242, "udp" },
+ { "jeol-nsdtp-3", { NULL }, 6243, "tcp" },
+ { "jeol-nsddp-3", { NULL }, 6243, "udp" },
+ { "jeol-nsdtp-4", { NULL }, 6244, "tcp" },
+ { "jeol-nsddp-4", { NULL }, 6244, "udp" },
+ { "tl1-raw-ssl", { NULL }, 6251, "tcp" },
+ { "tl1-raw-ssl", { NULL }, 6251, "udp" },
+ { "tl1-ssh", { NULL }, 6252, "tcp" },
+ { "tl1-ssh", { NULL }, 6252, "udp" },
+ { "crip", { NULL }, 6253, "tcp" },
+ { "crip", { NULL }, 6253, "udp" },
+ { "gld", { NULL }, 6267, "tcp" },
+ { "grid", { NULL }, 6268, "tcp" },
+ { "grid", { NULL }, 6268, "udp" },
+ { "grid-alt", { NULL }, 6269, "tcp" },
+ { "grid-alt", { NULL }, 6269, "udp" },
+ { "bmc-grx", { NULL }, 6300, "tcp" },
+ { "bmc-grx", { NULL }, 6300, "udp" },
+ { "bmc_ctd_ldap", { NULL }, 6301, "tcp" },
+ { "bmc_ctd_ldap", { NULL }, 6301, "udp" },
+ { "ufmp", { NULL }, 6306, "tcp" },
+ { "ufmp", { NULL }, 6306, "udp" },
+ { "scup", { NULL }, 6315, "tcp" },
+ { "scup-disc", { NULL }, 6315, "udp" },
+ { "abb-escp", { NULL }, 6316, "tcp" },
+ { "abb-escp", { NULL }, 6316, "udp" },
+ { "repsvc", { NULL }, 6320, "tcp" },
+ { "repsvc", { NULL }, 6320, "udp" },
+ { "emp-server1", { NULL }, 6321, "tcp" },
+ { "emp-server1", { NULL }, 6321, "udp" },
+ { "emp-server2", { NULL }, 6322, "tcp" },
+ { "emp-server2", { NULL }, 6322, "udp" },
+ { "sflow", { NULL }, 6343, "tcp" },
+ { "sflow", { NULL }, 6343, "udp" },
+ { "gnutella-svc", { NULL }, 6346, "tcp" },
+ { "gnutella-svc", { NULL }, 6346, "udp" },
+ { "gnutella-rtr", { NULL }, 6347, "tcp" },
+ { "gnutella-rtr", { NULL }, 6347, "udp" },
+ { "adap", { NULL }, 6350, "tcp" },
+ { "adap", { NULL }, 6350, "udp" },
+ { "pmcs", { NULL }, 6355, "tcp" },
+ { "pmcs", { NULL }, 6355, "udp" },
+ { "metaedit-mu", { NULL }, 6360, "tcp" },
+ { "metaedit-mu", { NULL }, 6360, "udp" },
+ { "metaedit-se", { NULL }, 6370, "tcp" },
+ { "metaedit-se", { NULL }, 6370, "udp" },
+ { "metatude-mds", { NULL }, 6382, "tcp" },
+ { "metatude-mds", { NULL }, 6382, "udp" },
+ { "clariion-evr01", { NULL }, 6389, "tcp" },
+ { "clariion-evr01", { NULL }, 6389, "udp" },
+ { "metaedit-ws", { NULL }, 6390, "tcp" },
+ { "metaedit-ws", { NULL }, 6390, "udp" },
+ { "faxcomservice", { NULL }, 6417, "tcp" },
+ { "faxcomservice", { NULL }, 6417, "udp" },
+ { "syserverremote", { NULL }, 6418, "tcp" },
+ { "svdrp", { NULL }, 6419, "tcp" },
+ { "nim-vdrshell", { NULL }, 6420, "tcp" },
+ { "nim-vdrshell", { NULL }, 6420, "udp" },
+ { "nim-wan", { NULL }, 6421, "tcp" },
+ { "nim-wan", { NULL }, 6421, "udp" },
+ { "pgbouncer", { NULL }, 6432, "tcp" },
+ { "sun-sr-https", { NULL }, 6443, "tcp" },
+ { "sun-sr-https", { NULL }, 6443, "udp" },
+ { "sge_qmaster", { NULL }, 6444, "tcp" },
+ { "sge_qmaster", { NULL }, 6444, "udp" },
+ { "sge_execd", { NULL }, 6445, "tcp" },
+ { "sge_execd", { NULL }, 6445, "udp" },
+ { "mysql-proxy", { NULL }, 6446, "tcp" },
+ { "mysql-proxy", { NULL }, 6446, "udp" },
+ { "skip-cert-recv", { NULL }, 6455, "tcp" },
+ { "skip-cert-send", { NULL }, 6456, "udp" },
+ { "lvision-lm", { NULL }, 6471, "tcp" },
+ { "lvision-lm", { NULL }, 6471, "udp" },
+ { "sun-sr-http", { NULL }, 6480, "tcp" },
+ { "sun-sr-http", { NULL }, 6480, "udp" },
+ { "servicetags", { NULL }, 6481, "tcp" },
+ { "servicetags", { NULL }, 6481, "udp" },
+ { "ldoms-mgmt", { NULL }, 6482, "tcp" },
+ { "ldoms-mgmt", { NULL }, 6482, "udp" },
+ { "SunVTS-RMI", { NULL }, 6483, "tcp" },
+ { "SunVTS-RMI", { NULL }, 6483, "udp" },
+ { "sun-sr-jms", { NULL }, 6484, "tcp" },
+ { "sun-sr-jms", { NULL }, 6484, "udp" },
+ { "sun-sr-iiop", { NULL }, 6485, "tcp" },
+ { "sun-sr-iiop", { NULL }, 6485, "udp" },
+ { "sun-sr-iiops", { NULL }, 6486, "tcp" },
+ { "sun-sr-iiops", { NULL }, 6486, "udp" },
+ { "sun-sr-iiop-aut", { NULL }, 6487, "tcp" },
+ { "sun-sr-iiop-aut", { NULL }, 6487, "udp" },
+ { "sun-sr-jmx", { NULL }, 6488, "tcp" },
+ { "sun-sr-jmx", { NULL }, 6488, "udp" },
+ { "sun-sr-admin", { NULL }, 6489, "tcp" },
+ { "sun-sr-admin", { NULL }, 6489, "udp" },
+ { "boks", { NULL }, 6500, "tcp" },
+ { "boks", { NULL }, 6500, "udp" },
+ { "boks_servc", { NULL }, 6501, "tcp" },
+ { "boks_servc", { NULL }, 6501, "udp" },
+ { "boks_servm", { NULL }, 6502, "tcp" },
+ { "boks_servm", { NULL }, 6502, "udp" },
+ { "boks_clntd", { NULL }, 6503, "tcp" },
+ { "boks_clntd", { NULL }, 6503, "udp" },
+ { "badm_priv", { NULL }, 6505, "tcp" },
+ { "badm_priv", { NULL }, 6505, "udp" },
+ { "badm_pub", { NULL }, 6506, "tcp" },
+ { "badm_pub", { NULL }, 6506, "udp" },
+ { "bdir_priv", { NULL }, 6507, "tcp" },
+ { "bdir_priv", { NULL }, 6507, "udp" },
+ { "bdir_pub", { NULL }, 6508, "tcp" },
+ { "bdir_pub", { NULL }, 6508, "udp" },
+ { "mgcs-mfp-port", { NULL }, 6509, "tcp" },
+ { "mgcs-mfp-port", { NULL }, 6509, "udp" },
+ { "mcer-port", { NULL }, 6510, "tcp" },
+ { "mcer-port", { NULL }, 6510, "udp" },
+ { "netconf-tls", { NULL }, 6513, "tcp" },
+ { "syslog-tls", { NULL }, 6514, "tcp" },
+ { "syslog-tls", { NULL }, 6514, "udp" },
+ { "syslog-tls", { NULL }, 6514, "dccp"},
+ { "elipse-rec", { NULL }, 6515, "tcp" },
+ { "elipse-rec", { NULL }, 6515, "udp" },
+ { "lds-distrib", { NULL }, 6543, "tcp" },
+ { "lds-distrib", { NULL }, 6543, "udp" },
+ { "lds-dump", { NULL }, 6544, "tcp" },
+ { "lds-dump", { NULL }, 6544, "udp" },
+ { "apc-6547", { NULL }, 6547, "tcp" },
+ { "apc-6547", { NULL }, 6547, "udp" },
+ { "apc-6548", { NULL }, 6548, "tcp" },
+ { "apc-6548", { NULL }, 6548, "udp" },
+ { "apc-6549", { NULL }, 6549, "tcp" },
+ { "apc-6549", { NULL }, 6549, "udp" },
+ { "fg-sysupdate", { NULL }, 6550, "tcp" },
+ { "fg-sysupdate", { NULL }, 6550, "udp" },
+ { "sum", { NULL }, 6551, "tcp" },
+ { "sum", { NULL }, 6551, "udp" },
+ { "xdsxdm", { NULL }, 6558, "tcp" },
+ { "xdsxdm", { NULL }, 6558, "udp" },
+ { "sane-port", { NULL }, 6566, "tcp" },
+ { "sane-port", { NULL }, 6566, "udp" },
+ { "esp", { NULL }, 6567, "tcp" },
+ { "esp", { NULL }, 6567, "udp" },
+ { "canit_store", { NULL }, 6568, "tcp" },
+ { "rp-reputation", { NULL }, 6568, "udp" },
+ { "affiliate", { NULL }, 6579, "tcp" },
+ { "affiliate", { NULL }, 6579, "udp" },
+ { "parsec-master", { NULL }, 6580, "tcp" },
+ { "parsec-master", { NULL }, 6580, "udp" },
+ { "parsec-peer", { NULL }, 6581, "tcp" },
+ { "parsec-peer", { NULL }, 6581, "udp" },
+ { "parsec-game", { NULL }, 6582, "tcp" },
+ { "parsec-game", { NULL }, 6582, "udp" },
+ { "joaJewelSuite", { NULL }, 6583, "tcp" },
+ { "joaJewelSuite", { NULL }, 6583, "udp" },
+ { "mshvlm", { NULL }, 6600, "tcp" },
+ { "mstmg-sstp", { NULL }, 6601, "tcp" },
+ { "wsscomfrmwk", { NULL }, 6602, "tcp" },
+ { "odette-ftps", { NULL }, 6619, "tcp" },
+ { "odette-ftps", { NULL }, 6619, "udp" },
+ { "kftp-data", { NULL }, 6620, "tcp" },
+ { "kftp-data", { NULL }, 6620, "udp" },
+ { "kftp", { NULL }, 6621, "tcp" },
+ { "kftp", { NULL }, 6621, "udp" },
+ { "mcftp", { NULL }, 6622, "tcp" },
+ { "mcftp", { NULL }, 6622, "udp" },
+ { "ktelnet", { NULL }, 6623, "tcp" },
+ { "ktelnet", { NULL }, 6623, "udp" },
+ { "datascaler-db", { NULL }, 6624, "tcp" },
+ { "datascaler-ctl", { NULL }, 6625, "tcp" },
+ { "wago-service", { NULL }, 6626, "tcp" },
+ { "wago-service", { NULL }, 6626, "udp" },
+ { "nexgen", { NULL }, 6627, "tcp" },
+ { "nexgen", { NULL }, 6627, "udp" },
+ { "afesc-mc", { NULL }, 6628, "tcp" },
+ { "afesc-mc", { NULL }, 6628, "udp" },
+ { "mxodbc-connect", { NULL }, 6632, "tcp" },
+ { "pcs-sf-ui-man", { NULL }, 6655, "tcp" },
+ { "emgmsg", { NULL }, 6656, "tcp" },
+ { "palcom-disc", { NULL }, 6657, "udp" },
+ { "vocaltec-gold", { NULL }, 6670, "tcp" },
+ { "vocaltec-gold", { NULL }, 6670, "udp" },
+ { "p4p-portal", { NULL }, 6671, "tcp" },
+ { "p4p-portal", { NULL }, 6671, "udp" },
+ { "vision_server", { NULL }, 6672, "tcp" },
+ { "vision_server", { NULL }, 6672, "udp" },
+ { "vision_elmd", { NULL }, 6673, "tcp" },
+ { "vision_elmd", { NULL }, 6673, "udp" },
+ { "vfbp", { NULL }, 6678, "tcp" },
+ { "vfbp-disc", { NULL }, 6678, "udp" },
+ { "osaut", { NULL }, 6679, "tcp" },
+ { "osaut", { NULL }, 6679, "udp" },
+ { "clever-ctrace", { NULL }, 6687, "tcp" },
+ { "clever-tcpip", { NULL }, 6688, "tcp" },
+ { "tsa", { NULL }, 6689, "tcp" },
+ { "tsa", { NULL }, 6689, "udp" },
+ { "babel", { NULL }, 6697, "udp" },
+ { "kti-icad-srvr", { NULL }, 6701, "tcp" },
+ { "kti-icad-srvr", { NULL }, 6701, "udp" },
+ { "e-design-net", { NULL }, 6702, "tcp" },
+ { "e-design-net", { NULL }, 6702, "udp" },
+ { "e-design-web", { NULL }, 6703, "tcp" },
+ { "e-design-web", { NULL }, 6703, "udp" },
+ { "frc-hp", { NULL }, 6704, "sctp"},
+ { "frc-mp", { NULL }, 6705, "sctp"},
+ { "frc-lp", { NULL }, 6706, "sctp"},
+ { "ibprotocol", { NULL }, 6714, "tcp" },
+ { "ibprotocol", { NULL }, 6714, "udp" },
+ { "fibotrader-com", { NULL }, 6715, "tcp" },
+ { "fibotrader-com", { NULL }, 6715, "udp" },
+ { "bmc-perf-agent", { NULL }, 6767, "tcp" },
+ { "bmc-perf-agent", { NULL }, 6767, "udp" },
+ { "bmc-perf-mgrd", { NULL }, 6768, "tcp" },
+ { "bmc-perf-mgrd", { NULL }, 6768, "udp" },
+ { "adi-gxp-srvprt", { NULL }, 6769, "tcp" },
+ { "adi-gxp-srvprt", { NULL }, 6769, "udp" },
+ { "plysrv-http", { NULL }, 6770, "tcp" },
+ { "plysrv-http", { NULL }, 6770, "udp" },
+ { "plysrv-https", { NULL }, 6771, "tcp" },
+ { "plysrv-https", { NULL }, 6771, "udp" },
+ { "dgpf-exchg", { NULL }, 6785, "tcp" },
+ { "dgpf-exchg", { NULL }, 6785, "udp" },
+ { "smc-jmx", { NULL }, 6786, "tcp" },
+ { "smc-jmx", { NULL }, 6786, "udp" },
+ { "smc-admin", { NULL }, 6787, "tcp" },
+ { "smc-admin", { NULL }, 6787, "udp" },
+ { "smc-http", { NULL }, 6788, "tcp" },
+ { "smc-http", { NULL }, 6788, "udp" },
+ { "smc-https", { NULL }, 6789, "tcp" },
+ { "smc-https", { NULL }, 6789, "udp" },
+ { "hnmp", { NULL }, 6790, "tcp" },
+ { "hnmp", { NULL }, 6790, "udp" },
+ { "hnm", { NULL }, 6791, "tcp" },
+ { "hnm", { NULL }, 6791, "udp" },
+ { "acnet", { NULL }, 6801, "tcp" },
+ { "acnet", { NULL }, 6801, "udp" },
+ { "pentbox-sim", { NULL }, 6817, "tcp" },
+ { "ambit-lm", { NULL }, 6831, "tcp" },
+ { "ambit-lm", { NULL }, 6831, "udp" },
+ { "netmo-default", { NULL }, 6841, "tcp" },
+ { "netmo-default", { NULL }, 6841, "udp" },
+ { "netmo-http", { NULL }, 6842, "tcp" },
+ { "netmo-http", { NULL }, 6842, "udp" },
+ { "iccrushmore", { NULL }, 6850, "tcp" },
+ { "iccrushmore", { NULL }, 6850, "udp" },
+ { "acctopus-cc", { NULL }, 6868, "tcp" },
+ { "acctopus-st", { NULL }, 6868, "udp" },
+ { "muse", { NULL }, 6888, "tcp" },
+ { "muse", { NULL }, 6888, "udp" },
+ { "jetstream", { NULL }, 6901, "tcp" },
+ { "xsmsvc", { NULL }, 6936, "tcp" },
+ { "xsmsvc", { NULL }, 6936, "udp" },
+ { "bioserver", { NULL }, 6946, "tcp" },
+ { "bioserver", { NULL }, 6946, "udp" },
+ { "otlp", { NULL }, 6951, "tcp" },
+ { "otlp", { NULL }, 6951, "udp" },
+ { "jmact3", { NULL }, 6961, "tcp" },
+ { "jmact3", { NULL }, 6961, "udp" },
+ { "jmevt2", { NULL }, 6962, "tcp" },
+ { "jmevt2", { NULL }, 6962, "udp" },
+ { "swismgr1", { NULL }, 6963, "tcp" },
+ { "swismgr1", { NULL }, 6963, "udp" },
+ { "swismgr2", { NULL }, 6964, "tcp" },
+ { "swismgr2", { NULL }, 6964, "udp" },
+ { "swistrap", { NULL }, 6965, "tcp" },
+ { "swistrap", { NULL }, 6965, "udp" },
+ { "swispol", { NULL }, 6966, "tcp" },
+ { "swispol", { NULL }, 6966, "udp" },
+ { "acmsoda", { NULL }, 6969, "tcp" },
+ { "acmsoda", { NULL }, 6969, "udp" },
+ { "MobilitySrv", { NULL }, 6997, "tcp" },
+ { "MobilitySrv", { NULL }, 6997, "udp" },
+ { "iatp-highpri", { NULL }, 6998, "tcp" },
+ { "iatp-highpri", { NULL }, 6998, "udp" },
+ { "iatp-normalpri", { NULL }, 6999, "tcp" },
+ { "iatp-normalpri", { NULL }, 6999, "udp" },
+ { "afs3-fileserver", { NULL }, 7000, "tcp" },
+ { "afs3-fileserver", { NULL }, 7000, "udp" },
+ { "afs3-callback", { NULL }, 7001, "tcp" },
+ { "afs3-callback", { NULL }, 7001, "udp" },
+ { "afs3-prserver", { NULL }, 7002, "tcp" },
+ { "afs3-prserver", { NULL }, 7002, "udp" },
+ { "afs3-vlserver", { NULL }, 7003, "tcp" },
+ { "afs3-vlserver", { NULL }, 7003, "udp" },
+ { "afs3-kaserver", { NULL }, 7004, "tcp" },
+ { "afs3-kaserver", { NULL }, 7004, "udp" },
+ { "afs3-volser", { NULL }, 7005, "tcp" },
+ { "afs3-volser", { NULL }, 7005, "udp" },
+ { "afs3-errors", { NULL }, 7006, "tcp" },
+ { "afs3-errors", { NULL }, 7006, "udp" },
+ { "afs3-bos", { NULL }, 7007, "tcp" },
+ { "afs3-bos", { NULL }, 7007, "udp" },
+ { "afs3-update", { NULL }, 7008, "tcp" },
+ { "afs3-update", { NULL }, 7008, "udp" },
+ { "afs3-rmtsys", { NULL }, 7009, "tcp" },
+ { "afs3-rmtsys", { NULL }, 7009, "udp" },
+ { "ups-onlinet", { NULL }, 7010, "tcp" },
+ { "ups-onlinet", { NULL }, 7010, "udp" },
+ { "talon-disc", { NULL }, 7011, "tcp" },
+ { "talon-disc", { NULL }, 7011, "udp" },
+ { "talon-engine", { NULL }, 7012, "tcp" },
+ { "talon-engine", { NULL }, 7012, "udp" },
+ { "microtalon-dis", { NULL }, 7013, "tcp" },
+ { "microtalon-dis", { NULL }, 7013, "udp" },
+ { "microtalon-com", { NULL }, 7014, "tcp" },
+ { "microtalon-com", { NULL }, 7014, "udp" },
+ { "talon-webserver", { NULL }, 7015, "tcp" },
+ { "talon-webserver", { NULL }, 7015, "udp" },
+ { "dpserve", { NULL }, 7020, "tcp" },
+ { "dpserve", { NULL }, 7020, "udp" },
+ { "dpserveadmin", { NULL }, 7021, "tcp" },
+ { "dpserveadmin", { NULL }, 7021, "udp" },
+ { "ctdp", { NULL }, 7022, "tcp" },
+ { "ctdp", { NULL }, 7022, "udp" },
+ { "ct2nmcs", { NULL }, 7023, "tcp" },
+ { "ct2nmcs", { NULL }, 7023, "udp" },
+ { "vmsvc", { NULL }, 7024, "tcp" },
+ { "vmsvc", { NULL }, 7024, "udp" },
+ { "vmsvc-2", { NULL }, 7025, "tcp" },
+ { "vmsvc-2", { NULL }, 7025, "udp" },
+ { "op-probe", { NULL }, 7030, "tcp" },
+ { "op-probe", { NULL }, 7030, "udp" },
+ { "arcp", { NULL }, 7070, "tcp" },
+ { "arcp", { NULL }, 7070, "udp" },
+ { "iwg1", { NULL }, 7071, "tcp" },
+ { "iwg1", { NULL }, 7071, "udp" },
+ { "empowerid", { NULL }, 7080, "tcp" },
+ { "empowerid", { NULL }, 7080, "udp" },
+ { "lazy-ptop", { NULL }, 7099, "tcp" },
+ { "lazy-ptop", { NULL }, 7099, "udp" },
+ { "font-service", { NULL }, 7100, "tcp" },
+ { "font-service", { NULL }, 7100, "udp" },
+ { "elcn", { NULL }, 7101, "tcp" },
+ { "elcn", { NULL }, 7101, "udp" },
+ { "aes-x170", { NULL }, 7107, "udp" },
+ { "virprot-lm", { NULL }, 7121, "tcp" },
+ { "virprot-lm", { NULL }, 7121, "udp" },
+ { "scenidm", { NULL }, 7128, "tcp" },
+ { "scenidm", { NULL }, 7128, "udp" },
+ { "scenccs", { NULL }, 7129, "tcp" },
+ { "scenccs", { NULL }, 7129, "udp" },
+ { "cabsm-comm", { NULL }, 7161, "tcp" },
+ { "cabsm-comm", { NULL }, 7161, "udp" },
+ { "caistoragemgr", { NULL }, 7162, "tcp" },
+ { "caistoragemgr", { NULL }, 7162, "udp" },
+ { "cacsambroker", { NULL }, 7163, "tcp" },
+ { "cacsambroker", { NULL }, 7163, "udp" },
+ { "fsr", { NULL }, 7164, "tcp" },
+ { "fsr", { NULL }, 7164, "udp" },
+ { "doc-server", { NULL }, 7165, "tcp" },
+ { "doc-server", { NULL }, 7165, "udp" },
+ { "aruba-server", { NULL }, 7166, "tcp" },
+ { "aruba-server", { NULL }, 7166, "udp" },
+ { "casrmagent", { NULL }, 7167, "tcp" },
+ { "cnckadserver", { NULL }, 7168, "tcp" },
+ { "ccag-pib", { NULL }, 7169, "tcp" },
+ { "ccag-pib", { NULL }, 7169, "udp" },
+ { "nsrp", { NULL }, 7170, "tcp" },
+ { "nsrp", { NULL }, 7170, "udp" },
+ { "drm-production", { NULL }, 7171, "tcp" },
+ { "drm-production", { NULL }, 7171, "udp" },
+ { "zsecure", { NULL }, 7173, "tcp" },
+ { "clutild", { NULL }, 7174, "tcp" },
+ { "clutild", { NULL }, 7174, "udp" },
+ { "fodms", { NULL }, 7200, "tcp" },
+ { "fodms", { NULL }, 7200, "udp" },
+ { "dlip", { NULL }, 7201, "tcp" },
+ { "dlip", { NULL }, 7201, "udp" },
+ { "ramp", { NULL }, 7227, "tcp" },
+ { "ramp", { NULL }, 7227, "udp" },
+ { "citrixupp", { NULL }, 7228, "tcp" },
+ { "citrixuppg", { NULL }, 7229, "tcp" },
+ { "pads", { NULL }, 7237, "tcp" },
+ { "cnap", { NULL }, 7262, "tcp" },
+ { "cnap", { NULL }, 7262, "udp" },
+ { "watchme-7272", { NULL }, 7272, "tcp" },
+ { "watchme-7272", { NULL }, 7272, "udp" },
+ { "oma-rlp", { NULL }, 7273, "tcp" },
+ { "oma-rlp", { NULL }, 7273, "udp" },
+ { "oma-rlp-s", { NULL }, 7274, "tcp" },
+ { "oma-rlp-s", { NULL }, 7274, "udp" },
+ { "oma-ulp", { NULL }, 7275, "tcp" },
+ { "oma-ulp", { NULL }, 7275, "udp" },
+ { "oma-ilp", { NULL }, 7276, "tcp" },
+ { "oma-ilp", { NULL }, 7276, "udp" },
+ { "oma-ilp-s", { NULL }, 7277, "tcp" },
+ { "oma-ilp-s", { NULL }, 7277, "udp" },
+ { "oma-dcdocbs", { NULL }, 7278, "tcp" },
+ { "oma-dcdocbs", { NULL }, 7278, "udp" },
+ { "ctxlic", { NULL }, 7279, "tcp" },
+ { "ctxlic", { NULL }, 7279, "udp" },
+ { "itactionserver1", { NULL }, 7280, "tcp" },
+ { "itactionserver1", { NULL }, 7280, "udp" },
+ { "itactionserver2", { NULL }, 7281, "tcp" },
+ { "itactionserver2", { NULL }, 7281, "udp" },
+ { "mzca-action", { NULL }, 7282, "tcp" },
+ { "mzca-alert", { NULL }, 7282, "udp" },
+ { "lcm-server", { NULL }, 7365, "tcp" },
+ { "lcm-server", { NULL }, 7365, "udp" },
+ { "mindfilesys", { NULL }, 7391, "tcp" },
+ { "mindfilesys", { NULL }, 7391, "udp" },
+ { "mrssrendezvous", { NULL }, 7392, "tcp" },
+ { "mrssrendezvous", { NULL }, 7392, "udp" },
+ { "nfoldman", { NULL }, 7393, "tcp" },
+ { "nfoldman", { NULL }, 7393, "udp" },
+ { "fse", { NULL }, 7394, "tcp" },
+ { "fse", { NULL }, 7394, "udp" },
+ { "winqedit", { NULL }, 7395, "tcp" },
+ { "winqedit", { NULL }, 7395, "udp" },
+ { "hexarc", { NULL }, 7397, "tcp" },
+ { "hexarc", { NULL }, 7397, "udp" },
+ { "rtps-discovery", { NULL }, 7400, "tcp" },
+ { "rtps-discovery", { NULL }, 7400, "udp" },
+ { "rtps-dd-ut", { NULL }, 7401, "tcp" },
+ { "rtps-dd-ut", { NULL }, 7401, "udp" },
+ { "rtps-dd-mt", { NULL }, 7402, "tcp" },
+ { "rtps-dd-mt", { NULL }, 7402, "udp" },
+ { "ionixnetmon", { NULL }, 7410, "tcp" },
+ { "ionixnetmon", { NULL }, 7410, "udp" },
+ { "mtportmon", { NULL }, 7421, "tcp" },
+ { "mtportmon", { NULL }, 7421, "udp" },
+ { "pmdmgr", { NULL }, 7426, "tcp" },
+ { "pmdmgr", { NULL }, 7426, "udp" },
+ { "oveadmgr", { NULL }, 7427, "tcp" },
+ { "oveadmgr", { NULL }, 7427, "udp" },
+ { "ovladmgr", { NULL }, 7428, "tcp" },
+ { "ovladmgr", { NULL }, 7428, "udp" },
+ { "opi-sock", { NULL }, 7429, "tcp" },
+ { "opi-sock", { NULL }, 7429, "udp" },
+ { "xmpv7", { NULL }, 7430, "tcp" },
+ { "xmpv7", { NULL }, 7430, "udp" },
+ { "pmd", { NULL }, 7431, "tcp" },
+ { "pmd", { NULL }, 7431, "udp" },
+ { "faximum", { NULL }, 7437, "tcp" },
+ { "faximum", { NULL }, 7437, "udp" },
+ { "oracleas-https", { NULL }, 7443, "tcp" },
+ { "oracleas-https", { NULL }, 7443, "udp" },
+ { "rise", { NULL }, 7473, "tcp" },
+ { "rise", { NULL }, 7473, "udp" },
+ { "telops-lmd", { NULL }, 7491, "tcp" },
+ { "telops-lmd", { NULL }, 7491, "udp" },
+ { "silhouette", { NULL }, 7500, "tcp" },
+ { "silhouette", { NULL }, 7500, "udp" },
+ { "ovbus", { NULL }, 7501, "tcp" },
+ { "ovbus", { NULL }, 7501, "udp" },
+ { "acplt", { NULL }, 7509, "tcp" },
+ { "ovhpas", { NULL }, 7510, "tcp" },
+ { "ovhpas", { NULL }, 7510, "udp" },
+ { "pafec-lm", { NULL }, 7511, "tcp" },
+ { "pafec-lm", { NULL }, 7511, "udp" },
+ { "saratoga", { NULL }, 7542, "tcp" },
+ { "saratoga", { NULL }, 7542, "udp" },
+ { "atul", { NULL }, 7543, "tcp" },
+ { "atul", { NULL }, 7543, "udp" },
+ { "nta-ds", { NULL }, 7544, "tcp" },
+ { "nta-ds", { NULL }, 7544, "udp" },
+ { "nta-us", { NULL }, 7545, "tcp" },
+ { "nta-us", { NULL }, 7545, "udp" },
+ { "cfs", { NULL }, 7546, "tcp" },
+ { "cfs", { NULL }, 7546, "udp" },
+ { "cwmp", { NULL }, 7547, "tcp" },
+ { "cwmp", { NULL }, 7547, "udp" },
+ { "tidp", { NULL }, 7548, "tcp" },
+ { "tidp", { NULL }, 7548, "udp" },
+ { "nls-tl", { NULL }, 7549, "tcp" },
+ { "nls-tl", { NULL }, 7549, "udp" },
+ { "sncp", { NULL }, 7560, "tcp" },
+ { "sncp", { NULL }, 7560, "udp" },
+ { "cfw", { NULL }, 7563, "tcp" },
+ { "vsi-omega", { NULL }, 7566, "tcp" },
+ { "vsi-omega", { NULL }, 7566, "udp" },
+ { "dell-eql-asm", { NULL }, 7569, "tcp" },
+ { "aries-kfinder", { NULL }, 7570, "tcp" },
+ { "aries-kfinder", { NULL }, 7570, "udp" },
+ { "sun-lm", { NULL }, 7588, "tcp" },
+ { "sun-lm", { NULL }, 7588, "udp" },
+ { "indi", { NULL }, 7624, "tcp" },
+ { "indi", { NULL }, 7624, "udp" },
+ { "simco", { NULL }, 7626, "tcp" },
+ { "simco", { NULL }, 7626, "sctp"},
+ { "soap-http", { NULL }, 7627, "tcp" },
+ { "soap-http", { NULL }, 7627, "udp" },
+ { "zen-pawn", { NULL }, 7628, "tcp" },
+ { "zen-pawn", { NULL }, 7628, "udp" },
+ { "xdas", { NULL }, 7629, "tcp" },
+ { "xdas", { NULL }, 7629, "udp" },
+ { "hawk", { NULL }, 7630, "tcp" },
+ { "tesla-sys-msg", { NULL }, 7631, "tcp" },
+ { "pmdfmgt", { NULL }, 7633, "tcp" },
+ { "pmdfmgt", { NULL }, 7633, "udp" },
+ { "cuseeme", { NULL }, 7648, "tcp" },
+ { "cuseeme", { NULL }, 7648, "udp" },
+ { "imqstomp", { NULL }, 7672, "tcp" },
+ { "imqstomps", { NULL }, 7673, "tcp" },
+ { "imqtunnels", { NULL }, 7674, "tcp" },
+ { "imqtunnels", { NULL }, 7674, "udp" },
+ { "imqtunnel", { NULL }, 7675, "tcp" },
+ { "imqtunnel", { NULL }, 7675, "udp" },
+ { "imqbrokerd", { NULL }, 7676, "tcp" },
+ { "imqbrokerd", { NULL }, 7676, "udp" },
+ { "sun-user-https", { NULL }, 7677, "tcp" },
+ { "sun-user-https", { NULL }, 7677, "udp" },
+ { "pando-pub", { NULL }, 7680, "tcp" },
+ { "pando-pub", { NULL }, 7680, "udp" },
+ { "collaber", { NULL }, 7689, "tcp" },
+ { "collaber", { NULL }, 7689, "udp" },
+ { "klio", { NULL }, 7697, "tcp" },
+ { "klio", { NULL }, 7697, "udp" },
+ { "em7-secom", { NULL }, 7700, "tcp" },
+ { "sync-em7", { NULL }, 7707, "tcp" },
+ { "sync-em7", { NULL }, 7707, "udp" },
+ { "scinet", { NULL }, 7708, "tcp" },
+ { "scinet", { NULL }, 7708, "udp" },
+ { "medimageportal", { NULL }, 7720, "tcp" },
+ { "medimageportal", { NULL }, 7720, "udp" },
+ { "nsdeepfreezectl", { NULL }, 7724, "tcp" },
+ { "nsdeepfreezectl", { NULL }, 7724, "udp" },
+ { "nitrogen", { NULL }, 7725, "tcp" },
+ { "nitrogen", { NULL }, 7725, "udp" },
+ { "freezexservice", { NULL }, 7726, "tcp" },
+ { "freezexservice", { NULL }, 7726, "udp" },
+ { "trident-data", { NULL }, 7727, "tcp" },
+ { "trident-data", { NULL }, 7727, "udp" },
+ { "smip", { NULL }, 7734, "tcp" },
+ { "smip", { NULL }, 7734, "udp" },
+ { "aiagent", { NULL }, 7738, "tcp" },
+ { "aiagent", { NULL }, 7738, "udp" },
+ { "scriptview", { NULL }, 7741, "tcp" },
+ { "scriptview", { NULL }, 7741, "udp" },
+ { "msss", { NULL }, 7742, "tcp" },
+ { "sstp-1", { NULL }, 7743, "tcp" },
+ { "sstp-1", { NULL }, 7743, "udp" },
+ { "raqmon-pdu", { NULL }, 7744, "tcp" },
+ { "raqmon-pdu", { NULL }, 7744, "udp" },
+ { "prgp", { NULL }, 7747, "tcp" },
+ { "prgp", { NULL }, 7747, "udp" },
+ { "cbt", { NULL }, 7777, "tcp" },
+ { "cbt", { NULL }, 7777, "udp" },
+ { "interwise", { NULL }, 7778, "tcp" },
+ { "interwise", { NULL }, 7778, "udp" },
+ { "vstat", { NULL }, 7779, "tcp" },
+ { "vstat", { NULL }, 7779, "udp" },
+ { "accu-lmgr", { NULL }, 7781, "tcp" },
+ { "accu-lmgr", { NULL }, 7781, "udp" },
+ { "minivend", { NULL }, 7786, "tcp" },
+ { "minivend", { NULL }, 7786, "udp" },
+ { "popup-reminders", { NULL }, 7787, "tcp" },
+ { "popup-reminders", { NULL }, 7787, "udp" },
+ { "office-tools", { NULL }, 7789, "tcp" },
+ { "office-tools", { NULL }, 7789, "udp" },
+ { "q3ade", { NULL }, 7794, "tcp" },
+ { "q3ade", { NULL }, 7794, "udp" },
+ { "pnet-conn", { NULL }, 7797, "tcp" },
+ { "pnet-conn", { NULL }, 7797, "udp" },
+ { "pnet-enc", { NULL }, 7798, "tcp" },
+ { "pnet-enc", { NULL }, 7798, "udp" },
+ { "altbsdp", { NULL }, 7799, "tcp" },
+ { "altbsdp", { NULL }, 7799, "udp" },
+ { "asr", { NULL }, 7800, "tcp" },
+ { "asr", { NULL }, 7800, "udp" },
+ { "ssp-client", { NULL }, 7801, "tcp" },
+ { "ssp-client", { NULL }, 7801, "udp" },
+ { "rbt-wanopt", { NULL }, 7810, "tcp" },
+ { "rbt-wanopt", { NULL }, 7810, "udp" },
+ { "apc-7845", { NULL }, 7845, "tcp" },
+ { "apc-7845", { NULL }, 7845, "udp" },
+ { "apc-7846", { NULL }, 7846, "tcp" },
+ { "apc-7846", { NULL }, 7846, "udp" },
+ { "mobileanalyzer", { NULL }, 7869, "tcp" },
+ { "rbt-smc", { NULL }, 7870, "tcp" },
+ { "pss", { NULL }, 7880, "tcp" },
+ { "pss", { NULL }, 7880, "udp" },
+ { "ubroker", { NULL }, 7887, "tcp" },
+ { "ubroker", { NULL }, 7887, "udp" },
+ { "mevent", { NULL }, 7900, "tcp" },
+ { "mevent", { NULL }, 7900, "udp" },
+ { "tnos-sp", { NULL }, 7901, "tcp" },
+ { "tnos-sp", { NULL }, 7901, "udp" },
+ { "tnos-dp", { NULL }, 7902, "tcp" },
+ { "tnos-dp", { NULL }, 7902, "udp" },
+ { "tnos-dps", { NULL }, 7903, "tcp" },
+ { "tnos-dps", { NULL }, 7903, "udp" },
+ { "qo-secure", { NULL }, 7913, "tcp" },
+ { "qo-secure", { NULL }, 7913, "udp" },
+ { "t2-drm", { NULL }, 7932, "tcp" },
+ { "t2-drm", { NULL }, 7932, "udp" },
+ { "t2-brm", { NULL }, 7933, "tcp" },
+ { "t2-brm", { NULL }, 7933, "udp" },
+ { "supercell", { NULL }, 7967, "tcp" },
+ { "supercell", { NULL }, 7967, "udp" },
+ { "micromuse-ncps", { NULL }, 7979, "tcp" },
+ { "micromuse-ncps", { NULL }, 7979, "udp" },
+ { "quest-vista", { NULL }, 7980, "tcp" },
+ { "quest-vista", { NULL }, 7980, "udp" },
+ { "sossd-collect", { NULL }, 7981, "tcp" },
+ { "sossd-agent", { NULL }, 7982, "tcp" },
+ { "sossd-disc", { NULL }, 7982, "udp" },
+ { "pushns", { NULL }, 7997, "tcp" },
+ { "usicontentpush", { NULL }, 7998, "udp" },
+ { "irdmi2", { NULL }, 7999, "tcp" },
+ { "irdmi2", { NULL }, 7999, "udp" },
+ { "irdmi", { NULL }, 8000, "tcp" },
+ { "irdmi", { NULL }, 8000, "udp" },
+ { "vcom-tunnel", { NULL }, 8001, "tcp" },
+ { "vcom-tunnel", { NULL }, 8001, "udp" },
+ { "teradataordbms", { NULL }, 8002, "tcp" },
+ { "teradataordbms", { NULL }, 8002, "udp" },
+ { "mcreport", { NULL }, 8003, "tcp" },
+ { "mcreport", { NULL }, 8003, "udp" },
+ { "mxi", { NULL }, 8005, "tcp" },
+ { "mxi", { NULL }, 8005, "udp" },
+ { "http-alt", { NULL }, 8008, "tcp" },
+ { "http-alt", { NULL }, 8008, "udp" },
+ { "qbdb", { NULL }, 8019, "tcp" },
+ { "qbdb", { NULL }, 8019, "udp" },
+ { "intu-ec-svcdisc", { NULL }, 8020, "tcp" },
+ { "intu-ec-svcdisc", { NULL }, 8020, "udp" },
+ { "intu-ec-client", { NULL }, 8021, "tcp" },
+ { "intu-ec-client", { NULL }, 8021, "udp" },
+ { "oa-system", { NULL }, 8022, "tcp" },
+ { "oa-system", { NULL }, 8022, "udp" },
+ { "ca-audit-da", { NULL }, 8025, "tcp" },
+ { "ca-audit-da", { NULL }, 8025, "udp" },
+ { "ca-audit-ds", { NULL }, 8026, "tcp" },
+ { "ca-audit-ds", { NULL }, 8026, "udp" },
+ { "pro-ed", { NULL }, 8032, "tcp" },
+ { "pro-ed", { NULL }, 8032, "udp" },
+ { "mindprint", { NULL }, 8033, "tcp" },
+ { "mindprint", { NULL }, 8033, "udp" },
+ { "vantronix-mgmt", { NULL }, 8034, "tcp" },
+ { "vantronix-mgmt", { NULL }, 8034, "udp" },
+ { "ampify", { NULL }, 8040, "tcp" },
+ { "ampify", { NULL }, 8040, "udp" },
+ { "fs-agent", { NULL }, 8042, "tcp" },
+ { "fs-server", { NULL }, 8043, "tcp" },
+ { "fs-mgmt", { NULL }, 8044, "tcp" },
+ { "senomix01", { NULL }, 8052, "tcp" },
+ { "senomix01", { NULL }, 8052, "udp" },
+ { "senomix02", { NULL }, 8053, "tcp" },
+ { "senomix02", { NULL }, 8053, "udp" },
+ { "senomix03", { NULL }, 8054, "tcp" },
+ { "senomix03", { NULL }, 8054, "udp" },
+ { "senomix04", { NULL }, 8055, "tcp" },
+ { "senomix04", { NULL }, 8055, "udp" },
+ { "senomix05", { NULL }, 8056, "tcp" },
+ { "senomix05", { NULL }, 8056, "udp" },
+ { "senomix06", { NULL }, 8057, "tcp" },
+ { "senomix06", { NULL }, 8057, "udp" },
+ { "senomix07", { NULL }, 8058, "tcp" },
+ { "senomix07", { NULL }, 8058, "udp" },
+ { "senomix08", { NULL }, 8059, "tcp" },
+ { "senomix08", { NULL }, 8059, "udp" },
+ { "gadugadu", { NULL }, 8074, "tcp" },
+ { "gadugadu", { NULL }, 8074, "udp" },
+ { "http-alt", { NULL }, 8080, "tcp" },
+ { "http-alt", { NULL }, 8080, "udp" },
+ { "sunproxyadmin", { NULL }, 8081, "tcp" },
+ { "sunproxyadmin", { NULL }, 8081, "udp" },
+ { "us-cli", { NULL }, 8082, "tcp" },
+ { "us-cli", { NULL }, 8082, "udp" },
+ { "us-srv", { NULL }, 8083, "tcp" },
+ { "us-srv", { NULL }, 8083, "udp" },
+ { "d-s-n", { NULL }, 8086, "tcp" },
+ { "d-s-n", { NULL }, 8086, "udp" },
+ { "simplifymedia", { NULL }, 8087, "tcp" },
+ { "simplifymedia", { NULL }, 8087, "udp" },
+ { "radan-http", { NULL }, 8088, "tcp" },
+ { "radan-http", { NULL }, 8088, "udp" },
+ { "jamlink", { NULL }, 8091, "tcp" },
+ { "sac", { NULL }, 8097, "tcp" },
+ { "sac", { NULL }, 8097, "udp" },
+ { "xprint-server", { NULL }, 8100, "tcp" },
+ { "xprint-server", { NULL }, 8100, "udp" },
+ { "ldoms-migr", { NULL }, 8101, "tcp" },
+ { "mtl8000-matrix", { NULL }, 8115, "tcp" },
+ { "mtl8000-matrix", { NULL }, 8115, "udp" },
+ { "cp-cluster", { NULL }, 8116, "tcp" },
+ { "cp-cluster", { NULL }, 8116, "udp" },
+ { "privoxy", { NULL }, 8118, "tcp" },
+ { "privoxy", { NULL }, 8118, "udp" },
+ { "apollo-data", { NULL }, 8121, "tcp" },
+ { "apollo-data", { NULL }, 8121, "udp" },
+ { "apollo-admin", { NULL }, 8122, "tcp" },
+ { "apollo-admin", { NULL }, 8122, "udp" },
+ { "paycash-online", { NULL }, 8128, "tcp" },
+ { "paycash-online", { NULL }, 8128, "udp" },
+ { "paycash-wbp", { NULL }, 8129, "tcp" },
+ { "paycash-wbp", { NULL }, 8129, "udp" },
+ { "indigo-vrmi", { NULL }, 8130, "tcp" },
+ { "indigo-vrmi", { NULL }, 8130, "udp" },
+ { "indigo-vbcp", { NULL }, 8131, "tcp" },
+ { "indigo-vbcp", { NULL }, 8131, "udp" },
+ { "dbabble", { NULL }, 8132, "tcp" },
+ { "dbabble", { NULL }, 8132, "udp" },
+ { "isdd", { NULL }, 8148, "tcp" },
+ { "isdd", { NULL }, 8148, "udp" },
+ { "patrol", { NULL }, 8160, "tcp" },
+ { "patrol", { NULL }, 8160, "udp" },
+ { "patrol-snmp", { NULL }, 8161, "tcp" },
+ { "patrol-snmp", { NULL }, 8161, "udp" },
+ { "vmware-fdm", { NULL }, 8182, "tcp" },
+ { "vmware-fdm", { NULL }, 8182, "udp" },
+ { "proremote", { NULL }, 8183, "tcp" },
+ { "itach", { NULL }, 8184, "tcp" },
+ { "itach", { NULL }, 8184, "udp" },
+ { "spytechphone", { NULL }, 8192, "tcp" },
+ { "spytechphone", { NULL }, 8192, "udp" },
+ { "blp1", { NULL }, 8194, "tcp" },
+ { "blp1", { NULL }, 8194, "udp" },
+ { "blp2", { NULL }, 8195, "tcp" },
+ { "blp2", { NULL }, 8195, "udp" },
+ { "vvr-data", { NULL }, 8199, "tcp" },
+ { "vvr-data", { NULL }, 8199, "udp" },
+ { "trivnet1", { NULL }, 8200, "tcp" },
+ { "trivnet1", { NULL }, 8200, "udp" },
+ { "trivnet2", { NULL }, 8201, "tcp" },
+ { "trivnet2", { NULL }, 8201, "udp" },
+ { "lm-perfworks", { NULL }, 8204, "tcp" },
+ { "lm-perfworks", { NULL }, 8204, "udp" },
+ { "lm-instmgr", { NULL }, 8205, "tcp" },
+ { "lm-instmgr", { NULL }, 8205, "udp" },
+ { "lm-dta", { NULL }, 8206, "tcp" },
+ { "lm-dta", { NULL }, 8206, "udp" },
+ { "lm-sserver", { NULL }, 8207, "tcp" },
+ { "lm-sserver", { NULL }, 8207, "udp" },
+ { "lm-webwatcher", { NULL }, 8208, "tcp" },
+ { "lm-webwatcher", { NULL }, 8208, "udp" },
+ { "rexecj", { NULL }, 8230, "tcp" },
+ { "rexecj", { NULL }, 8230, "udp" },
+ { "synapse-nhttps", { NULL }, 8243, "tcp" },
+ { "synapse-nhttps", { NULL }, 8243, "udp" },
+ { "pando-sec", { NULL }, 8276, "tcp" },
+ { "pando-sec", { NULL }, 8276, "udp" },
+ { "synapse-nhttp", { NULL }, 8280, "tcp" },
+ { "synapse-nhttp", { NULL }, 8280, "udp" },
+ { "blp3", { NULL }, 8292, "tcp" },
+ { "blp3", { NULL }, 8292, "udp" },
+ { "hiperscan-id", { NULL }, 8293, "tcp" },
+ { "blp4", { NULL }, 8294, "tcp" },
+ { "blp4", { NULL }, 8294, "udp" },
+ { "tmi", { NULL }, 8300, "tcp" },
+ { "tmi", { NULL }, 8300, "udp" },
+ { "amberon", { NULL }, 8301, "tcp" },
+ { "amberon", { NULL }, 8301, "udp" },
+ { "tnp-discover", { NULL }, 8320, "tcp" },
+ { "tnp-discover", { NULL }, 8320, "udp" },
+ { "tnp", { NULL }, 8321, "tcp" },
+ { "tnp", { NULL }, 8321, "udp" },
+ { "server-find", { NULL }, 8351, "tcp" },
+ { "server-find", { NULL }, 8351, "udp" },
+ { "cruise-enum", { NULL }, 8376, "tcp" },
+ { "cruise-enum", { NULL }, 8376, "udp" },
+ { "cruise-swroute", { NULL }, 8377, "tcp" },
+ { "cruise-swroute", { NULL }, 8377, "udp" },
+ { "cruise-config", { NULL }, 8378, "tcp" },
+ { "cruise-config", { NULL }, 8378, "udp" },
+ { "cruise-diags", { NULL }, 8379, "tcp" },
+ { "cruise-diags", { NULL }, 8379, "udp" },
+ { "cruise-update", { NULL }, 8380, "tcp" },
+ { "cruise-update", { NULL }, 8380, "udp" },
+ { "m2mservices", { NULL }, 8383, "tcp" },
+ { "m2mservices", { NULL }, 8383, "udp" },
+ { "cvd", { NULL }, 8400, "tcp" },
+ { "cvd", { NULL }, 8400, "udp" },
+ { "sabarsd", { NULL }, 8401, "tcp" },
+ { "sabarsd", { NULL }, 8401, "udp" },
+ { "abarsd", { NULL }, 8402, "tcp" },
+ { "abarsd", { NULL }, 8402, "udp" },
+ { "admind", { NULL }, 8403, "tcp" },
+ { "admind", { NULL }, 8403, "udp" },
+ { "svcloud", { NULL }, 8404, "tcp" },
+ { "svbackup", { NULL }, 8405, "tcp" },
+ { "espeech", { NULL }, 8416, "tcp" },
+ { "espeech", { NULL }, 8416, "udp" },
+ { "espeech-rtp", { NULL }, 8417, "tcp" },
+ { "espeech-rtp", { NULL }, 8417, "udp" },
+ { "cybro-a-bus", { NULL }, 8442, "tcp" },
+ { "cybro-a-bus", { NULL }, 8442, "udp" },
+ { "pcsync-https", { NULL }, 8443, "tcp" },
+ { "pcsync-https", { NULL }, 8443, "udp" },
+ { "pcsync-http", { NULL }, 8444, "tcp" },
+ { "pcsync-http", { NULL }, 8444, "udp" },
+ { "npmp", { NULL }, 8450, "tcp" },
+ { "npmp", { NULL }, 8450, "udp" },
+ { "cisco-avp", { NULL }, 8470, "tcp" },
+ { "pim-port", { NULL }, 8471, "tcp" },
+ { "pim-port", { NULL }, 8471, "sctp"},
+ { "otv", { NULL }, 8472, "tcp" },
+ { "otv", { NULL }, 8472, "udp" },
+ { "vp2p", { NULL }, 8473, "tcp" },
+ { "vp2p", { NULL }, 8473, "udp" },
+ { "noteshare", { NULL }, 8474, "tcp" },
+ { "noteshare", { NULL }, 8474, "udp" },
+ { "fmtp", { NULL }, 8500, "tcp" },
+ { "fmtp", { NULL }, 8500, "udp" },
+ { "rtsp-alt", { NULL }, 8554, "tcp" },
+ { "rtsp-alt", { NULL }, 8554, "udp" },
+ { "d-fence", { NULL }, 8555, "tcp" },
+ { "d-fence", { NULL }, 8555, "udp" },
+ { "oap-admin", { NULL }, 8567, "tcp" },
+ { "oap-admin", { NULL }, 8567, "udp" },
+ { "asterix", { NULL }, 8600, "tcp" },
+ { "asterix", { NULL }, 8600, "udp" },
+ { "canon-mfnp", { NULL }, 8610, "tcp" },
+ { "canon-mfnp", { NULL }, 8610, "udp" },
+ { "canon-bjnp1", { NULL }, 8611, "tcp" },
+ { "canon-bjnp1", { NULL }, 8611, "udp" },
+ { "canon-bjnp2", { NULL }, 8612, "tcp" },
+ { "canon-bjnp2", { NULL }, 8612, "udp" },
+ { "canon-bjnp3", { NULL }, 8613, "tcp" },
+ { "canon-bjnp3", { NULL }, 8613, "udp" },
+ { "canon-bjnp4", { NULL }, 8614, "tcp" },
+ { "canon-bjnp4", { NULL }, 8614, "udp" },
+ { "sun-as-jmxrmi", { NULL }, 8686, "tcp" },
+ { "sun-as-jmxrmi", { NULL }, 8686, "udp" },
+ { "vnyx", { NULL }, 8699, "tcp" },
+ { "vnyx", { NULL }, 8699, "udp" },
+ { "dtp-net", { NULL }, 8732, "udp" },
+ { "ibus", { NULL }, 8733, "tcp" },
+ { "ibus", { NULL }, 8733, "udp" },
+ { "mc-appserver", { NULL }, 8763, "tcp" },
+ { "mc-appserver", { NULL }, 8763, "udp" },
+ { "openqueue", { NULL }, 8764, "tcp" },
+ { "openqueue", { NULL }, 8764, "udp" },
+ { "ultraseek-http", { NULL }, 8765, "tcp" },
+ { "ultraseek-http", { NULL }, 8765, "udp" },
+ { "dpap", { NULL }, 8770, "tcp" },
+ { "dpap", { NULL }, 8770, "udp" },
+ { "msgclnt", { NULL }, 8786, "tcp" },
+ { "msgclnt", { NULL }, 8786, "udp" },
+ { "msgsrvr", { NULL }, 8787, "tcp" },
+ { "msgsrvr", { NULL }, 8787, "udp" },
+ { "sunwebadmin", { NULL }, 8800, "tcp" },
+ { "sunwebadmin", { NULL }, 8800, "udp" },
+ { "truecm", { NULL }, 8804, "tcp" },
+ { "truecm", { NULL }, 8804, "udp" },
+ { "dxspider", { NULL }, 8873, "tcp" },
+ { "dxspider", { NULL }, 8873, "udp" },
+ { "cddbp-alt", { NULL }, 8880, "tcp" },
+ { "cddbp-alt", { NULL }, 8880, "udp" },
+ { "secure-mqtt", { NULL }, 8883, "tcp" },
+ { "secure-mqtt", { NULL }, 8883, "udp" },
+ { "ddi-tcp-1", { NULL }, 8888, "tcp" },
+ { "ddi-udp-1", { NULL }, 8888, "udp" },
+ { "ddi-tcp-2", { NULL }, 8889, "tcp" },
+ { "ddi-udp-2", { NULL }, 8889, "udp" },
+ { "ddi-tcp-3", { NULL }, 8890, "tcp" },
+ { "ddi-udp-3", { NULL }, 8890, "udp" },
+ { "ddi-tcp-4", { NULL }, 8891, "tcp" },
+ { "ddi-udp-4", { NULL }, 8891, "udp" },
+ { "ddi-tcp-5", { NULL }, 8892, "tcp" },
+ { "ddi-udp-5", { NULL }, 8892, "udp" },
+ { "ddi-tcp-6", { NULL }, 8893, "tcp" },
+ { "ddi-udp-6", { NULL }, 8893, "udp" },
+ { "ddi-tcp-7", { NULL }, 8894, "tcp" },
+ { "ddi-udp-7", { NULL }, 8894, "udp" },
+ { "ospf-lite", { NULL }, 8899, "tcp" },
+ { "ospf-lite", { NULL }, 8899, "udp" },
+ { "jmb-cds1", { NULL }, 8900, "tcp" },
+ { "jmb-cds1", { NULL }, 8900, "udp" },
+ { "jmb-cds2", { NULL }, 8901, "tcp" },
+ { "jmb-cds2", { NULL }, 8901, "udp" },
+ { "manyone-http", { NULL }, 8910, "tcp" },
+ { "manyone-http", { NULL }, 8910, "udp" },
+ { "manyone-xml", { NULL }, 8911, "tcp" },
+ { "manyone-xml", { NULL }, 8911, "udp" },
+ { "wcbackup", { NULL }, 8912, "tcp" },
+ { "wcbackup", { NULL }, 8912, "udp" },
+ { "dragonfly", { NULL }, 8913, "tcp" },
+ { "dragonfly", { NULL }, 8913, "udp" },
+ { "twds", { NULL }, 8937, "tcp" },
+ { "cumulus-admin", { NULL }, 8954, "tcp" },
+ { "cumulus-admin", { NULL }, 8954, "udp" },
+ { "sunwebadmins", { NULL }, 8989, "tcp" },
+ { "sunwebadmins", { NULL }, 8989, "udp" },
+ { "http-wmap", { NULL }, 8990, "tcp" },
+ { "http-wmap", { NULL }, 8990, "udp" },
+ { "https-wmap", { NULL }, 8991, "tcp" },
+ { "https-wmap", { NULL }, 8991, "udp" },
+ { "bctp", { NULL }, 8999, "tcp" },
+ { "bctp", { NULL }, 8999, "udp" },
+ { "cslistener", { NULL }, 9000, "tcp" },
+ { "cslistener", { NULL }, 9000, "udp" },
+ { "etlservicemgr", { NULL }, 9001, "tcp" },
+ { "etlservicemgr", { NULL }, 9001, "udp" },
+ { "dynamid", { NULL }, 9002, "tcp" },
+ { "dynamid", { NULL }, 9002, "udp" },
+ { "ogs-client", { NULL }, 9007, "udp" },
+ { "ogs-server", { NULL }, 9008, "tcp" },
+ { "pichat", { NULL }, 9009, "tcp" },
+ { "pichat", { NULL }, 9009, "udp" },
+ { "sdr", { NULL }, 9010, "tcp" },
+ { "tambora", { NULL }, 9020, "tcp" },
+ { "tambora", { NULL }, 9020, "udp" },
+ { "panagolin-ident", { NULL }, 9021, "tcp" },
+ { "panagolin-ident", { NULL }, 9021, "udp" },
+ { "paragent", { NULL }, 9022, "tcp" },
+ { "paragent", { NULL }, 9022, "udp" },
+ { "swa-1", { NULL }, 9023, "tcp" },
+ { "swa-1", { NULL }, 9023, "udp" },
+ { "swa-2", { NULL }, 9024, "tcp" },
+ { "swa-2", { NULL }, 9024, "udp" },
+ { "swa-3", { NULL }, 9025, "tcp" },
+ { "swa-3", { NULL }, 9025, "udp" },
+ { "swa-4", { NULL }, 9026, "tcp" },
+ { "swa-4", { NULL }, 9026, "udp" },
+ { "versiera", { NULL }, 9050, "tcp" },
+ { "fio-cmgmt", { NULL }, 9051, "tcp" },
+ { "glrpc", { NULL }, 9080, "tcp" },
+ { "glrpc", { NULL }, 9080, "udp" },
+ { "lcs-ap", { NULL }, 9082, "sctp"},
+ { "emc-pp-mgmtsvc", { NULL }, 9083, "tcp" },
+ { "aurora", { NULL }, 9084, "tcp" },
+ { "aurora", { NULL }, 9084, "udp" },
+ { "aurora", { NULL }, 9084, "sctp"},
+ { "ibm-rsyscon", { NULL }, 9085, "tcp" },
+ { "ibm-rsyscon", { NULL }, 9085, "udp" },
+ { "net2display", { NULL }, 9086, "tcp" },
+ { "net2display", { NULL }, 9086, "udp" },
+ { "classic", { NULL }, 9087, "tcp" },
+ { "classic", { NULL }, 9087, "udp" },
+ { "sqlexec", { NULL }, 9088, "tcp" },
+ { "sqlexec", { NULL }, 9088, "udp" },
+ { "sqlexec-ssl", { NULL }, 9089, "tcp" },
+ { "sqlexec-ssl", { NULL }, 9089, "udp" },
+ { "websm", { NULL }, 9090, "tcp" },
+ { "websm", { NULL }, 9090, "udp" },
+ { "xmltec-xmlmail", { NULL }, 9091, "tcp" },
+ { "xmltec-xmlmail", { NULL }, 9091, "udp" },
+ { "XmlIpcRegSvc", { NULL }, 9092, "tcp" },
+ { "XmlIpcRegSvc", { NULL }, 9092, "udp" },
+ { "hp-pdl-datastr", { NULL }, 9100, "tcp" },
+ { "hp-pdl-datastr", { NULL }, 9100, "udp" },
+ { "pdl-datastream", { NULL }, 9100, "tcp" },
+ { "pdl-datastream", { NULL }, 9100, "udp" },
+ { "bacula-dir", { NULL }, 9101, "tcp" },
+ { "bacula-dir", { NULL }, 9101, "udp" },
+ { "bacula-fd", { NULL }, 9102, "tcp" },
+ { "bacula-fd", { NULL }, 9102, "udp" },
+ { "bacula-sd", { NULL }, 9103, "tcp" },
+ { "bacula-sd", { NULL }, 9103, "udp" },
+ { "peerwire", { NULL }, 9104, "tcp" },
+ { "peerwire", { NULL }, 9104, "udp" },
+ { "xadmin", { NULL }, 9105, "tcp" },
+ { "xadmin", { NULL }, 9105, "udp" },
+ { "astergate", { NULL }, 9106, "tcp" },
+ { "astergate-disc", { NULL }, 9106, "udp" },
+ { "astergatefax", { NULL }, 9107, "tcp" },
+ { "mxit", { NULL }, 9119, "tcp" },
+ { "mxit", { NULL }, 9119, "udp" },
+ { "dddp", { NULL }, 9131, "tcp" },
+ { "dddp", { NULL }, 9131, "udp" },
+ { "apani1", { NULL }, 9160, "tcp" },
+ { "apani1", { NULL }, 9160, "udp" },
+ { "apani2", { NULL }, 9161, "tcp" },
+ { "apani2", { NULL }, 9161, "udp" },
+ { "apani3", { NULL }, 9162, "tcp" },
+ { "apani3", { NULL }, 9162, "udp" },
+ { "apani4", { NULL }, 9163, "tcp" },
+ { "apani4", { NULL }, 9163, "udp" },
+ { "apani5", { NULL }, 9164, "tcp" },
+ { "apani5", { NULL }, 9164, "udp" },
+ { "sun-as-jpda", { NULL }, 9191, "tcp" },
+ { "sun-as-jpda", { NULL }, 9191, "udp" },
+ { "wap-wsp", { NULL }, 9200, "tcp" },
+ { "wap-wsp", { NULL }, 9200, "udp" },
+ { "wap-wsp-wtp", { NULL }, 9201, "tcp" },
+ { "wap-wsp-wtp", { NULL }, 9201, "udp" },
+ { "wap-wsp-s", { NULL }, 9202, "tcp" },
+ { "wap-wsp-s", { NULL }, 9202, "udp" },
+ { "wap-wsp-wtp-s", { NULL }, 9203, "tcp" },
+ { "wap-wsp-wtp-s", { NULL }, 9203, "udp" },
+ { "wap-vcard", { NULL }, 9204, "tcp" },
+ { "wap-vcard", { NULL }, 9204, "udp" },
+ { "wap-vcal", { NULL }, 9205, "tcp" },
+ { "wap-vcal", { NULL }, 9205, "udp" },
+ { "wap-vcard-s", { NULL }, 9206, "tcp" },
+ { "wap-vcard-s", { NULL }, 9206, "udp" },
+ { "wap-vcal-s", { NULL }, 9207, "tcp" },
+ { "wap-vcal-s", { NULL }, 9207, "udp" },
+ { "rjcdb-vcards", { NULL }, 9208, "tcp" },
+ { "rjcdb-vcards", { NULL }, 9208, "udp" },
+ { "almobile-system", { NULL }, 9209, "tcp" },
+ { "almobile-system", { NULL }, 9209, "udp" },
+ { "oma-mlp", { NULL }, 9210, "tcp" },
+ { "oma-mlp", { NULL }, 9210, "udp" },
+ { "oma-mlp-s", { NULL }, 9211, "tcp" },
+ { "oma-mlp-s", { NULL }, 9211, "udp" },
+ { "serverviewdbms", { NULL }, 9212, "tcp" },
+ { "serverviewdbms", { NULL }, 9212, "udp" },
+ { "serverstart", { NULL }, 9213, "tcp" },
+ { "serverstart", { NULL }, 9213, "udp" },
+ { "ipdcesgbs", { NULL }, 9214, "tcp" },
+ { "ipdcesgbs", { NULL }, 9214, "udp" },
+ { "insis", { NULL }, 9215, "tcp" },
+ { "insis", { NULL }, 9215, "udp" },
+ { "acme", { NULL }, 9216, "tcp" },
+ { "acme", { NULL }, 9216, "udp" },
+ { "fsc-port", { NULL }, 9217, "tcp" },
+ { "fsc-port", { NULL }, 9217, "udp" },
+ { "teamcoherence", { NULL }, 9222, "tcp" },
+ { "teamcoherence", { NULL }, 9222, "udp" },
+ { "mon", { NULL }, 9255, "tcp" },
+ { "mon", { NULL }, 9255, "udp" },
+ { "pegasus", { NULL }, 9278, "tcp" },
+ { "pegasus", { NULL }, 9278, "udp" },
+ { "pegasus-ctl", { NULL }, 9279, "tcp" },
+ { "pegasus-ctl", { NULL }, 9279, "udp" },
+ { "pgps", { NULL }, 9280, "tcp" },
+ { "pgps", { NULL }, 9280, "udp" },
+ { "swtp-port1", { NULL }, 9281, "tcp" },
+ { "swtp-port1", { NULL }, 9281, "udp" },
+ { "swtp-port2", { NULL }, 9282, "tcp" },
+ { "swtp-port2", { NULL }, 9282, "udp" },
+ { "callwaveiam", { NULL }, 9283, "tcp" },
+ { "callwaveiam", { NULL }, 9283, "udp" },
+ { "visd", { NULL }, 9284, "tcp" },
+ { "visd", { NULL }, 9284, "udp" },
+ { "n2h2server", { NULL }, 9285, "tcp" },
+ { "n2h2server", { NULL }, 9285, "udp" },
+ { "n2receive", { NULL }, 9286, "udp" },
+ { "cumulus", { NULL }, 9287, "tcp" },
+ { "cumulus", { NULL }, 9287, "udp" },
+ { "armtechdaemon", { NULL }, 9292, "tcp" },
+ { "armtechdaemon", { NULL }, 9292, "udp" },
+ { "storview", { NULL }, 9293, "tcp" },
+ { "storview", { NULL }, 9293, "udp" },
+ { "armcenterhttp", { NULL }, 9294, "tcp" },
+ { "armcenterhttp", { NULL }, 9294, "udp" },
+ { "armcenterhttps", { NULL }, 9295, "tcp" },
+ { "armcenterhttps", { NULL }, 9295, "udp" },
+ { "vrace", { NULL }, 9300, "tcp" },
+ { "vrace", { NULL }, 9300, "udp" },
+ { "sphinxql", { NULL }, 9306, "tcp" },
+ { "sphinxapi", { NULL }, 9312, "tcp" },
+ { "secure-ts", { NULL }, 9318, "tcp" },
+ { "secure-ts", { NULL }, 9318, "udp" },
+ { "guibase", { NULL }, 9321, "tcp" },
+ { "guibase", { NULL }, 9321, "udp" },
+ { "mpidcmgr", { NULL }, 9343, "tcp" },
+ { "mpidcmgr", { NULL }, 9343, "udp" },
+ { "mphlpdmc", { NULL }, 9344, "tcp" },
+ { "mphlpdmc", { NULL }, 9344, "udp" },
+ { "ctechlicensing", { NULL }, 9346, "tcp" },
+ { "ctechlicensing", { NULL }, 9346, "udp" },
+ { "fjdmimgr", { NULL }, 9374, "tcp" },
+ { "fjdmimgr", { NULL }, 9374, "udp" },
+ { "boxp", { NULL }, 9380, "tcp" },
+ { "boxp", { NULL }, 9380, "udp" },
+ { "d2dconfig", { NULL }, 9387, "tcp" },
+ { "d2ddatatrans", { NULL }, 9388, "tcp" },
+ { "adws", { NULL }, 9389, "tcp" },
+ { "otp", { NULL }, 9390, "tcp" },
+ { "fjinvmgr", { NULL }, 9396, "tcp" },
+ { "fjinvmgr", { NULL }, 9396, "udp" },
+ { "mpidcagt", { NULL }, 9397, "tcp" },
+ { "mpidcagt", { NULL }, 9397, "udp" },
+ { "sec-t4net-srv", { NULL }, 9400, "tcp" },
+ { "sec-t4net-srv", { NULL }, 9400, "udp" },
+ { "sec-t4net-clt", { NULL }, 9401, "tcp" },
+ { "sec-t4net-clt", { NULL }, 9401, "udp" },
+ { "sec-pc2fax-srv", { NULL }, 9402, "tcp" },
+ { "sec-pc2fax-srv", { NULL }, 9402, "udp" },
+ { "git", { NULL }, 9418, "tcp" },
+ { "git", { NULL }, 9418, "udp" },
+ { "tungsten-https", { NULL }, 9443, "tcp" },
+ { "tungsten-https", { NULL }, 9443, "udp" },
+ { "wso2esb-console", { NULL }, 9444, "tcp" },
+ { "wso2esb-console", { NULL }, 9444, "udp" },
+ { "sntlkeyssrvr", { NULL }, 9450, "tcp" },
+ { "sntlkeyssrvr", { NULL }, 9450, "udp" },
+ { "ismserver", { NULL }, 9500, "tcp" },
+ { "ismserver", { NULL }, 9500, "udp" },
+ { "sma-spw", { NULL }, 9522, "udp" },
+ { "mngsuite", { NULL }, 9535, "tcp" },
+ { "mngsuite", { NULL }, 9535, "udp" },
+ { "laes-bf", { NULL }, 9536, "tcp" },
+ { "laes-bf", { NULL }, 9536, "udp" },
+ { "trispen-sra", { NULL }, 9555, "tcp" },
+ { "trispen-sra", { NULL }, 9555, "udp" },
+ { "ldgateway", { NULL }, 9592, "tcp" },
+ { "ldgateway", { NULL }, 9592, "udp" },
+ { "cba8", { NULL }, 9593, "tcp" },
+ { "cba8", { NULL }, 9593, "udp" },
+ { "msgsys", { NULL }, 9594, "tcp" },
+ { "msgsys", { NULL }, 9594, "udp" },
+ { "pds", { NULL }, 9595, "tcp" },
+ { "pds", { NULL }, 9595, "udp" },
+ { "mercury-disc", { NULL }, 9596, "tcp" },
+ { "mercury-disc", { NULL }, 9596, "udp" },
+ { "pd-admin", { NULL }, 9597, "tcp" },
+ { "pd-admin", { NULL }, 9597, "udp" },
+ { "vscp", { NULL }, 9598, "tcp" },
+ { "vscp", { NULL }, 9598, "udp" },
+ { "robix", { NULL }, 9599, "tcp" },
+ { "robix", { NULL }, 9599, "udp" },
+ { "micromuse-ncpw", { NULL }, 9600, "tcp" },
+ { "micromuse-ncpw", { NULL }, 9600, "udp" },
+ { "streamcomm-ds", { NULL }, 9612, "tcp" },
+ { "streamcomm-ds", { NULL }, 9612, "udp" },
+ { "iadt-tls", { NULL }, 9614, "tcp" },
+ { "erunbook_agent", { NULL }, 9616, "tcp" },
+ { "erunbook_server", { NULL }, 9617, "tcp" },
+ { "condor", { NULL }, 9618, "tcp" },
+ { "condor", { NULL }, 9618, "udp" },
+ { "odbcpathway", { NULL }, 9628, "tcp" },
+ { "odbcpathway", { NULL }, 9628, "udp" },
+ { "uniport", { NULL }, 9629, "tcp" },
+ { "uniport", { NULL }, 9629, "udp" },
+ { "peoctlr", { NULL }, 9630, "tcp" },
+ { "peocoll", { NULL }, 9631, "tcp" },
+ { "mc-comm", { NULL }, 9632, "udp" },
+ { "pqsflows", { NULL }, 9640, "tcp" },
+ { "xmms2", { NULL }, 9667, "tcp" },
+ { "xmms2", { NULL }, 9667, "udp" },
+ { "tec5-sdctp", { NULL }, 9668, "tcp" },
+ { "tec5-sdctp", { NULL }, 9668, "udp" },
+ { "client-wakeup", { NULL }, 9694, "tcp" },
+ { "client-wakeup", { NULL }, 9694, "udp" },
+ { "ccnx", { NULL }, 9695, "tcp" },
+ { "ccnx", { NULL }, 9695, "udp" },
+ { "board-roar", { NULL }, 9700, "tcp" },
+ { "board-roar", { NULL }, 9700, "udp" },
+ { "l5nas-parchan", { NULL }, 9747, "tcp" },
+ { "l5nas-parchan", { NULL }, 9747, "udp" },
+ { "board-voip", { NULL }, 9750, "tcp" },
+ { "board-voip", { NULL }, 9750, "udp" },
+ { "rasadv", { NULL }, 9753, "tcp" },
+ { "rasadv", { NULL }, 9753, "udp" },
+ { "tungsten-http", { NULL }, 9762, "tcp" },
+ { "tungsten-http", { NULL }, 9762, "udp" },
+ { "davsrc", { NULL }, 9800, "tcp" },
+ { "davsrc", { NULL }, 9800, "udp" },
+ { "sstp-2", { NULL }, 9801, "tcp" },
+ { "sstp-2", { NULL }, 9801, "udp" },
+ { "davsrcs", { NULL }, 9802, "tcp" },
+ { "davsrcs", { NULL }, 9802, "udp" },
+ { "sapv1", { NULL }, 9875, "tcp" },
+ { "sapv1", { NULL }, 9875, "udp" },
+ { "sd", { NULL }, 9876, "tcp" },
+ { "sd", { NULL }, 9876, "udp" },
+ { "cyborg-systems", { NULL }, 9888, "tcp" },
+ { "cyborg-systems", { NULL }, 9888, "udp" },
+ { "gt-proxy", { NULL }, 9889, "tcp" },
+ { "gt-proxy", { NULL }, 9889, "udp" },
+ { "monkeycom", { NULL }, 9898, "tcp" },
+ { "monkeycom", { NULL }, 9898, "udp" },
+ { "sctp-tunneling", { NULL }, 9899, "tcp" },
+ { "sctp-tunneling", { NULL }, 9899, "udp" },
+ { "iua", { NULL }, 9900, "tcp" },
+ { "iua", { NULL }, 9900, "udp" },
+ { "iua", { NULL }, 9900, "sctp"},
+ { "enrp", { NULL }, 9901, "udp" },
+ { "enrp-sctp", { NULL }, 9901, "sctp"},
+ { "enrp-sctp-tls", { NULL }, 9902, "sctp"},
+ { "domaintime", { NULL }, 9909, "tcp" },
+ { "domaintime", { NULL }, 9909, "udp" },
+ { "sype-transport", { NULL }, 9911, "tcp" },
+ { "sype-transport", { NULL }, 9911, "udp" },
+ { "apc-9950", { NULL }, 9950, "tcp" },
+ { "apc-9950", { NULL }, 9950, "udp" },
+ { "apc-9951", { NULL }, 9951, "tcp" },
+ { "apc-9951", { NULL }, 9951, "udp" },
+ { "apc-9952", { NULL }, 9952, "tcp" },
+ { "apc-9952", { NULL }, 9952, "udp" },
+ { "acis", { NULL }, 9953, "tcp" },
+ { "acis", { NULL }, 9953, "udp" },
+ { "odnsp", { NULL }, 9966, "tcp" },
+ { "odnsp", { NULL }, 9966, "udp" },
+ { "dsm-scm-target", { NULL }, 9987, "tcp" },
+ { "dsm-scm-target", { NULL }, 9987, "udp" },
+ { "nsesrvr", { NULL }, 9988, "tcp" },
+ { "osm-appsrvr", { NULL }, 9990, "tcp" },
+ { "osm-appsrvr", { NULL }, 9990, "udp" },
+ { "osm-oev", { NULL }, 9991, "tcp" },
+ { "osm-oev", { NULL }, 9991, "udp" },
+ { "palace-1", { NULL }, 9992, "tcp" },
+ { "palace-1", { NULL }, 9992, "udp" },
+ { "palace-2", { NULL }, 9993, "tcp" },
+ { "palace-2", { NULL }, 9993, "udp" },
+ { "palace-3", { NULL }, 9994, "tcp" },
+ { "palace-3", { NULL }, 9994, "udp" },
+ { "palace-4", { NULL }, 9995, "tcp" },
+ { "palace-4", { NULL }, 9995, "udp" },
+ { "palace-5", { NULL }, 9996, "tcp" },
+ { "palace-5", { NULL }, 9996, "udp" },
+ { "palace-6", { NULL }, 9997, "tcp" },
+ { "palace-6", { NULL }, 9997, "udp" },
+ { "distinct32", { NULL }, 9998, "tcp" },
+ { "distinct32", { NULL }, 9998, "udp" },
+ { "distinct", { NULL }, 9999, "tcp" },
+ { "distinct", { NULL }, 9999, "udp" },
+ { "ndmp", { NULL }, 10000, "tcp" },
+ { "ndmp", { NULL }, 10000, "udp" },
+ { "scp-config", { NULL }, 10001, "tcp" },
+ { "scp-config", { NULL }, 10001, "udp" },
+ { "documentum", { NULL }, 10002, "tcp" },
+ { "documentum", { NULL }, 10002, "udp" },
+ { "documentum_s", { NULL }, 10003, "tcp" },
+ { "documentum_s", { NULL }, 10003, "udp" },
+ { "emcrmirccd", { NULL }, 10004, "tcp" },
+ { "emcrmird", { NULL }, 10005, "tcp" },
+ { "mvs-capacity", { NULL }, 10007, "tcp" },
+ { "mvs-capacity", { NULL }, 10007, "udp" },
+ { "octopus", { NULL }, 10008, "tcp" },
+ { "octopus", { NULL }, 10008, "udp" },
+ { "swdtp-sv", { NULL }, 10009, "tcp" },
+ { "swdtp-sv", { NULL }, 10009, "udp" },
+ { "rxapi", { NULL }, 10010, "tcp" },
+ { "zabbix-agent", { NULL }, 10050, "tcp" },
+ { "zabbix-agent", { NULL }, 10050, "udp" },
+ { "zabbix-trapper", { NULL }, 10051, "tcp" },
+ { "zabbix-trapper", { NULL }, 10051, "udp" },
+ { "qptlmd", { NULL }, 10055, "tcp" },
+ { "amanda", { NULL }, 10080, "tcp" },
+ { "amanda", { NULL }, 10080, "udp" },
+ { "famdc", { NULL }, 10081, "tcp" },
+ { "famdc", { NULL }, 10081, "udp" },
+ { "itap-ddtp", { NULL }, 10100, "tcp" },
+ { "itap-ddtp", { NULL }, 10100, "udp" },
+ { "ezmeeting-2", { NULL }, 10101, "tcp" },
+ { "ezmeeting-2", { NULL }, 10101, "udp" },
+ { "ezproxy-2", { NULL }, 10102, "tcp" },
+ { "ezproxy-2", { NULL }, 10102, "udp" },
+ { "ezrelay", { NULL }, 10103, "tcp" },
+ { "ezrelay", { NULL }, 10103, "udp" },
+ { "swdtp", { NULL }, 10104, "tcp" },
+ { "swdtp", { NULL }, 10104, "udp" },
+ { "bctp-server", { NULL }, 10107, "tcp" },
+ { "bctp-server", { NULL }, 10107, "udp" },
+ { "nmea-0183", { NULL }, 10110, "tcp" },
+ { "nmea-0183", { NULL }, 10110, "udp" },
+ { "netiq-endpoint", { NULL }, 10113, "tcp" },
+ { "netiq-endpoint", { NULL }, 10113, "udp" },
+ { "netiq-qcheck", { NULL }, 10114, "tcp" },
+ { "netiq-qcheck", { NULL }, 10114, "udp" },
+ { "netiq-endpt", { NULL }, 10115, "tcp" },
+ { "netiq-endpt", { NULL }, 10115, "udp" },
+ { "netiq-voipa", { NULL }, 10116, "tcp" },
+ { "netiq-voipa", { NULL }, 10116, "udp" },
+ { "iqrm", { NULL }, 10117, "tcp" },
+ { "iqrm", { NULL }, 10117, "udp" },
+ { "bmc-perf-sd", { NULL }, 10128, "tcp" },
+ { "bmc-perf-sd", { NULL }, 10128, "udp" },
+ { "bmc-gms", { NULL }, 10129, "tcp" },
+ { "qb-db-server", { NULL }, 10160, "tcp" },
+ { "qb-db-server", { NULL }, 10160, "udp" },
+ { "snmptls", { NULL }, 10161, "tcp" },
+ { "snmpdtls", { NULL }, 10161, "udp" },
+ { "snmptls-trap", { NULL }, 10162, "tcp" },
+ { "snmpdtls-trap", { NULL }, 10162, "udp" },
+ { "trisoap", { NULL }, 10200, "tcp" },
+ { "trisoap", { NULL }, 10200, "udp" },
+ { "rsms", { NULL }, 10201, "tcp" },
+ { "rscs", { NULL }, 10201, "udp" },
+ { "apollo-relay", { NULL }, 10252, "tcp" },
+ { "apollo-relay", { NULL }, 10252, "udp" },
+ { "axis-wimp-port", { NULL }, 10260, "tcp" },
+ { "axis-wimp-port", { NULL }, 10260, "udp" },
+ { "blocks", { NULL }, 10288, "tcp" },
+ { "blocks", { NULL }, 10288, "udp" },
+ { "cosir", { NULL }, 10321, "tcp" },
+ { "hip-nat-t", { NULL }, 10500, "udp" },
+ { "MOS-lower", { NULL }, 10540, "tcp" },
+ { "MOS-lower", { NULL }, 10540, "udp" },
+ { "MOS-upper", { NULL }, 10541, "tcp" },
+ { "MOS-upper", { NULL }, 10541, "udp" },
+ { "MOS-aux", { NULL }, 10542, "tcp" },
+ { "MOS-aux", { NULL }, 10542, "udp" },
+ { "MOS-soap", { NULL }, 10543, "tcp" },
+ { "MOS-soap", { NULL }, 10543, "udp" },
+ { "MOS-soap-opt", { NULL }, 10544, "tcp" },
+ { "MOS-soap-opt", { NULL }, 10544, "udp" },
+ { "gap", { NULL }, 10800, "tcp" },
+ { "gap", { NULL }, 10800, "udp" },
+ { "lpdg", { NULL }, 10805, "tcp" },
+ { "lpdg", { NULL }, 10805, "udp" },
+ { "nbd", { NULL }, 10809, "tcp" },
+ { "nmc-disc", { NULL }, 10810, "udp" },
+ { "helix", { NULL }, 10860, "tcp" },
+ { "helix", { NULL }, 10860, "udp" },
+ { "rmiaux", { NULL }, 10990, "tcp" },
+ { "rmiaux", { NULL }, 10990, "udp" },
+ { "irisa", { NULL }, 11000, "tcp" },
+ { "irisa", { NULL }, 11000, "udp" },
+ { "metasys", { NULL }, 11001, "tcp" },
+ { "metasys", { NULL }, 11001, "udp" },
+ { "netapp-icmgmt", { NULL }, 11104, "tcp" },
+ { "netapp-icdata", { NULL }, 11105, "tcp" },
+ { "sgi-lk", { NULL }, 11106, "tcp" },
+ { "sgi-lk", { NULL }, 11106, "udp" },
+ { "vce", { NULL }, 11111, "tcp" },
+ { "vce", { NULL }, 11111, "udp" },
+ { "dicom", { NULL }, 11112, "tcp" },
+ { "dicom", { NULL }, 11112, "udp" },
+ { "suncacao-snmp", { NULL }, 11161, "tcp" },
+ { "suncacao-snmp", { NULL }, 11161, "udp" },
+ { "suncacao-jmxmp", { NULL }, 11162, "tcp" },
+ { "suncacao-jmxmp", { NULL }, 11162, "udp" },
+ { "suncacao-rmi", { NULL }, 11163, "tcp" },
+ { "suncacao-rmi", { NULL }, 11163, "udp" },
+ { "suncacao-csa", { NULL }, 11164, "tcp" },
+ { "suncacao-csa", { NULL }, 11164, "udp" },
+ { "suncacao-websvc", { NULL }, 11165, "tcp" },
+ { "suncacao-websvc", { NULL }, 11165, "udp" },
+ { "snss", { NULL }, 11171, "udp" },
+ { "oemcacao-jmxmp", { NULL }, 11172, "tcp" },
+ { "oemcacao-rmi", { NULL }, 11174, "tcp" },
+ { "oemcacao-websvc", { NULL }, 11175, "tcp" },
+ { "smsqp", { NULL }, 11201, "tcp" },
+ { "smsqp", { NULL }, 11201, "udp" },
+ { "wifree", { NULL }, 11208, "tcp" },
+ { "wifree", { NULL }, 11208, "udp" },
+ { "memcache", { NULL }, 11211, "tcp" },
+ { "memcache", { NULL }, 11211, "udp" },
+ { "imip", { NULL }, 11319, "tcp" },
+ { "imip", { NULL }, 11319, "udp" },
+ { "imip-channels", { NULL }, 11320, "tcp" },
+ { "imip-channels", { NULL }, 11320, "udp" },
+ { "arena-server", { NULL }, 11321, "tcp" },
+ { "arena-server", { NULL }, 11321, "udp" },
+ { "atm-uhas", { NULL }, 11367, "tcp" },
+ { "atm-uhas", { NULL }, 11367, "udp" },
+ { "hkp", { NULL }, 11371, "tcp" },
+ { "hkp", { NULL }, 11371, "udp" },
+ { "asgcypresstcps", { NULL }, 11489, "tcp" },
+ { "tempest-port", { NULL }, 11600, "tcp" },
+ { "tempest-port", { NULL }, 11600, "udp" },
+ { "h323callsigalt", { NULL }, 11720, "tcp" },
+ { "h323callsigalt", { NULL }, 11720, "udp" },
+ { "intrepid-ssl", { NULL }, 11751, "tcp" },
+ { "intrepid-ssl", { NULL }, 11751, "udp" },
+ { "xoraya", { NULL }, 11876, "tcp" },
+ { "xoraya", { NULL }, 11876, "udp" },
+ { "x2e-disc", { NULL }, 11877, "udp" },
+ { "sysinfo-sp", { NULL }, 11967, "tcp" },
+ { "sysinfo-sp", { NULL }, 11967, "udp" },
+ { "wmereceiving", { NULL }, 11997, "sctp"},
+ { "wmedistribution", { NULL }, 11998, "sctp"},
+ { "wmereporting", { NULL }, 11999, "sctp"},
+ { "entextxid", { NULL }, 12000, "tcp" },
+ { "entextxid", { NULL }, 12000, "udp" },
+ { "entextnetwk", { NULL }, 12001, "tcp" },
+ { "entextnetwk", { NULL }, 12001, "udp" },
+ { "entexthigh", { NULL }, 12002, "tcp" },
+ { "entexthigh", { NULL }, 12002, "udp" },
+ { "entextmed", { NULL }, 12003, "tcp" },
+ { "entextmed", { NULL }, 12003, "udp" },
+ { "entextlow", { NULL }, 12004, "tcp" },
+ { "entextlow", { NULL }, 12004, "udp" },
+ { "dbisamserver1", { NULL }, 12005, "tcp" },
+ { "dbisamserver1", { NULL }, 12005, "udp" },
+ { "dbisamserver2", { NULL }, 12006, "tcp" },
+ { "dbisamserver2", { NULL }, 12006, "udp" },
+ { "accuracer", { NULL }, 12007, "tcp" },
+ { "accuracer", { NULL }, 12007, "udp" },
+ { "accuracer-dbms", { NULL }, 12008, "tcp" },
+ { "accuracer-dbms", { NULL }, 12008, "udp" },
+ { "edbsrvr", { NULL }, 12010, "tcp" },
+ { "vipera", { NULL }, 12012, "tcp" },
+ { "vipera", { NULL }, 12012, "udp" },
+ { "vipera-ssl", { NULL }, 12013, "tcp" },
+ { "vipera-ssl", { NULL }, 12013, "udp" },
+ { "rets-ssl", { NULL }, 12109, "tcp" },
+ { "rets-ssl", { NULL }, 12109, "udp" },
+ { "nupaper-ss", { NULL }, 12121, "tcp" },
+ { "nupaper-ss", { NULL }, 12121, "udp" },
+ { "cawas", { NULL }, 12168, "tcp" },
+ { "cawas", { NULL }, 12168, "udp" },
+ { "hivep", { NULL }, 12172, "tcp" },
+ { "hivep", { NULL }, 12172, "udp" },
+ { "linogridengine", { NULL }, 12300, "tcp" },
+ { "linogridengine", { NULL }, 12300, "udp" },
+ { "warehouse-sss", { NULL }, 12321, "tcp" },
+ { "warehouse-sss", { NULL }, 12321, "udp" },
+ { "warehouse", { NULL }, 12322, "tcp" },
+ { "warehouse", { NULL }, 12322, "udp" },
+ { "italk", { NULL }, 12345, "tcp" },
+ { "italk", { NULL }, 12345, "udp" },
+ { "tsaf", { NULL }, 12753, "tcp" },
+ { "tsaf", { NULL }, 12753, "udp" },
+ { "i-zipqd", { NULL }, 13160, "tcp" },
+ { "i-zipqd", { NULL }, 13160, "udp" },
+ { "bcslogc", { NULL }, 13216, "tcp" },
+ { "bcslogc", { NULL }, 13216, "udp" },
+ { "rs-pias", { NULL }, 13217, "tcp" },
+ { "rs-pias", { NULL }, 13217, "udp" },
+ { "emc-vcas-tcp", { NULL }, 13218, "tcp" },
+ { "emc-vcas-udp", { NULL }, 13218, "udp" },
+ { "powwow-client", { NULL }, 13223, "tcp" },
+ { "powwow-client", { NULL }, 13223, "udp" },
+ { "powwow-server", { NULL }, 13224, "tcp" },
+ { "powwow-server", { NULL }, 13224, "udp" },
+ { "doip-data", { NULL }, 13400, "tcp" },
+ { "doip-disc", { NULL }, 13400, "udp" },
+ { "bprd", { NULL }, 13720, "tcp" },
+ { "bprd", { NULL }, 13720, "udp" },
+ { "bpdbm", { NULL }, 13721, "tcp" },
+ { "bpdbm", { NULL }, 13721, "udp" },
+ { "bpjava-msvc", { NULL }, 13722, "tcp" },
+ { "bpjava-msvc", { NULL }, 13722, "udp" },
+ { "vnetd", { NULL }, 13724, "tcp" },
+ { "vnetd", { NULL }, 13724, "udp" },
+ { "bpcd", { NULL }, 13782, "tcp" },
+ { "bpcd", { NULL }, 13782, "udp" },
+ { "vopied", { NULL }, 13783, "tcp" },
+ { "vopied", { NULL }, 13783, "udp" },
+ { "nbdb", { NULL }, 13785, "tcp" },
+ { "nbdb", { NULL }, 13785, "udp" },
+ { "nomdb", { NULL }, 13786, "tcp" },
+ { "nomdb", { NULL }, 13786, "udp" },
+ { "dsmcc-config", { NULL }, 13818, "tcp" },
+ { "dsmcc-config", { NULL }, 13818, "udp" },
+ { "dsmcc-session", { NULL }, 13819, "tcp" },
+ { "dsmcc-session", { NULL }, 13819, "udp" },
+ { "dsmcc-passthru", { NULL }, 13820, "tcp" },
+ { "dsmcc-passthru", { NULL }, 13820, "udp" },
+ { "dsmcc-download", { NULL }, 13821, "tcp" },
+ { "dsmcc-download", { NULL }, 13821, "udp" },
+ { "dsmcc-ccp", { NULL }, 13822, "tcp" },
+ { "dsmcc-ccp", { NULL }, 13822, "udp" },
+ { "bmdss", { NULL }, 13823, "tcp" },
+ { "dta-systems", { NULL }, 13929, "tcp" },
+ { "dta-systems", { NULL }, 13929, "udp" },
+ { "medevolve", { NULL }, 13930, "tcp" },
+ { "scotty-ft", { NULL }, 14000, "tcp" },
+ { "scotty-ft", { NULL }, 14000, "udp" },
+ { "sua", { NULL }, 14001, "tcp" },
+ { "sua", { NULL }, 14001, "udp" },
+ { "sua", { NULL }, 14001, "sctp"},
+ { "sage-best-com1", { NULL }, 14033, "tcp" },
+ { "sage-best-com1", { NULL }, 14033, "udp" },
+ { "sage-best-com2", { NULL }, 14034, "tcp" },
+ { "sage-best-com2", { NULL }, 14034, "udp" },
+ { "vcs-app", { NULL }, 14141, "tcp" },
+ { "vcs-app", { NULL }, 14141, "udp" },
+ { "icpp", { NULL }, 14142, "tcp" },
+ { "icpp", { NULL }, 14142, "udp" },
+ { "gcm-app", { NULL }, 14145, "tcp" },
+ { "gcm-app", { NULL }, 14145, "udp" },
+ { "vrts-tdd", { NULL }, 14149, "tcp" },
+ { "vrts-tdd", { NULL }, 14149, "udp" },
+ { "vcscmd", { NULL }, 14150, "tcp" },
+ { "vad", { NULL }, 14154, "tcp" },
+ { "vad", { NULL }, 14154, "udp" },
+ { "cps", { NULL }, 14250, "tcp" },
+ { "cps", { NULL }, 14250, "udp" },
+ { "ca-web-update", { NULL }, 14414, "tcp" },
+ { "ca-web-update", { NULL }, 14414, "udp" },
+ { "hde-lcesrvr-1", { NULL }, 14936, "tcp" },
+ { "hde-lcesrvr-1", { NULL }, 14936, "udp" },
+ { "hde-lcesrvr-2", { NULL }, 14937, "tcp" },
+ { "hde-lcesrvr-2", { NULL }, 14937, "udp" },
+ { "hydap", { NULL }, 15000, "tcp" },
+ { "hydap", { NULL }, 15000, "udp" },
+ { "xpilot", { NULL }, 15345, "tcp" },
+ { "xpilot", { NULL }, 15345, "udp" },
+ { "3link", { NULL }, 15363, "tcp" },
+ { "3link", { NULL }, 15363, "udp" },
+ { "cisco-snat", { NULL }, 15555, "tcp" },
+ { "cisco-snat", { NULL }, 15555, "udp" },
+ { "bex-xr", { NULL }, 15660, "tcp" },
+ { "bex-xr", { NULL }, 15660, "udp" },
+ { "ptp", { NULL }, 15740, "tcp" },
+ { "ptp", { NULL }, 15740, "udp" },
+ { "2ping", { NULL }, 15998, "udp" },
+ { "programmar", { NULL }, 15999, "tcp" },
+ { "fmsas", { NULL }, 16000, "tcp" },
+ { "fmsascon", { NULL }, 16001, "tcp" },
+ { "gsms", { NULL }, 16002, "tcp" },
+ { "alfin", { NULL }, 16003, "udp" },
+ { "jwpc", { NULL }, 16020, "tcp" },
+ { "jwpc-bin", { NULL }, 16021, "tcp" },
+ { "sun-sea-port", { NULL }, 16161, "tcp" },
+ { "sun-sea-port", { NULL }, 16161, "udp" },
+ { "solaris-audit", { NULL }, 16162, "tcp" },
+ { "etb4j", { NULL }, 16309, "tcp" },
+ { "etb4j", { NULL }, 16309, "udp" },
+ { "pduncs", { NULL }, 16310, "tcp" },
+ { "pduncs", { NULL }, 16310, "udp" },
+ { "pdefmns", { NULL }, 16311, "tcp" },
+ { "pdefmns", { NULL }, 16311, "udp" },
+ { "netserialext1", { NULL }, 16360, "tcp" },
+ { "netserialext1", { NULL }, 16360, "udp" },
+ { "netserialext2", { NULL }, 16361, "tcp" },
+ { "netserialext2", { NULL }, 16361, "udp" },
+ { "netserialext3", { NULL }, 16367, "tcp" },
+ { "netserialext3", { NULL }, 16367, "udp" },
+ { "netserialext4", { NULL }, 16368, "tcp" },
+ { "netserialext4", { NULL }, 16368, "udp" },
+ { "connected", { NULL }, 16384, "tcp" },
+ { "connected", { NULL }, 16384, "udp" },
+ { "xoms", { NULL }, 16619, "tcp" },
+ { "newbay-snc-mc", { NULL }, 16900, "tcp" },
+ { "newbay-snc-mc", { NULL }, 16900, "udp" },
+ { "sgcip", { NULL }, 16950, "tcp" },
+ { "sgcip", { NULL }, 16950, "udp" },
+ { "intel-rci-mp", { NULL }, 16991, "tcp" },
+ { "intel-rci-mp", { NULL }, 16991, "udp" },
+ { "amt-soap-http", { NULL }, 16992, "tcp" },
+ { "amt-soap-http", { NULL }, 16992, "udp" },
+ { "amt-soap-https", { NULL }, 16993, "tcp" },
+ { "amt-soap-https", { NULL }, 16993, "udp" },
+ { "amt-redir-tcp", { NULL }, 16994, "tcp" },
+ { "amt-redir-tcp", { NULL }, 16994, "udp" },
+ { "amt-redir-tls", { NULL }, 16995, "tcp" },
+ { "amt-redir-tls", { NULL }, 16995, "udp" },
+ { "isode-dua", { NULL }, 17007, "tcp" },
+ { "isode-dua", { NULL }, 17007, "udp" },
+ { "soundsvirtual", { NULL }, 17185, "tcp" },
+ { "soundsvirtual", { NULL }, 17185, "udp" },
+ { "chipper", { NULL }, 17219, "tcp" },
+ { "chipper", { NULL }, 17219, "udp" },
+ { "integrius-stp", { NULL }, 17234, "tcp" },
+ { "integrius-stp", { NULL }, 17234, "udp" },
+ { "ssh-mgmt", { NULL }, 17235, "tcp" },
+ { "ssh-mgmt", { NULL }, 17235, "udp" },
+ { "db-lsp", { NULL }, 17500, "tcp" },
+ { "db-lsp-disc", { NULL }, 17500, "udp" },
+ { "ea", { NULL }, 17729, "tcp" },
+ { "ea", { NULL }, 17729, "udp" },
+ { "zep", { NULL }, 17754, "tcp" },
+ { "zep", { NULL }, 17754, "udp" },
+ { "zigbee-ip", { NULL }, 17755, "tcp" },
+ { "zigbee-ip", { NULL }, 17755, "udp" },
+ { "zigbee-ips", { NULL }, 17756, "tcp" },
+ { "zigbee-ips", { NULL }, 17756, "udp" },
+ { "sw-orion", { NULL }, 17777, "tcp" },
+ { "biimenu", { NULL }, 18000, "tcp" },
+ { "biimenu", { NULL }, 18000, "udp" },
+ { "radpdf", { NULL }, 18104, "tcp" },
+ { "racf", { NULL }, 18136, "tcp" },
+ { "opsec-cvp", { NULL }, 18181, "tcp" },
+ { "opsec-cvp", { NULL }, 18181, "udp" },
+ { "opsec-ufp", { NULL }, 18182, "tcp" },
+ { "opsec-ufp", { NULL }, 18182, "udp" },
+ { "opsec-sam", { NULL }, 18183, "tcp" },
+ { "opsec-sam", { NULL }, 18183, "udp" },
+ { "opsec-lea", { NULL }, 18184, "tcp" },
+ { "opsec-lea", { NULL }, 18184, "udp" },
+ { "opsec-omi", { NULL }, 18185, "tcp" },
+ { "opsec-omi", { NULL }, 18185, "udp" },
+ { "ohsc", { NULL }, 18186, "tcp" },
+ { "ohsc", { NULL }, 18186, "udp" },
+ { "opsec-ela", { NULL }, 18187, "tcp" },
+ { "opsec-ela", { NULL }, 18187, "udp" },
+ { "checkpoint-rtm", { NULL }, 18241, "tcp" },
+ { "checkpoint-rtm", { NULL }, 18241, "udp" },
+ { "gv-pf", { NULL }, 18262, "tcp" },
+ { "gv-pf", { NULL }, 18262, "udp" },
+ { "ac-cluster", { NULL }, 18463, "tcp" },
+ { "ac-cluster", { NULL }, 18463, "udp" },
+ { "rds-ib", { NULL }, 18634, "tcp" },
+ { "rds-ib", { NULL }, 18634, "udp" },
+ { "rds-ip", { NULL }, 18635, "tcp" },
+ { "rds-ip", { NULL }, 18635, "udp" },
+ { "ique", { NULL }, 18769, "tcp" },
+ { "ique", { NULL }, 18769, "udp" },
+ { "infotos", { NULL }, 18881, "tcp" },
+ { "infotos", { NULL }, 18881, "udp" },
+ { "apc-necmp", { NULL }, 18888, "tcp" },
+ { "apc-necmp", { NULL }, 18888, "udp" },
+ { "igrid", { NULL }, 19000, "tcp" },
+ { "igrid", { NULL }, 19000, "udp" },
+ { "j-link", { NULL }, 19020, "tcp" },
+ { "opsec-uaa", { NULL }, 19191, "tcp" },
+ { "opsec-uaa", { NULL }, 19191, "udp" },
+ { "ua-secureagent", { NULL }, 19194, "tcp" },
+ { "ua-secureagent", { NULL }, 19194, "udp" },
+ { "keysrvr", { NULL }, 19283, "tcp" },
+ { "keysrvr", { NULL }, 19283, "udp" },
+ { "keyshadow", { NULL }, 19315, "tcp" },
+ { "keyshadow", { NULL }, 19315, "udp" },
+ { "mtrgtrans", { NULL }, 19398, "tcp" },
+ { "mtrgtrans", { NULL }, 19398, "udp" },
+ { "hp-sco", { NULL }, 19410, "tcp" },
+ { "hp-sco", { NULL }, 19410, "udp" },
+ { "hp-sca", { NULL }, 19411, "tcp" },
+ { "hp-sca", { NULL }, 19411, "udp" },
+ { "hp-sessmon", { NULL }, 19412, "tcp" },
+ { "hp-sessmon", { NULL }, 19412, "udp" },
+ { "fxuptp", { NULL }, 19539, "tcp" },
+ { "fxuptp", { NULL }, 19539, "udp" },
+ { "sxuptp", { NULL }, 19540, "tcp" },
+ { "sxuptp", { NULL }, 19540, "udp" },
+ { "jcp", { NULL }, 19541, "tcp" },
+ { "jcp", { NULL }, 19541, "udp" },
+ { "iec-104-sec", { NULL }, 19998, "tcp" },
+ { "dnp-sec", { NULL }, 19999, "tcp" },
+ { "dnp-sec", { NULL }, 19999, "udp" },
+ { "dnp", { NULL }, 20000, "tcp" },
+ { "dnp", { NULL }, 20000, "udp" },
+ { "microsan", { NULL }, 20001, "tcp" },
+ { "microsan", { NULL }, 20001, "udp" },
+ { "commtact-http", { NULL }, 20002, "tcp" },
+ { "commtact-http", { NULL }, 20002, "udp" },
+ { "commtact-https", { NULL }, 20003, "tcp" },
+ { "commtact-https", { NULL }, 20003, "udp" },
+ { "openwebnet", { NULL }, 20005, "tcp" },
+ { "openwebnet", { NULL }, 20005, "udp" },
+ { "ss-idi-disc", { NULL }, 20012, "udp" },
+ { "ss-idi", { NULL }, 20013, "tcp" },
+ { "opendeploy", { NULL }, 20014, "tcp" },
+ { "opendeploy", { NULL }, 20014, "udp" },
+ { "nburn_id", { NULL }, 20034, "tcp" },
+ { "nburn_id", { NULL }, 20034, "udp" },
+ { "tmophl7mts", { NULL }, 20046, "tcp" },
+ { "tmophl7mts", { NULL }, 20046, "udp" },
+ { "mountd", { NULL }, 20048, "tcp" },
+ { "mountd", { NULL }, 20048, "udp" },
+ { "nfsrdma", { NULL }, 20049, "tcp" },
+ { "nfsrdma", { NULL }, 20049, "udp" },
+ { "nfsrdma", { NULL }, 20049, "sctp"},
+ { "tolfab", { NULL }, 20167, "tcp" },
+ { "tolfab", { NULL }, 20167, "udp" },
+ { "ipdtp-port", { NULL }, 20202, "tcp" },
+ { "ipdtp-port", { NULL }, 20202, "udp" },
+ { "ipulse-ics", { NULL }, 20222, "tcp" },
+ { "ipulse-ics", { NULL }, 20222, "udp" },
+ { "emwavemsg", { NULL }, 20480, "tcp" },
+ { "emwavemsg", { NULL }, 20480, "udp" },
+ { "track", { NULL }, 20670, "tcp" },
+ { "track", { NULL }, 20670, "udp" },
+ { "athand-mmp", { NULL }, 20999, "tcp" },
+ { "athand-mmp", { NULL }, 20999, "udp" },
+ { "irtrans", { NULL }, 21000, "tcp" },
+ { "irtrans", { NULL }, 21000, "udp" },
+ { "dfserver", { NULL }, 21554, "tcp" },
+ { "dfserver", { NULL }, 21554, "udp" },
+ { "vofr-gateway", { NULL }, 21590, "tcp" },
+ { "vofr-gateway", { NULL }, 21590, "udp" },
+ { "tvpm", { NULL }, 21800, "tcp" },
+ { "tvpm", { NULL }, 21800, "udp" },
+ { "webphone", { NULL }, 21845, "tcp" },
+ { "webphone", { NULL }, 21845, "udp" },
+ { "netspeak-is", { NULL }, 21846, "tcp" },
+ { "netspeak-is", { NULL }, 21846, "udp" },
+ { "netspeak-cs", { NULL }, 21847, "tcp" },
+ { "netspeak-cs", { NULL }, 21847, "udp" },
+ { "netspeak-acd", { NULL }, 21848, "tcp" },
+ { "netspeak-acd", { NULL }, 21848, "udp" },
+ { "netspeak-cps", { NULL }, 21849, "tcp" },
+ { "netspeak-cps", { NULL }, 21849, "udp" },
+ { "snapenetio", { NULL }, 22000, "tcp" },
+ { "snapenetio", { NULL }, 22000, "udp" },
+ { "optocontrol", { NULL }, 22001, "tcp" },
+ { "optocontrol", { NULL }, 22001, "udp" },
+ { "optohost002", { NULL }, 22002, "tcp" },
+ { "optohost002", { NULL }, 22002, "udp" },
+ { "optohost003", { NULL }, 22003, "tcp" },
+ { "optohost003", { NULL }, 22003, "udp" },
+ { "optohost004", { NULL }, 22004, "tcp" },
+ { "optohost004", { NULL }, 22004, "udp" },
+ { "optohost004", { NULL }, 22005, "tcp" },
+ { "optohost004", { NULL }, 22005, "udp" },
+ { "dcap", { NULL }, 22125, "tcp" },
+ { "gsidcap", { NULL }, 22128, "tcp" },
+ { "wnn6", { NULL }, 22273, "tcp" },
+ { "wnn6", { NULL }, 22273, "udp" },
+ { "cis", { NULL }, 22305, "tcp" },
+ { "cis", { NULL }, 22305, "udp" },
+ { "cis-secure", { NULL }, 22343, "tcp" },
+ { "cis-secure", { NULL }, 22343, "udp" },
+ { "WibuKey", { NULL }, 22347, "tcp" },
+ { "WibuKey", { NULL }, 22347, "udp" },
+ { "CodeMeter", { NULL }, 22350, "tcp" },
+ { "CodeMeter", { NULL }, 22350, "udp" },
+ { "vocaltec-wconf", { NULL }, 22555, "tcp" },
+ { "vocaltec-phone", { NULL }, 22555, "udp" },
+ { "talikaserver", { NULL }, 22763, "tcp" },
+ { "talikaserver", { NULL }, 22763, "udp" },
+ { "aws-brf", { NULL }, 22800, "tcp" },
+ { "aws-brf", { NULL }, 22800, "udp" },
+ { "brf-gw", { NULL }, 22951, "tcp" },
+ { "brf-gw", { NULL }, 22951, "udp" },
+ { "inovaport1", { NULL }, 23000, "tcp" },
+ { "inovaport1", { NULL }, 23000, "udp" },
+ { "inovaport2", { NULL }, 23001, "tcp" },
+ { "inovaport2", { NULL }, 23001, "udp" },
+ { "inovaport3", { NULL }, 23002, "tcp" },
+ { "inovaport3", { NULL }, 23002, "udp" },
+ { "inovaport4", { NULL }, 23003, "tcp" },
+ { "inovaport4", { NULL }, 23003, "udp" },
+ { "inovaport5", { NULL }, 23004, "tcp" },
+ { "inovaport5", { NULL }, 23004, "udp" },
+ { "inovaport6", { NULL }, 23005, "tcp" },
+ { "inovaport6", { NULL }, 23005, "udp" },
+ { "s102", { NULL }, 23272, "udp" },
+ { "elxmgmt", { NULL }, 23333, "tcp" },
+ { "elxmgmt", { NULL }, 23333, "udp" },
+ { "novar-dbase", { NULL }, 23400, "tcp" },
+ { "novar-dbase", { NULL }, 23400, "udp" },
+ { "novar-alarm", { NULL }, 23401, "tcp" },
+ { "novar-alarm", { NULL }, 23401, "udp" },
+ { "novar-global", { NULL }, 23402, "tcp" },
+ { "novar-global", { NULL }, 23402, "udp" },
+ { "aequus", { NULL }, 23456, "tcp" },
+ { "aequus-alt", { NULL }, 23457, "tcp" },
+ { "med-ltp", { NULL }, 24000, "tcp" },
+ { "med-ltp", { NULL }, 24000, "udp" },
+ { "med-fsp-rx", { NULL }, 24001, "tcp" },
+ { "med-fsp-rx", { NULL }, 24001, "udp" },
+ { "med-fsp-tx", { NULL }, 24002, "tcp" },
+ { "med-fsp-tx", { NULL }, 24002, "udp" },
+ { "med-supp", { NULL }, 24003, "tcp" },
+ { "med-supp", { NULL }, 24003, "udp" },
+ { "med-ovw", { NULL }, 24004, "tcp" },
+ { "med-ovw", { NULL }, 24004, "udp" },
+ { "med-ci", { NULL }, 24005, "tcp" },
+ { "med-ci", { NULL }, 24005, "udp" },
+ { "med-net-svc", { NULL }, 24006, "tcp" },
+ { "med-net-svc", { NULL }, 24006, "udp" },
+ { "filesphere", { NULL }, 24242, "tcp" },
+ { "filesphere", { NULL }, 24242, "udp" },
+ { "vista-4gl", { NULL }, 24249, "tcp" },
+ { "vista-4gl", { NULL }, 24249, "udp" },
+ { "ild", { NULL }, 24321, "tcp" },
+ { "ild", { NULL }, 24321, "udp" },
+ { "intel_rci", { NULL }, 24386, "tcp" },
+ { "intel_rci", { NULL }, 24386, "udp" },
+ { "tonidods", { NULL }, 24465, "tcp" },
+ { "tonidods", { NULL }, 24465, "udp" },
+ { "binkp", { NULL }, 24554, "tcp" },
+ { "binkp", { NULL }, 24554, "udp" },
+ { "canditv", { NULL }, 24676, "tcp" },
+ { "canditv", { NULL }, 24676, "udp" },
+ { "flashfiler", { NULL }, 24677, "tcp" },
+ { "flashfiler", { NULL }, 24677, "udp" },
+ { "proactivate", { NULL }, 24678, "tcp" },
+ { "proactivate", { NULL }, 24678, "udp" },
+ { "tcc-http", { NULL }, 24680, "tcp" },
+ { "tcc-http", { NULL }, 24680, "udp" },
+ { "cslg", { NULL }, 24754, "tcp" },
+ { "find", { NULL }, 24922, "tcp" },
+ { "find", { NULL }, 24922, "udp" },
+ { "icl-twobase1", { NULL }, 25000, "tcp" },
+ { "icl-twobase1", { NULL }, 25000, "udp" },
+ { "icl-twobase2", { NULL }, 25001, "tcp" },
+ { "icl-twobase2", { NULL }, 25001, "udp" },
+ { "icl-twobase3", { NULL }, 25002, "tcp" },
+ { "icl-twobase3", { NULL }, 25002, "udp" },
+ { "icl-twobase4", { NULL }, 25003, "tcp" },
+ { "icl-twobase4", { NULL }, 25003, "udp" },
+ { "icl-twobase5", { NULL }, 25004, "tcp" },
+ { "icl-twobase5", { NULL }, 25004, "udp" },
+ { "icl-twobase6", { NULL }, 25005, "tcp" },
+ { "icl-twobase6", { NULL }, 25005, "udp" },
+ { "icl-twobase7", { NULL }, 25006, "tcp" },
+ { "icl-twobase7", { NULL }, 25006, "udp" },
+ { "icl-twobase8", { NULL }, 25007, "tcp" },
+ { "icl-twobase8", { NULL }, 25007, "udp" },
+ { "icl-twobase9", { NULL }, 25008, "tcp" },
+ { "icl-twobase9", { NULL }, 25008, "udp" },
+ { "icl-twobase10", { NULL }, 25009, "tcp" },
+ { "icl-twobase10", { NULL }, 25009, "udp" },
+ { "rna", { NULL }, 25471, "sctp"},
+ { "sauterdongle", { NULL }, 25576, "tcp" },
+ { "vocaltec-hos", { NULL }, 25793, "tcp" },
+ { "vocaltec-hos", { NULL }, 25793, "udp" },
+ { "tasp-net", { NULL }, 25900, "tcp" },
+ { "tasp-net", { NULL }, 25900, "udp" },
+ { "niobserver", { NULL }, 25901, "tcp" },
+ { "niobserver", { NULL }, 25901, "udp" },
+ { "nilinkanalyst", { NULL }, 25902, "tcp" },
+ { "nilinkanalyst", { NULL }, 25902, "udp" },
+ { "niprobe", { NULL }, 25903, "tcp" },
+ { "niprobe", { NULL }, 25903, "udp" },
+ { "quake", { NULL }, 26000, "tcp" },
+ { "quake", { NULL }, 26000, "udp" },
+ { "scscp", { NULL }, 26133, "tcp" },
+ { "scscp", { NULL }, 26133, "udp" },
+ { "wnn6-ds", { NULL }, 26208, "tcp" },
+ { "wnn6-ds", { NULL }, 26208, "udp" },
+ { "ezproxy", { NULL }, 26260, "tcp" },
+ { "ezproxy", { NULL }, 26260, "udp" },
+ { "ezmeeting", { NULL }, 26261, "tcp" },
+ { "ezmeeting", { NULL }, 26261, "udp" },
+ { "k3software-svr", { NULL }, 26262, "tcp" },
+ { "k3software-svr", { NULL }, 26262, "udp" },
+ { "k3software-cli", { NULL }, 26263, "tcp" },
+ { "k3software-cli", { NULL }, 26263, "udp" },
+ { "exoline-tcp", { NULL }, 26486, "tcp" },
+ { "exoline-udp", { NULL }, 26486, "udp" },
+ { "exoconfig", { NULL }, 26487, "tcp" },
+ { "exoconfig", { NULL }, 26487, "udp" },
+ { "exonet", { NULL }, 26489, "tcp" },
+ { "exonet", { NULL }, 26489, "udp" },
+ { "imagepump", { NULL }, 27345, "tcp" },
+ { "imagepump", { NULL }, 27345, "udp" },
+ { "jesmsjc", { NULL }, 27442, "tcp" },
+ { "jesmsjc", { NULL }, 27442, "udp" },
+ { "kopek-httphead", { NULL }, 27504, "tcp" },
+ { "kopek-httphead", { NULL }, 27504, "udp" },
+ { "ars-vista", { NULL }, 27782, "tcp" },
+ { "ars-vista", { NULL }, 27782, "udp" },
+ { "tw-auth-key", { NULL }, 27999, "tcp" },
+ { "tw-auth-key", { NULL }, 27999, "udp" },
+ { "nxlmd", { NULL }, 28000, "tcp" },
+ { "nxlmd", { NULL }, 28000, "udp" },
+ { "pqsp", { NULL }, 28001, "tcp" },
+ { "siemensgsm", { NULL }, 28240, "tcp" },
+ { "siemensgsm", { NULL }, 28240, "udp" },
+ { "sgsap", { NULL }, 29118, "sctp"},
+ { "otmp", { NULL }, 29167, "tcp" },
+ { "otmp", { NULL }, 29167, "udp" },
+ { "sbcap", { NULL }, 29168, "sctp"},
+ { "iuhsctpassoc", { NULL }, 29169, "sctp"},
+ { "pago-services1", { NULL }, 30001, "tcp" },
+ { "pago-services1", { NULL }, 30001, "udp" },
+ { "pago-services2", { NULL }, 30002, "tcp" },
+ { "pago-services2", { NULL }, 30002, "udp" },
+ { "kingdomsonline", { NULL }, 30260, "tcp" },
+ { "kingdomsonline", { NULL }, 30260, "udp" },
+ { "ovobs", { NULL }, 30999, "tcp" },
+ { "ovobs", { NULL }, 30999, "udp" },
+ { "autotrac-acp", { NULL }, 31020, "tcp" },
+ { "yawn", { NULL }, 31029, "udp" },
+ { "xqosd", { NULL }, 31416, "tcp" },
+ { "xqosd", { NULL }, 31416, "udp" },
+ { "tetrinet", { NULL }, 31457, "tcp" },
+ { "tetrinet", { NULL }, 31457, "udp" },
+ { "lm-mon", { NULL }, 31620, "tcp" },
+ { "lm-mon", { NULL }, 31620, "udp" },
+ { "dsx_monitor", { NULL }, 31685, "tcp" },
+ { "gamesmith-port", { NULL }, 31765, "tcp" },
+ { "gamesmith-port", { NULL }, 31765, "udp" },
+ { "iceedcp_tx", { NULL }, 31948, "tcp" },
+ { "iceedcp_tx", { NULL }, 31948, "udp" },
+ { "iceedcp_rx", { NULL }, 31949, "tcp" },
+ { "iceedcp_rx", { NULL }, 31949, "udp" },
+ { "iracinghelper", { NULL }, 32034, "tcp" },
+ { "iracinghelper", { NULL }, 32034, "udp" },
+ { "t1distproc60", { NULL }, 32249, "tcp" },
+ { "t1distproc60", { NULL }, 32249, "udp" },
+ { "apm-link", { NULL }, 32483, "tcp" },
+ { "apm-link", { NULL }, 32483, "udp" },
+ { "sec-ntb-clnt", { NULL }, 32635, "tcp" },
+ { "sec-ntb-clnt", { NULL }, 32635, "udp" },
+ { "DMExpress", { NULL }, 32636, "tcp" },
+ { "DMExpress", { NULL }, 32636, "udp" },
+ { "filenet-powsrm", { NULL }, 32767, "tcp" },
+ { "filenet-powsrm", { NULL }, 32767, "udp" },
+ { "filenet-tms", { NULL }, 32768, "tcp" },
+ { "filenet-tms", { NULL }, 32768, "udp" },
+ { "filenet-rpc", { NULL }, 32769, "tcp" },
+ { "filenet-rpc", { NULL }, 32769, "udp" },
+ { "filenet-nch", { NULL }, 32770, "tcp" },
+ { "filenet-nch", { NULL }, 32770, "udp" },
+ { "filenet-rmi", { NULL }, 32771, "tcp" },
+ { "filenet-rmi", { NULL }, 32771, "udp" },
+ { "filenet-pa", { NULL }, 32772, "tcp" },
+ { "filenet-pa", { NULL }, 32772, "udp" },
+ { "filenet-cm", { NULL }, 32773, "tcp" },
+ { "filenet-cm", { NULL }, 32773, "udp" },
+ { "filenet-re", { NULL }, 32774, "tcp" },
+ { "filenet-re", { NULL }, 32774, "udp" },
+ { "filenet-pch", { NULL }, 32775, "tcp" },
+ { "filenet-pch", { NULL }, 32775, "udp" },
+ { "filenet-peior", { NULL }, 32776, "tcp" },
+ { "filenet-peior", { NULL }, 32776, "udp" },
+ { "filenet-obrok", { NULL }, 32777, "tcp" },
+ { "filenet-obrok", { NULL }, 32777, "udp" },
+ { "mlsn", { NULL }, 32801, "tcp" },
+ { "mlsn", { NULL }, 32801, "udp" },
+ { "retp", { NULL }, 32811, "tcp" },
+ { "idmgratm", { NULL }, 32896, "tcp" },
+ { "idmgratm", { NULL }, 32896, "udp" },
+ { "aurora-balaena", { NULL }, 33123, "tcp" },
+ { "aurora-balaena", { NULL }, 33123, "udp" },
+ { "diamondport", { NULL }, 33331, "tcp" },
+ { "diamondport", { NULL }, 33331, "udp" },
+ { "dgi-serv", { NULL }, 33333, "tcp" },
+ { "traceroute", { NULL }, 33434, "tcp" },
+ { "traceroute", { NULL }, 33434, "udp" },
+ { "snip-slave", { NULL }, 33656, "tcp" },
+ { "snip-slave", { NULL }, 33656, "udp" },
+ { "turbonote-2", { NULL }, 34249, "tcp" },
+ { "turbonote-2", { NULL }, 34249, "udp" },
+ { "p-net-local", { NULL }, 34378, "tcp" },
+ { "p-net-local", { NULL }, 34378, "udp" },
+ { "p-net-remote", { NULL }, 34379, "tcp" },
+ { "p-net-remote", { NULL }, 34379, "udp" },
+ { "dhanalakshmi", { NULL }, 34567, "tcp" },
+ { "profinet-rt", { NULL }, 34962, "tcp" },
+ { "profinet-rt", { NULL }, 34962, "udp" },
+ { "profinet-rtm", { NULL }, 34963, "tcp" },
+ { "profinet-rtm", { NULL }, 34963, "udp" },
+ { "profinet-cm", { NULL }, 34964, "tcp" },
+ { "profinet-cm", { NULL }, 34964, "udp" },
+ { "ethercat", { NULL }, 34980, "tcp" },
+ { "ethercat", { NULL }, 34980, "udp" },
+ { "allpeers", { NULL }, 36001, "tcp" },
+ { "allpeers", { NULL }, 36001, "udp" },
+ { "s1-control", { NULL }, 36412, "sctp"},
+ { "x2-control", { NULL }, 36422, "sctp"},
+ { "m2ap", { NULL }, 36443, "sctp"},
+ { "m3ap", { NULL }, 36444, "sctp"},
+ { "kastenxpipe", { NULL }, 36865, "tcp" },
+ { "kastenxpipe", { NULL }, 36865, "udp" },
+ { "neckar", { NULL }, 37475, "tcp" },
+ { "neckar", { NULL }, 37475, "udp" },
+ { "unisys-eportal", { NULL }, 37654, "tcp" },
+ { "unisys-eportal", { NULL }, 37654, "udp" },
+ { "galaxy7-data", { NULL }, 38201, "tcp" },
+ { "galaxy7-data", { NULL }, 38201, "udp" },
+ { "fairview", { NULL }, 38202, "tcp" },
+ { "fairview", { NULL }, 38202, "udp" },
+ { "agpolicy", { NULL }, 38203, "tcp" },
+ { "agpolicy", { NULL }, 38203, "udp" },
+ { "turbonote-1", { NULL }, 39681, "tcp" },
+ { "turbonote-1", { NULL }, 39681, "udp" },
+ { "safetynetp", { NULL }, 40000, "tcp" },
+ { "safetynetp", { NULL }, 40000, "udp" },
+ { "cscp", { NULL }, 40841, "tcp" },
+ { "cscp", { NULL }, 40841, "udp" },
+ { "csccredir", { NULL }, 40842, "tcp" },
+ { "csccredir", { NULL }, 40842, "udp" },
+ { "csccfirewall", { NULL }, 40843, "tcp" },
+ { "csccfirewall", { NULL }, 40843, "udp" },
+ { "ortec-disc", { NULL }, 40853, "udp" },
+ { "fs-qos", { NULL }, 41111, "tcp" },
+ { "fs-qos", { NULL }, 41111, "udp" },
+ { "tentacle", { NULL }, 41121, "tcp" },
+ { "crestron-cip", { NULL }, 41794, "tcp" },
+ { "crestron-cip", { NULL }, 41794, "udp" },
+ { "crestron-ctp", { NULL }, 41795, "tcp" },
+ { "crestron-ctp", { NULL }, 41795, "udp" },
+ { "candp", { NULL }, 42508, "tcp" },
+ { "candp", { NULL }, 42508, "udp" },
+ { "candrp", { NULL }, 42509, "tcp" },
+ { "candrp", { NULL }, 42509, "udp" },
+ { "caerpc", { NULL }, 42510, "tcp" },
+ { "caerpc", { NULL }, 42510, "udp" },
+ { "reachout", { NULL }, 43188, "tcp" },
+ { "reachout", { NULL }, 43188, "udp" },
+ { "ndm-agent-port", { NULL }, 43189, "tcp" },
+ { "ndm-agent-port", { NULL }, 43189, "udp" },
+ { "ip-provision", { NULL }, 43190, "tcp" },
+ { "ip-provision", { NULL }, 43190, "udp" },
+ { "noit-transport", { NULL }, 43191, "tcp" },
+ { "ew-mgmt", { NULL }, 43440, "tcp" },
+ { "ew-disc-cmd", { NULL }, 43440, "udp" },
+ { "ciscocsdb", { NULL }, 43441, "tcp" },
+ { "ciscocsdb", { NULL }, 43441, "udp" },
+ { "pmcd", { NULL }, 44321, "tcp" },
+ { "pmcd", { NULL }, 44321, "udp" },
+ { "pmcdproxy", { NULL }, 44322, "tcp" },
+ { "pmcdproxy", { NULL }, 44322, "udp" },
+ { "pcp", { NULL }, 44323, "udp" },
+ { "rbr-debug", { NULL }, 44553, "tcp" },
+ { "rbr-debug", { NULL }, 44553, "udp" },
+ { "EtherNet/IP-2", { NULL }, 44818, "tcp" },
+ { "EtherNet/IP-2", { NULL }, 44818, "udp" },
+ { "invision-ag", { NULL }, 45054, "tcp" },
+ { "invision-ag", { NULL }, 45054, "udp" },
+ { "eba", { NULL }, 45678, "tcp" },
+ { "eba", { NULL }, 45678, "udp" },
+ { "qdb2service", { NULL }, 45825, "tcp" },
+ { "qdb2service", { NULL }, 45825, "udp" },
+ { "ssr-servermgr", { NULL }, 45966, "tcp" },
+ { "ssr-servermgr", { NULL }, 45966, "udp" },
+ { "mediabox", { NULL }, 46999, "tcp" },
+ { "mediabox", { NULL }, 46999, "udp" },
+ { "mbus", { NULL }, 47000, "tcp" },
+ { "mbus", { NULL }, 47000, "udp" },
+ { "winrm", { NULL }, 47001, "tcp" },
+ { "dbbrowse", { NULL }, 47557, "tcp" },
+ { "dbbrowse", { NULL }, 47557, "udp" },
+ { "directplaysrvr", { NULL }, 47624, "tcp" },
+ { "directplaysrvr", { NULL }, 47624, "udp" },
+ { "ap", { NULL }, 47806, "tcp" },
+ { "ap", { NULL }, 47806, "udp" },
+ { "bacnet", { NULL }, 47808, "tcp" },
+ { "bacnet", { NULL }, 47808, "udp" },
+ { "nimcontroller", { NULL }, 48000, "tcp" },
+ { "nimcontroller", { NULL }, 48000, "udp" },
+ { "nimspooler", { NULL }, 48001, "tcp" },
+ { "nimspooler", { NULL }, 48001, "udp" },
+ { "nimhub", { NULL }, 48002, "tcp" },
+ { "nimhub", { NULL }, 48002, "udp" },
+ { "nimgtw", { NULL }, 48003, "tcp" },
+ { "nimgtw", { NULL }, 48003, "udp" },
+ { "nimbusdb", { NULL }, 48004, "tcp" },
+ { "nimbusdbctrl", { NULL }, 48005, "tcp" },
+ { "3gpp-cbsp", { NULL }, 48049, "tcp" },
+ { "isnetserv", { NULL }, 48128, "tcp" },
+ { "isnetserv", { NULL }, 48128, "udp" },
+ { "blp5", { NULL }, 48129, "tcp" },
+ { "blp5", { NULL }, 48129, "udp" },
+ { "com-bardac-dw", { NULL }, 48556, "tcp" },
+ { "com-bardac-dw", { NULL }, 48556, "udp" },
+ { "iqobject", { NULL }, 48619, "tcp" },
+ { "iqobject", { NULL }, 48619, "udp" },
+# endif /* USE_IANA_REGISTERED_PORTS */
+ { NULL, { NULL }, 0, NULL }
};
struct servent *getservbyport(int port, const char *proto)
{
unsigned short u_port;
- const char *protocol = NULL;
- int i, error = 0;
+ const char *protocol = NULL;
+ int error = 0;
+ size_t i;
u_port = ntohs((unsigned short)port);
- if (proto)
- {
- switch (strlen(proto)) {
+ if (proto) {
+ switch (ares_strlen(proto)) {
case 3:
- if (!strncasecmp(proto, "tcp", 3))
+ if (!strncasecmp(proto, "tcp", 3)) {
protocol = "tcp";
- else if (!strncasecmp(proto, "udp", 3))
+ } else if (!strncasecmp(proto, "udp", 3)) {
protocol = "udp";
- else
+ } else {
error = WSAEFAULT;
+ }
break;
case 4:
- if (!strncasecmp(proto, "sctp", 4))
+ if (!strncasecmp(proto, "sctp", 4)) {
protocol = "sctp";
- else if (!strncasecmp(proto, "dccp", 4))
+ } else if (!strncasecmp(proto, "dccp", 4)) {
protocol = "dccp";
- else
+ } else {
error = WSAEFAULT;
+ }
break;
default:
error = WSAEFAULT;
- }
}
+ }
- if (!error)
- {
- for (i = 0; i < (sizeof(IANAports) / sizeof(IANAports[0])) - 1; i++)
- {
- if (u_port == IANAports[i].s_port)
- {
- if (!protocol || !strcasecmp(protocol, IANAports[i].s_proto))
- return (struct servent *)&IANAports[i];
- }
+ if (!error) {
+ for (i = 0; i < (sizeof(IANAports) / sizeof(IANAports[0])) - 1; i++) {
+ if (u_port == IANAports[i].s_port) {
+ if (!protocol || !strcasecmp(protocol, IANAports[i].s_proto)) {
+ return (struct servent *)&IANAports[i];
}
- error = WSANO_DATA;
+ }
}
+ error = WSANO_DATA;
+ }
SET_SOCKERRNO(error);
return NULL;
diff --git a/contrib/libs/c-ares/src/lib/ares_private.h b/contrib/libs/c-ares/src/lib/ares_private.h
index 2c30959e89..8d6e8ba77b 100644
--- a/contrib/libs/c-ares/src/lib/ares_private.h
+++ b/contrib/libs/c-ares/src/lib/ares_private.h
@@ -32,79 +32,75 @@
*/
#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32)
-#define WIN32
+# define WIN32
#endif
#ifdef HAVE_NETINET_IN_H
-#include <netinet/in.h>
+# include <netinet/in.h>
#endif
#ifdef WATT32
-#include <tcp.h>
-#include <sys/ioctl.h>
+# include <tcp.h>
+# include <sys/ioctl.h>
#endif
-#define DEFAULT_TIMEOUT 2000 /* milliseconds */
-#define DEFAULT_TRIES 3
+#define DEFAULT_TIMEOUT 2000 /* milliseconds */
+#define DEFAULT_TRIES 3
#ifndef INADDR_NONE
-#define INADDR_NONE 0xffffffff
-#endif
-
-#ifdef CARES_EXPOSE_STATICS
-/* Make some internal functions visible for testing */
-#define STATIC_TESTABLE
-#else
-#define STATIC_TESTABLE static
+# define INADDR_NONE 0xffffffff
#endif
/* By using a double cast, we can get rid of the bogus warning of
- * warning: cast from 'const struct sockaddr *' to 'const struct sockaddr_in6 *' increases required alignment from 1 to 4 [-Wcast-align]
+ * warning: cast from 'const struct sockaddr *' to 'const struct sockaddr_in6 *'
+ * increases required alignment from 1 to 4 [-Wcast-align]
*/
#define CARES_INADDR_CAST(type, var) ((type)((void *)var))
#if defined(WIN32) && !defined(WATT32)
-#define WIN_NS_9X "System\\CurrentControlSet\\Services\\VxD\\MSTCP"
-#define WIN_NS_NT_KEY "System\\CurrentControlSet\\Services\\Tcpip\\Parameters"
-#define WIN_DNSCLIENT "Software\\Policies\\Microsoft\\System\\DNSClient"
-#define WIN_NT_DNSCLIENT "Software\\Policies\\Microsoft\\Windows NT\\DNSClient"
-#define NAMESERVER "NameServer"
-#define DHCPNAMESERVER "DhcpNameServer"
-#define DATABASEPATH "DatabasePath"
-#define WIN_PATH_HOSTS "\\hosts"
-#define SEARCHLIST_KEY "SearchList"
-#define PRIMARYDNSSUFFIX_KEY "PrimaryDNSSuffix"
-#define INTERFACES_KEY "Interfaces"
-#define DOMAIN_KEY "Domain"
-#define DHCPDOMAIN_KEY "DhcpDomain"
-
+# define WIN_NS_9X "System\\CurrentControlSet\\Services\\VxD\\MSTCP"
+# define WIN_NS_NT_KEY "System\\CurrentControlSet\\Services\\Tcpip\\Parameters"
+# define WIN_DNSCLIENT "Software\\Policies\\Microsoft\\System\\DNSClient"
+# define WIN_NT_DNSCLIENT \
+ "Software\\Policies\\Microsoft\\Windows NT\\DNSClient"
+# define NAMESERVER "NameServer"
+# define DHCPNAMESERVER "DhcpNameServer"
+# define DATABASEPATH "DatabasePath"
+# define WIN_PATH_HOSTS "\\hosts"
+# define SEARCHLIST_KEY "SearchList"
+# define PRIMARYDNSSUFFIX_KEY "PrimaryDNSSuffix"
+# define INTERFACES_KEY "Interfaces"
+# define DOMAIN_KEY "Domain"
+# define DHCPDOMAIN_KEY "DhcpDomain"
+# define PATH_RESOLV_CONF ""
#elif defined(WATT32)
-#define PATH_RESOLV_CONF "/dev/ENV/etc/resolv.conf"
-W32_FUNC const char *_w32_GetHostsFile (void);
+# define PATH_RESOLV_CONF "/dev/ENV/etc/resolv.conf"
+W32_FUNC const char *_w32_GetHostsFile(void);
#elif defined(NETWARE)
-#define PATH_RESOLV_CONF "sys:/etc/resolv.cfg"
-#define PATH_HOSTS "sys:/etc/hosts"
+# define PATH_RESOLV_CONF "sys:/etc/resolv.cfg"
+# define PATH_HOSTS "sys:/etc/hosts"
#elif defined(__riscos__)
-#define PATH_HOSTS "InetDBase:Hosts"
+# define PATH_RESOLV_CONF ""
+# define PATH_HOSTS "InetDBase:Hosts"
#elif defined(__HAIKU__)
-#define PATH_RESOLV_CONF "/system/settings/network/resolv.conf"
-#define PATH_HOSTS "/system/settings/network/hosts"
+# define PATH_RESOLV_CONF "/system/settings/network/resolv.conf"
+# define PATH_HOSTS "/system/settings/network/hosts"
#else
-#define PATH_RESOLV_CONF "/etc/resolv.conf"
-#ifdef ETC_INET
-#define PATH_HOSTS "/etc/inet/hosts"
-#else
-#define PATH_HOSTS "/etc/hosts"
-#endif
+# define PATH_RESOLV_CONF "/etc/resolv.conf"
+# ifdef ETC_INET
+# define PATH_HOSTS "/etc/inet/hosts"
+# else
+# define PATH_HOSTS "/etc/hosts"
+# endif
#endif
@@ -115,46 +111,46 @@ typedef struct ares_rand_state ares_rand_state;
#include "ares__llist.h"
#include "ares__slist.h"
-#include "ares__htable_stvp.h"
+#include "ares__htable_strvp.h"
+#include "ares__htable_szvp.h"
#include "ares__htable_asvp.h"
#include "ares__buf.h"
+#include "ares_dns_private.h"
+#include "ares__iface_ips.h"
+#include "ares__threads.h"
#ifndef HAVE_GETENV
# include "ares_getenv.h"
# define getenv(ptr) ares_getenv(ptr)
#endif
-#include "ares_strdup.h"
+#include "ares_str.h"
#include "ares_strsplit.h"
#ifndef HAVE_STRCASECMP
# include "ares_strcasecmp.h"
-# define strcasecmp(p1,p2) ares_strcasecmp(p1,p2)
+# define strcasecmp(p1, p2) ares_strcasecmp(p1, p2)
#endif
#ifndef HAVE_STRNCASECMP
# include "ares_strcasecmp.h"
-# define strncasecmp(p1,p2,n) ares_strncasecmp(p1,p2,n)
+# define strncasecmp(p1, p2, n) ares_strncasecmp(p1, p2, n)
#endif
/********* EDNS defines section ******/
-#define EDNSPACKETSZ 1280 /* Reasonable UDP payload size, as suggested
- in RFC2671 */
-#define MAXENDSSZ 4096 /* Maximum (local) limit for edns packet size */
-#define EDNSFIXEDSZ 11 /* Size of EDNS header */
+#define EDNSPACKETSZ \
+ 1232 /* Reasonable UDP payload size, as agreed by operators \
+ https://www.dnsflagday.net/2020/#faq */
+#define MAXENDSSZ 4096 /* Maximum (local) limit for edns packet size */
+#define EDNSFIXEDSZ 11 /* Size of EDNS header */
+
/********* EDNS defines section ******/
-struct ares_addr {
- int family;
- union {
- struct in_addr addr4;
- struct ares_in6_addr addr6;
- } addr;
- int udp_port; /* stored in network order */
- int tcp_port; /* stored in network order */
-};
-#define addrV4 addr.addr4
-#define addrV6 addr.addr6
+/* Default values for server failover behavior. We retry failed servers with
+ * a 10% probability and a minimum delay of 5 seconds between retries.
+ */
+#define DEFAULT_SERVER_RETRY_CHANCE 10
+#define DEFAULT_SERVER_RETRY_DELAY 5000
struct query;
@@ -163,7 +159,7 @@ struct server_state;
struct server_connection {
struct server_state *server;
ares_socket_t fd;
- int is_tcp;
+ ares_bool_t is_tcp;
/* total number of queries run on this connection since it was established */
size_t total_queries;
/* list of outstanding queries to this connection */
@@ -171,12 +167,23 @@ struct server_connection {
};
struct server_state {
- size_t idx; /* index for server in ares_channel */
- struct ares_addr addr;
-
+ /* Configuration */
+ size_t idx; /* index for server in system configuration */
+ struct ares_addr addr;
+ unsigned short udp_port; /* host byte order */
+ unsigned short tcp_port; /* host byte order */
+ char ll_iface[64]; /* IPv6 Link Local Interface */
+ unsigned int ll_scope; /* IPv6 Link Local Scope */
+
+ size_t consec_failures; /* Consecutive query failure count
+ * can be hard errors or timeouts
+ */
ares__llist_t *connections;
struct server_connection *tcp_conn;
+ /* The next time when we will retry this server if it has hit failures */
+ struct timeval next_retry_time;
+
/* TCP buffer since multiple responses can come back in one read, or partial
* in a read */
ares__buf_t *tcp_parser;
@@ -184,266 +191,468 @@ struct server_state {
/* TCP output queue */
ares__buf_t *tcp_send;
- /* Which incarnation of this connection is this? We don't want to
- * retransmit requests into the very same socket, but if the server
- * closes on us and we re-open the connection, then we do want to
- * re-send. */
- int tcp_connection_generation;
-
/* Link back to owning channel */
- ares_channel channel;
+ ares_channel_t *channel;
};
/* State to represent a DNS query */
struct query {
/* Query ID from qbuf, for faster lookup, and current timeout */
- unsigned short qid; /* host byte order */
- struct timeval timeout;
- ares_channel channel;
+ unsigned short qid; /* host byte order */
+ struct timeval timeout;
+ ares_channel_t *channel;
/*
* Node object for each list entry the query belongs to in order to
* make removal operations O(1).
*/
- ares__slist_node_t *node_queries_by_timeout;
- ares__llist_node_t *node_queries_to_conn;
- ares__llist_node_t *node_all_queries;
+ ares__slist_node_t *node_queries_by_timeout;
+ ares__llist_node_t *node_queries_to_conn;
+ ares__llist_node_t *node_all_queries;
- /* connection handle for validation purposes */
- const struct server_connection *conn;
+ /* connection handle query is associated with */
+ struct server_connection *conn;
- /* Query buf with length at beginning, for TCP transmission */
- unsigned char *tcpbuf;
- int tcplen;
+ /* Arguments passed to ares_send() */
+ unsigned char *qbuf;
+ size_t qlen;
- /* Arguments passed to ares_send() (qbuf points into tcpbuf) */
- const unsigned char *qbuf;
- int qlen;
- ares_callback callback;
- void *arg;
+ ares_callback_dnsrec callback;
+ void *arg;
/* Query status */
- int try_count; /* Number of times we tried this query already. */
- int server; /* Server this query has last been sent to. */
- struct query_server_info *server_info; /* per-server state */
- int using_tcp;
- int error_status;
- int timeouts; /* number of timeouts we saw for this request */
- int no_retries; /* do not perform any additional retries, this is set when
- * a query is to be canceled */
+ size_t try_count; /* Number of times we tried this query already. */
+ ares_bool_t using_tcp;
+ ares_status_t error_status;
+ size_t timeouts; /* number of timeouts we saw for this request */
+ ares_bool_t no_retries; /* do not perform any additional retries, this is set
+ * when a query is to be canceled */
};
-/* Per-server state for a query */
-struct query_server_info {
- int skip_server; /* should we skip server, due to errors, etc? */
- int tcp_connection_generation; /* into which TCP connection did we send? */
+struct apattern {
+ struct ares_addr addr;
+ unsigned char mask;
};
-/* An IP address pattern; matches an IP address X if X & mask == addr */
-#define PATTERN_MASK 0x1
-#define PATTERN_CIDR 0x2
+struct ares__qcache;
+typedef struct ares__qcache ares__qcache_t;
-struct apattern {
- union
- {
- struct in_addr addr4;
- struct ares_in6_addr addr6;
- } addr;
- union
- {
- struct in_addr addr4;
- struct ares_in6_addr addr6;
- unsigned short bits;
- } mask;
- int family;
- unsigned short type;
-};
+struct ares_hosts_file;
+typedef struct ares_hosts_file ares_hosts_file_t;
struct ares_channeldata {
/* Configuration data */
- int flags;
- int timeout; /* in milliseconds */
- int maxtimeout; /* in milliseconds */
- int jitter; /* in .001 */
- unsigned int jitter_rand_state;
- int tries;
- int ndots;
- int rotate; /* if true, all servers specified are used */
- int udp_port; /* stored in network order */
- int tcp_port; /* stored in network order */
- int socket_send_buffer_size;
- int socket_receive_buffer_size;
- char **domains;
- int ndomains;
- struct apattern *sortlist;
- int nsort;
- char *lookups;
- int ednspsz;
+ unsigned int flags;
+ size_t timeout; /* in milliseconds */
+ size_t tries;
+ size_t ndots;
+ size_t maxtimeout; /* in milliseconds */
+ ares_bool_t rotate;
+ unsigned short udp_port; /* stored in network order */
+ unsigned short tcp_port; /* stored in network order */
+ int socket_send_buffer_size; /* setsockopt takes int */
+ int socket_receive_buffer_size; /* setsockopt takes int */
+ char **domains;
+ size_t ndomains;
+ struct apattern *sortlist;
+ size_t nsort;
+ char *lookups;
+ size_t ednspsz;
+ unsigned int qcache_max_ttl;
+ ares_evsys_t evsys;
+ unsigned int optmask;
/* For binding to local devices and/or IP addresses. Leave
* them null/zero for no binding.
*/
- char local_dev_name[32];
- unsigned int local_ip4;
- unsigned char local_ip6[16];
+ char local_dev_name[32];
+ unsigned int local_ip4;
+ unsigned char local_ip6[16];
- int optmask; /* the option bitfield passed in at init time */
+ /* Thread safety lock */
+ ares__thread_mutex_t *lock;
- /* Server addresses and communications state */
- struct server_state *servers;
- int nservers;
+ /* Conditional to wake waiters when queue is empty */
+ ares__thread_cond_t *cond_empty;
- /* random state to use when generating new ids */
- ares_rand_state *rand_state;
+ /* Server addresses and communications state. Sorted by least consecutive
+ * failures, followed by the configuration order if failures are equal. */
+ ares__slist_t *servers;
- /* Generation number to use for the next TCP socket open/close */
- int tcp_connection_generation;
-
- /* Last server we sent a query to. */
- int last_server;
+ /* random state to use when generating new ids and generating retry penalties
+ */
+ ares_rand_state *rand_state;
/* All active queries in a single list */
- ares__llist_t *all_queries;
+ ares__llist_t *all_queries;
/* Queries bucketed by qid, for quickly dispatching DNS responses: */
- ares__htable_stvp_t *queries_by_qid;
+ ares__htable_szvp_t *queries_by_qid;
/* Queries bucketed by timeout, for quickly handling timeouts: */
- ares__slist_t *queries_by_timeout;
+ ares__slist_t *queries_by_timeout;
/* Map linked list node member for connection to file descriptor. We use
* the node instead of the connection object itself so we can quickly look
* up a connection and remove it if necessary (as otherwise we'd have to
* scan all connections) */
- ares__htable_asvp_t *connnode_by_socket;
+ ares__htable_asvp_t *connnode_by_socket;
- ares_sock_state_cb sock_state_cb;
- void *sock_state_cb_data;
+ ares_sock_state_cb sock_state_cb;
+ void *sock_state_cb_data;
- ares_sock_create_callback sock_create_cb;
- void *sock_create_cb_data;
+ ares_sock_create_callback sock_create_cb;
+ void *sock_create_cb_data;
- ares_sock_config_callback sock_config_cb;
- void *sock_config_cb_data;
+ ares_sock_config_callback sock_config_cb;
+ void *sock_config_cb_data;
- const struct ares_socket_functions * sock_funcs;
- void *sock_func_cb_data;
+ const struct ares_socket_functions *sock_funcs;
+ void *sock_func_cb_data;
/* Path for resolv.conf file, configurable via ares_options */
- char *resolvconf_path;
+ char *resolvconf_path;
/* Path for hosts file, configurable via ares_options */
- char *hosts_path;
+ char *hosts_path;
/* Maximum UDP queries per connection allowed */
- int udp_max_queries;
+ size_t udp_max_queries;
+
+ /* Cache of local hosts file */
+ ares_hosts_file_t *hf;
+
+ /* Query Cache */
+ ares__qcache_t *qcache;
+
+ /* Fields controlling server failover behavior.
+ * The retry chance is the probability (1/N) by which we will retry a failed
+ * server instead of the best server when selecting a server to send queries
+ * to.
+ * The retry delay is the minimum time in milliseconds to wait between doing
+ * such retries (applied per-server).
+ */
+ unsigned short server_retry_chance;
+ size_t server_retry_delay;
};
/* Does the domain end in ".onion" or ".onion."? Case-insensitive. */
-int ares__is_onion_domain(const char *name);
+ares_bool_t ares__is_onion_domain(const char *name);
/* Memory management functions */
extern void *(*ares_malloc)(size_t size);
extern void *(*ares_realloc)(void *ptr, size_t size);
extern void (*ares_free)(void *ptr);
+void *ares_malloc_zero(size_t size);
+void *ares_realloc_zero(void *ptr, size_t orig_size, size_t new_size);
/* return true if now is exactly check time or later */
-int ares__timedout(struct timeval *now,
- struct timeval *check);
+ares_bool_t ares__timedout(const struct timeval *now,
+ const struct timeval *check);
/* Returns one of the normal ares status codes like ARES_SUCCESS */
-int ares__send_query(ares_channel channel, struct query *query,
- struct timeval *now);
-
-/* Identical to ares_query, but returns a normal ares return code like
- * ARES_SUCCESS, and can be passed the qid by reference which will be
- * filled in on ARES_SUCCESS */
-int ares_query_qid(ares_channel channel, const char *name,
- int dnsclass, int type, ares_callback callback,
- void *arg, unsigned short *qid);
-/* Identical to ares_send() except returns normal ares return codes like
- * ARES_SUCCESS */
-int ares_send_ex(ares_channel channel, const unsigned char *qbuf, int qlen,
- ares_callback callback, void *arg);
+ares_status_t ares__send_query(struct query *query, struct timeval *now);
+ares_status_t ares__requeue_query(struct query *query, struct timeval *now);
+
+/*! Retrieve a list of names to use for searching. The first successful
+ * query in the list wins. This function also uses the HOSTSALIASES file
+ * as well as uses channel configuration to determine the search order.
+ *
+ * \param[in] channel initialized ares channel
+ * \param[in] name initial name being searched
+ * \param[out] names array of names to attempt, use ares__strsplit_free()
+ * when no longer needed.
+ * \param[out] names_len number of names in array
+ * \return ARES_SUCCESS on success, otherwise one of the other error codes.
+ */
+ares_status_t ares__search_name_list(const ares_channel_t *channel,
+ const char *name, char ***names,
+ size_t *names_len);
+
+/*! Function to create callback arg for converting from ares_callback_dnsrec
+ * to ares_calback */
+void *ares__dnsrec_convert_arg(ares_callback callback, void *arg);
+
+/*! Callback function used to convert from the ares_callback_dnsrec prototype to
+ * the ares_callback prototype, by writing the result and passing that to
+ * the inner callback.
+ */
+void ares__dnsrec_convert_cb(void *arg, ares_status_t status, size_t timeouts,
+ const ares_dns_record_t *dnsrec);
+
void ares__close_connection(struct server_connection *conn);
void ares__close_sockets(struct server_state *server);
-void ares__check_cleanup_conn(ares_channel channel, ares_socket_t fd);
-int ares__get_hostent(FILE *fp, int family, struct hostent **host);
-int ares__read_line(FILE *fp, char **buf, size_t *bufsize);
+void ares__check_cleanup_conn(const ares_channel_t *channel,
+ struct server_connection *conn);
void ares__free_query(struct query *query);
ares_rand_state *ares__init_rand_state(void);
-void ares__destroy_rand_state(ares_rand_state *state);
+void ares__destroy_rand_state(ares_rand_state *state);
void ares__rand_bytes(ares_rand_state *state, unsigned char *buf, size_t len);
unsigned short ares__generate_new_id(ares_rand_state *state);
struct timeval ares__tvnow(void);
-int ares__expand_name_validated(const unsigned char *encoded,
- const unsigned char *abuf,
- int alen, char **s, long *enclen,
- int is_hostname);
-int ares__expand_name_for_response(const unsigned char *encoded,
- const unsigned char *abuf, int alen,
- char **s, long *enclen, int is_hostname);
-int ares__init_servers_state(ares_channel channel);
-void ares__destroy_servers_state(ares_channel channel);
-int ares__parse_qtype_reply(const unsigned char* abuf, int alen, int* qtype);
-int ares__single_domain(ares_channel channel, const char *name, char **s);
-int ares__cat_domain(const char *name, const char *domain, char **s);
-int ares__sortaddrinfo(ares_channel channel, struct ares_addrinfo_node *ai_node);
-int ares__readaddrinfo(FILE *fp, const char *name, unsigned short port,
- const struct ares_addrinfo_hints *hints,
- struct ares_addrinfo *ai);
-
-void ares__freeaddrinfo_nodes(struct ares_addrinfo_node *ai_node);
-
-struct ares_addrinfo_node *ares__append_addrinfo_node(struct ares_addrinfo_node **ai_node);
+void ares__timeval_remaining(struct timeval *remaining,
+ const struct timeval *now,
+ const struct timeval *tout);
+ares_status_t ares__expand_name_validated(const unsigned char *encoded,
+ const unsigned char *abuf,
+ size_t alen, char **s, size_t *enclen,
+ ares_bool_t is_hostname);
+ares_status_t ares__expand_name_for_response(const unsigned char *encoded,
+ const unsigned char *abuf,
+ size_t alen, char **s,
+ size_t *enclen,
+ ares_bool_t is_hostname);
+ares_status_t ares_expand_string_ex(const unsigned char *encoded,
+ const unsigned char *abuf, size_t alen,
+ unsigned char **s, size_t *enclen);
+ares_status_t ares__init_servers_state(ares_channel_t *channel);
+ares_status_t ares__init_by_options(ares_channel_t *channel,
+ const struct ares_options *options,
+ int optmask);
+ares_status_t ares__init_by_sysconfig(ares_channel_t *channel);
+
+typedef struct {
+ ares__llist_t *sconfig;
+ struct apattern *sortlist;
+ size_t nsortlist;
+ char **domains;
+ size_t ndomains;
+ char *lookups;
+ size_t ndots;
+ size_t tries;
+ ares_bool_t rotate;
+ size_t timeout_ms;
+ ares_bool_t usevc;
+} ares_sysconfig_t;
+
+ares_status_t ares__init_by_environment(ares_sysconfig_t *sysconfig);
+
+ares_status_t ares__init_sysconfig_files(const ares_channel_t *channel,
+ ares_sysconfig_t *sysconfig);
+ares_status_t ares__parse_sortlist(struct apattern **sortlist, size_t *nsort,
+ const char *str);
+
+void ares__destroy_servers_state(ares_channel_t *channel);
+
+/* Returns ARES_SUCCESS if alias found, alias is set. Returns ARES_ENOTFOUND
+ * if not alias found. Returns other errors on critical failure like
+ * ARES_ENOMEM */
+ares_status_t ares__lookup_hostaliases(const ares_channel_t *channel,
+ const char *name, char **alias);
+
+ares_status_t ares__cat_domain(const char *name, const char *domain, char **s);
+ares_status_t ares__sortaddrinfo(ares_channel_t *channel,
+ struct ares_addrinfo_node *ai_node);
+
+void ares__freeaddrinfo_nodes(struct ares_addrinfo_node *ai_node);
+ares_bool_t ares__is_localhost(const char *name);
+
+struct ares_addrinfo_node *
+ ares__append_addrinfo_node(struct ares_addrinfo_node **ai_node);
void ares__addrinfo_cat_nodes(struct ares_addrinfo_node **head,
- struct ares_addrinfo_node *tail);
+ struct ares_addrinfo_node *tail);
void ares__freeaddrinfo_cnames(struct ares_addrinfo_cname *ai_cname);
-struct ares_addrinfo_cname *ares__append_addrinfo_cname(struct ares_addrinfo_cname **ai_cname);
-
-int ares_append_ai_node(int aftype, unsigned short port, int ttl,
- const void *adata,
- struct ares_addrinfo_node **nodes);
-
-void ares__addrinfo_cat_cnames(struct ares_addrinfo_cname **head,
- struct ares_addrinfo_cname *tail);
-
-int ares__parse_into_addrinfo(const unsigned char *abuf,
- int alen, int cname_only_is_enodata,
- unsigned short port,
- struct ares_addrinfo *ai);
+struct ares_addrinfo_cname *
+ ares__append_addrinfo_cname(struct ares_addrinfo_cname **ai_cname);
+
+ares_status_t ares_append_ai_node(int aftype, unsigned short port,
+ unsigned int ttl, const void *adata,
+ struct ares_addrinfo_node **nodes);
+
+void ares__addrinfo_cat_cnames(struct ares_addrinfo_cname **head,
+ struct ares_addrinfo_cname *tail);
+
+ares_status_t ares__parse_into_addrinfo(const ares_dns_record_t *dnsrec,
+ ares_bool_t cname_only_is_enodata,
+ unsigned short port,
+ struct ares_addrinfo *ai);
+ares_status_t ares_parse_ptr_reply_dnsrec(const ares_dns_record_t *dnsrec,
+ const void *addr, int addrlen,
+ int family, struct hostent **host);
+
+ares_status_t ares__addrinfo2hostent(const struct ares_addrinfo *ai, int family,
+ struct hostent **host);
+ares_status_t ares__addrinfo2addrttl(const struct ares_addrinfo *ai, int family,
+ size_t req_naddrttls,
+ struct ares_addrttl *addrttls,
+ struct ares_addr6ttl *addr6ttls,
+ size_t *naddrttls);
+ares_status_t ares__addrinfo_localhost(const char *name, unsigned short port,
+ const struct ares_addrinfo_hints *hints,
+ struct ares_addrinfo *ai);
+ares_status_t ares__open_connection(ares_channel_t *channel,
+ struct server_state *server,
+ ares_bool_t is_tcp);
+ares_socket_t ares__open_socket(ares_channel_t *channel, int af, int type,
+ int protocol);
+ares_ssize_t ares__socket_write(ares_channel_t *channel, ares_socket_t s,
+ const void *data, size_t len);
+ares_ssize_t ares__socket_recvfrom(ares_channel_t *channel, ares_socket_t s,
+ void *data, size_t data_len, int flags,
+ struct sockaddr *from,
+ ares_socklen_t *from_len);
+ares_ssize_t ares__socket_recv(ares_channel_t *channel, ares_socket_t s,
+ void *data, size_t data_len);
+void ares__close_socket(ares_channel, ares_socket_t);
+int ares__connect_socket(ares_channel_t *channel, ares_socket_t sockfd,
+ const struct sockaddr *addr, ares_socklen_t addrlen);
+void ares__destroy_server(struct server_state *server);
+
+ares_status_t ares__servers_update(ares_channel_t *channel,
+ ares__llist_t *server_list,
+ ares_bool_t user_specified);
+ares_status_t ares__sconfig_append(ares__llist_t **sconfig,
+ const struct ares_addr *addr,
+ unsigned short udp_port,
+ unsigned short tcp_port,
+ const char *ll_iface);
+ares_status_t ares__sconfig_append_fromstr(ares__llist_t **sconfig,
+ const char *str,
+ ares_bool_t ignore_invalid);
+ares_status_t ares_in_addr_to_server_config_llist(const struct in_addr *servers,
+ size_t nservers,
+ ares__llist_t **llist);
+
+struct ares_hosts_entry;
+typedef struct ares_hosts_entry ares_hosts_entry_t;
+
+void ares__hosts_file_destroy(ares_hosts_file_t *hf);
+ares_status_t ares__hosts_search_ipaddr(ares_channel_t *channel,
+ ares_bool_t use_env, const char *ipaddr,
+ const ares_hosts_entry_t **entry);
+ares_status_t ares__hosts_search_host(ares_channel_t *channel,
+ ares_bool_t use_env, const char *host,
+ const ares_hosts_entry_t **entry);
+ares_status_t ares__hosts_entry_to_hostent(const ares_hosts_entry_t *entry,
+ int family,
+ struct hostent **hostent);
+ares_status_t ares__hosts_entry_to_addrinfo(const ares_hosts_entry_t *entry,
+ const char *name, int family,
+ unsigned short port,
+ ares_bool_t want_cnames,
+ struct ares_addrinfo *ai);
+
+
+/*! Parse a compressed DNS name as defined in RFC1035 starting at the current
+ * offset within the buffer.
+ *
+ * It is assumed that either a const buffer is being used, or before
+ * the message processing was started that ares__buf_reclaim() was called.
+ *
+ * \param[in] buf Initialized buffer object
+ * \param[out] name Pointer passed by reference to be filled in with
+ * allocated string of the parsed name that must be
+ * ares_free()'d by the caller.
+ * \param[in] is_hostname if ARES_TRUE, will validate the character set for
+ * a valid hostname or will return error.
+ * \return ARES_SUCCESS on success
+ */
+ares_status_t ares__dns_name_parse(ares__buf_t *buf, char **name,
+ ares_bool_t is_hostname);
-int ares__addrinfo2hostent(const struct ares_addrinfo *ai, int family,
- struct hostent **host);
-int ares__addrinfo2addrttl(const struct ares_addrinfo *ai, int family,
- int req_naddrttls, struct ares_addrttl *addrttls,
- struct ares_addr6ttl *addr6ttls, int *naddrttls);
-int ares__addrinfo_localhost(const char *name, unsigned short port,
- const struct ares_addrinfo_hints *hints,
- struct ares_addrinfo *ai);
+/*! Write the DNS name to the buffer in the DNS domain-name syntax as a
+ * series of labels. The maximum domain name length is 255 characters with
+ * each label being a maximum of 63 characters. If the validate_hostname
+ * flag is set, it will strictly validate the character set.
+ *
+ * \param[in,out] buf Initialized buffer object to write name to
+ * \param[in,out] list Pointer passed by reference to maintain a list of
+ * domain name to indexes used for name compression.
+ * Pass NULL (not by reference) if name compression isn't
+ * desired. Otherwise the list will be automatically
+ * created upon first entry.
+ * \param[in] validate_hostname Validate the hostname character set.
+ * \param[in] name Name to write out, it may have escape
+ * sequences.
+ * \return ARES_SUCCESS on success, most likely ARES_EBADNAME if the name is
+ * bad.
+ */
+ares_status_t ares__dns_name_write(ares__buf_t *buf, ares__llist_t **list,
+ ares_bool_t validate_hostname,
+ const char *name);
-#if 0 /* Not used */
-long ares__tvdiff(struct timeval t1, struct timeval t2);
+/*! Check if the queue is empty, if so, wake any waiters. This is only
+ * effective if built with threading support.
+ *
+ * Must be holding a channel lock when calling this function.
+ *
+ * \param[in] channel Initialized ares channel object
+ */
+void ares_queue_notify_empty(ares_channel_t *channel);
+
+
+#define ARES_SWAP_BYTE(a, b) \
+ do { \
+ unsigned char swapByte = *(a); \
+ *(a) = *(b); \
+ *(b) = swapByte; \
+ } while (0)
+
+#define SOCK_STATE_CALLBACK(c, s, r, w) \
+ do { \
+ if ((c)->sock_state_cb) { \
+ (c)->sock_state_cb((c)->sock_state_cb_data, (s), (r), (w)); \
+ } \
+ } while (0)
+
+#define ARES_CONFIG_CHECK(x) \
+ (x && x->lookups && ares__slist_len(x->servers) > 0 && \
+ x->timeout > 0 && x->tries > 0)
+
+ares_bool_t ares__subnet_match(const struct ares_addr *addr,
+ const struct ares_addr *subnet,
+ unsigned char netmask);
+ares_bool_t ares__addr_is_linklocal(const struct ares_addr *addr);
+
+size_t ares__round_up_pow2(size_t n);
+size_t ares__log2(size_t n);
+size_t ares__pow(size_t x, size_t y);
+size_t ares__count_digits(size_t n);
+size_t ares__count_hexdigits(size_t n);
+unsigned char ares__count_bits_u8(unsigned char x);
+void ares__qcache_destroy(ares__qcache_t *cache);
+ares_status_t ares__qcache_create(ares_rand_state *rand_state,
+ unsigned int max_ttl,
+ ares__qcache_t **cache_out);
+void ares__qcache_flush(ares__qcache_t *cache);
+ares_status_t ares_qcache_insert(ares_channel_t *channel,
+ const struct timeval *now,
+ const struct query *query,
+ ares_dns_record_t *dnsrec);
+ares_status_t ares_qcache_fetch(ares_channel_t *channel,
+ const struct timeval *now,
+ const ares_dns_record_t *dnsrec,
+ const ares_dns_record_t **dnsrec_resp);
+
+ares_status_t ares__channel_threading_init(ares_channel_t *channel);
+void ares__channel_threading_destroy(ares_channel_t *channel);
+void ares__channel_lock(ares_channel_t *channel);
+void ares__channel_unlock(ares_channel_t *channel);
+
+struct ares_event_thread;
+typedef struct ares_event_thread ares_event_thread_t;
+
+void ares_event_thread_destroy(ares_channel_t *channel);
+ares_status_t ares_event_thread_init(ares_channel_t *channel);
+
+
+#ifdef _MSC_VER
+typedef __int64 ares_int64_t;
+typedef unsigned __int64 ares_uint64_t;
+#else
+typedef long long ares_int64_t;
+typedef unsigned long long ares_uint64_t;
#endif
-ares_socket_t ares__open_socket(ares_channel channel,
- int af, int type, int protocol);
-void ares__close_socket(ares_channel, ares_socket_t);
-int ares__connect_socket(ares_channel channel,
- ares_socket_t sockfd,
- const struct sockaddr *addr,
- ares_socklen_t addrlen);
-
-#define ARES_SWAP_BYTE(a,b) \
- { unsigned char swapByte = *(a); *(a) = *(b); *(b) = swapByte; }
-
-#define SOCK_STATE_CALLBACK(c, s, r, w) \
- do { \
- if ((c)->sock_state_cb) \
- (c)->sock_state_cb((c)->sock_state_cb_data, (s), (r), (w)); \
- } WHILE_FALSE
+#ifdef _WIN32
+# define HOSTENT_ADDRTYPE_TYPE short
+# define HOSTENT_LENGTH_TYPE short
+#else
+# define HOSTENT_ADDRTYPE_TYPE int
+# define HOSTENT_LENGTH_TYPE int
+#endif
#endif /* __ARES_PRIVATE_H */
diff --git a/contrib/libs/c-ares/src/lib/ares_process.c b/contrib/libs/c-ares/src/lib/ares_process.c
index a876f2a573..23fb6786c2 100644
--- a/contrib/libs/c-ares/src/lib/ares_process.c
+++ b/contrib/libs/c-ares/src/lib/ares_process.c
@@ -27,23 +27,6 @@
#include "ares_setup.h"
-#ifdef HAVE_SYS_UIO_H
-# include <sys/uio.h>
-#endif
-#ifdef HAVE_NETINET_IN_H
-# include <netinet/in.h>
-#endif
-#ifdef HAVE_NETINET_TCP_H
-# include <netinet/tcp.h>
-#endif
-#ifdef HAVE_NETDB_H
-# include <netdb.h>
-#endif
-#ifdef HAVE_ARPA_INET_H
-# include <arpa/inet.h>
-#endif
-
-#include "ares_nameser.h"
#ifdef HAVE_STRINGS_H
# include <strings.h>
@@ -54,64 +37,104 @@
#ifdef NETWARE
# include <sys/filio.h>
#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
#include <assert.h>
#include <fcntl.h>
#include <limits.h>
#include "ares.h"
-#include "ares_dns.h"
-#include "ares_nowarn.h"
#include "ares_private.h"
+#include "ares_nameser.h"
+#include "ares_dns.h"
+static void timeadd(struct timeval *now, size_t millisecs);
+static ares_bool_t try_again(int errnum);
+static void write_tcp_data(ares_channel_t *channel, fd_set *write_fds,
+ ares_socket_t write_fd);
+static void read_packets(ares_channel_t *channel, fd_set *read_fds,
+ ares_socket_t read_fd, struct timeval *now);
+static void process_timeouts(ares_channel_t *channel, struct timeval *now);
+static ares_status_t process_answer(ares_channel_t *channel,
+ const unsigned char *abuf, size_t alen,
+ struct server_connection *conn,
+ ares_bool_t tcp, struct timeval *now);
+static void handle_conn_error(struct server_connection *conn,
+ ares_bool_t critical_failure);
+
+static ares_bool_t same_questions(const ares_dns_record_t *qrec,
+ const ares_dns_record_t *arec);
+static ares_bool_t same_address(const struct sockaddr *sa,
+ const struct ares_addr *aa);
+static void end_query(ares_channel_t *channel, struct query *query,
+ ares_status_t status, const ares_dns_record_t *dnsrec);
+
+static void server_increment_failures(struct server_state *server)
+{
+ ares__slist_node_t *node;
+ const ares_channel_t *channel = server->channel;
+ struct timeval next_retry_time;
-static int try_again(int errnum);
-static void write_tcp_data(ares_channel channel, fd_set *write_fds,
- ares_socket_t write_fd, struct timeval *now);
-static void read_packets(ares_channel channel, fd_set *read_fds,
- ares_socket_t read_fd, struct timeval *now);
-static void process_timeouts(ares_channel channel, struct timeval *now);
-static void process_answer(ares_channel channel, const unsigned char *abuf,
- int alen, struct server_connection *conn, int tcp,
- struct timeval *now);
-static void handle_error(struct server_connection *conn, struct timeval *now);
-static void skip_server(ares_channel channel, struct query *query,
- struct server_state *server);
-static int next_server(ares_channel channel, struct query *query,
- struct timeval *now);
-static int open_socket(ares_channel channel, struct server_state *server,
- int is_tcp);
-static int same_questions(const unsigned char *qbuf, int qlen,
- const unsigned char *abuf, int alen);
-static int same_address(struct sockaddr *sa, struct ares_addr *aa);
-static int has_opt_rr(const unsigned char *abuf, int alen);
-static void end_query(ares_channel channel, struct query *query, int status,
- const unsigned char *abuf, int alen);
-static ares_ssize_t ares__socket_write(ares_channel channel, ares_socket_t s,
- const void * data, size_t len);
+ node = ares__slist_node_find(channel->servers, server);
+ if (node == NULL) {
+ return;
+ }
+
+ server->consec_failures++;
+ ares__slist_node_reinsert(node);
+
+ next_retry_time = ares__tvnow();
+ timeadd(&next_retry_time, channel->server_retry_delay);
+ server->next_retry_time = next_retry_time;
+}
+
+static void server_set_good(struct server_state *server)
+{
+ ares__slist_node_t *node;
+ const ares_channel_t *channel = server->channel;
+
+ node = ares__slist_node_find(channel->servers, server);
+ if (node == NULL) {
+ return;
+ }
+
+ if (server->consec_failures > 0) {
+ server->consec_failures = 0;
+ ares__slist_node_reinsert(node);
+ }
+
+ server->next_retry_time.tv_sec = 0;
+ server->next_retry_time.tv_usec = 0;
+}
/* return true if now is exactly check time or later */
-int ares__timedout(struct timeval *now,
- struct timeval *check)
+ares_bool_t ares__timedout(const struct timeval *now,
+ const struct timeval *check)
{
- long secs = (now->tv_sec - check->tv_sec);
+ ares_int64_t secs = ((ares_int64_t)now->tv_sec - (ares_int64_t)check->tv_sec);
- if(secs > 0)
- return 1; /* yes, timed out */
- if(secs < 0)
- return 0; /* nope, not timed out */
+ if (secs > 0) {
+ return ARES_TRUE; /* yes, timed out */
+ }
+ if (secs < 0) {
+ return ARES_FALSE; /* nope, not timed out */
+ }
/* if the full seconds were identical, check the sub second parts */
- return (now->tv_usec - check->tv_usec >= 0);
+ return ((ares_int64_t)now->tv_usec - (ares_int64_t)check->tv_usec) >= 0
+ ? ARES_TRUE
+ : ARES_FALSE;
}
/* add the specific number of milliseconds to the time in the first argument */
-static void timeadd(struct timeval *now, int millisecs)
+static void timeadd(struct timeval *now, size_t millisecs)
{
- now->tv_sec += millisecs/1000;
- now->tv_usec += (millisecs%1000)*1000;
+ now->tv_sec += (time_t)millisecs / 1000;
+ now->tv_usec += (time_t)((millisecs % 1000) * 1000);
- if(now->tv_usec >= 1000000) {
+ if (now->tv_usec >= 1000000) {
++(now->tv_sec);
now->tv_usec -= 1000000;
}
@@ -120,21 +143,31 @@ static void timeadd(struct timeval *now, int millisecs)
/*
* generic process function
*/
-static void processfds(ares_channel channel,
- fd_set *read_fds, ares_socket_t read_fd,
- fd_set *write_fds, ares_socket_t write_fd)
+static void processfds(ares_channel_t *channel, fd_set *read_fds,
+ ares_socket_t read_fd, fd_set *write_fds,
+ ares_socket_t write_fd)
{
- struct timeval now = ares__tvnow();
+ struct timeval now;
+
+ if (channel == NULL) {
+ return;
+ }
+
+ ares__channel_lock(channel);
- write_tcp_data(channel, write_fds, write_fd, &now);
+ now = ares__tvnow();
read_packets(channel, read_fds, read_fd, &now);
process_timeouts(channel, &now);
+ /* Write last as the other 2 operations might have triggered writes */
+ write_tcp_data(channel, write_fds, write_fd);
+
+ ares__channel_unlock(channel);
}
/* Something interesting happened on the wire, or there was a timeout.
* See what's up and respond accordingly.
*/
-void ares_process(ares_channel channel, fd_set *read_fds, fd_set *write_fds)
+void ares_process(ares_channel_t *channel, fd_set *read_fds, fd_set *write_fds)
{
processfds(channel, read_fds, ARES_SOCKET_BAD, write_fds, ARES_SOCKET_BAD);
}
@@ -142,15 +175,14 @@ void ares_process(ares_channel channel, fd_set *read_fds, fd_set *write_fds)
/* Something interesting happened on the wire, or there was a timeout.
* See what's up and respond accordingly.
*/
-void ares_process_fd(ares_channel channel,
- ares_socket_t read_fd, /* use ARES_SOCKET_BAD or valid
- file descriptors */
- ares_socket_t write_fd)
+void ares_process_fd(ares_channel_t *channel,
+ ares_socket_t read_fd, /* use ARES_SOCKET_BAD or valid
+ file descriptors */
+ ares_socket_t write_fd)
{
processfds(channel, NULL, read_fd, NULL, write_fd);
}
-
/* Return 1 if the specified error number describes a readiness error, or 0
* otherwise. This is mostly for HP-UX, which could return EAGAIN or
* EWOULDBLOCK. See this man page
@@ -158,58 +190,61 @@ void ares_process_fd(ares_channel channel,
* http://devrsrc1.external.hp.com/STKS/cgi-bin/man2html?
* manpage=/usr/share/man/man2.Z/send.2
*/
-static int try_again(int errnum)
+static ares_bool_t try_again(int errnum)
{
#if !defined EWOULDBLOCK && !defined EAGAIN
-#error "Neither EWOULDBLOCK nor EAGAIN defined"
+# error "Neither EWOULDBLOCK nor EAGAIN defined"
#endif
- switch (errnum)
- {
+
#ifdef EWOULDBLOCK
- case EWOULDBLOCK:
- return 1;
+ if (errnum == EWOULDBLOCK) {
+ return ARES_TRUE;
+ }
#endif
+
#if defined EAGAIN && EAGAIN != EWOULDBLOCK
- case EAGAIN:
- return 1;
+ if (errnum == EAGAIN) {
+ return ARES_TRUE;
+ }
#endif
- }
- return 0;
-}
+ return ARES_FALSE;
+}
/* If any TCP sockets select true for writing, write out queued data
* we have for them.
*/
-static void write_tcp_data(ares_channel channel,
- fd_set *write_fds,
- ares_socket_t write_fd,
- struct timeval *now)
+static void write_tcp_data(ares_channel_t *channel, fd_set *write_fds,
+ ares_socket_t write_fd)
{
- struct server_state *server;
- int i;
+ ares__slist_node_t *node;
- if(!write_fds && (write_fd == ARES_SOCKET_BAD))
+ if (!write_fds && (write_fd == ARES_SOCKET_BAD)) {
/* no possible action */
return;
+ }
- for (i = 0; i < channel->nservers; i++) {
+ for (node = ares__slist_node_first(channel->servers); node != NULL;
+ node = ares__slist_node_next(node)) {
+ struct server_state *server = ares__slist_node_val(node);
const unsigned char *data;
size_t data_len;
ares_ssize_t count;
/* Make sure server has data to send and is selected in write_fds or
write_fd. */
- server = &channel->servers[i];
- if (ares__buf_len(server->tcp_send) == 0 || server->tcp_conn == NULL)
+ if (ares__buf_len(server->tcp_send) == 0 || server->tcp_conn == NULL) {
continue;
+ }
if (write_fds) {
- if (!FD_ISSET(server->tcp_conn->fd, write_fds))
+ if (!FD_ISSET(server->tcp_conn->fd, write_fds)) {
continue;
+ }
} else {
- if (server->tcp_conn->fd != write_fd)
+ if (server->tcp_conn->fd != write_fd) {
continue;
+ }
}
if (write_fds) {
@@ -225,13 +260,13 @@ static void write_tcp_data(ares_channel channel,
count = ares__socket_write(channel, server->tcp_conn->fd, data, data_len);
if (count <= 0) {
if (!try_again(SOCKERRNO)) {
- handle_error(server->tcp_conn, now);
+ handle_conn_error(server->tcp_conn, ARES_TRUE);
}
continue;
}
/* Strip data written from the buffer */
- ares__buf_consume(server->tcp_send, count);
+ ares__buf_consume(server->tcp_send, (size_t)count);
/* Notify state callback all data is written */
if (ares__buf_len(server->tcp_send) == 0) {
@@ -240,78 +275,47 @@ static void write_tcp_data(ares_channel channel,
}
}
-
-static ares_ssize_t socket_recvfrom(ares_channel channel,
- ares_socket_t s,
- void * data,
- size_t data_len,
- int flags,
- struct sockaddr *from,
- ares_socklen_t *from_len)
-{
- if (channel->sock_funcs && channel->sock_funcs->arecvfrom)
- return channel->sock_funcs->arecvfrom(s, data, data_len,
- flags, from, from_len,
- channel->sock_func_cb_data);
-
-#ifdef HAVE_RECVFROM
- return recvfrom(s, data, data_len, flags, from, from_len);
-#else
- return sread(s, data, data_len);
-#endif
-}
-
-static ares_ssize_t socket_recv(ares_channel channel,
- ares_socket_t s,
- void * data,
- size_t data_len)
-{
- if (channel->sock_funcs && channel->sock_funcs->arecvfrom)
- return channel->sock_funcs->arecvfrom(s, data, data_len, 0, 0, 0,
- channel->sock_func_cb_data);
-
- return sread(s, data, data_len);
-}
-
-
/* If any TCP socket selects true for reading, read some data,
* allocate a buffer if we finish reading the length word, and process
* a packet if we finish reading one.
*/
-static void read_tcp_data(ares_channel channel, struct server_connection *conn,
- struct timeval *now)
+static void read_tcp_data(ares_channel_t *channel,
+ struct server_connection *conn, struct timeval *now)
{
ares_ssize_t count;
- struct server_state *server = conn->server;
+ struct server_state *server = conn->server;
/* Fetch buffer to store data we are reading */
- size_t ptr_len = 512;
- unsigned char *ptr = ares__buf_append_start(server->tcp_parser,
- &ptr_len);
+ size_t ptr_len = 65535;
+ unsigned char *ptr;
+
+ ptr = ares__buf_append_start(server->tcp_parser, &ptr_len);
if (ptr == NULL) {
- handle_error(conn, now);
+ handle_conn_error(conn, ARES_FALSE /* not critical to connection */);
return; /* bail out on malloc failure. TODO: make this
function return error codes */
}
/* Read from socket */
- count = socket_recv(channel, conn->fd, ptr, ptr_len);
+ count = ares__socket_recv(channel, conn->fd, ptr, ptr_len);
if (count <= 0) {
ares__buf_append_finish(server->tcp_parser, 0);
- if (!(count == -1 && try_again(SOCKERRNO)))
- handle_error(conn, now);
+ if (!(count == -1 && try_again(SOCKERRNO))) {
+ handle_conn_error(conn, ARES_TRUE);
+ }
return;
}
/* Record amount of data read */
- ares__buf_append_finish(server->tcp_parser, count);
+ ares__buf_append_finish(server->tcp_parser, (size_t)count);
/* Process all queued answers */
while (1) {
- unsigned short dns_len = 0;
- const unsigned char *data = NULL;
- size_t data_len = 0;
+ unsigned short dns_len = 0;
+ const unsigned char *data = NULL;
+ size_t data_len = 0;
+ ares_status_t status;
/* Tag so we can roll back */
ares__buf_tag(server->tcp_parser);
@@ -319,20 +323,20 @@ static void read_tcp_data(ares_channel channel, struct server_connection *conn,
/* Read length indicator */
if (ares__buf_fetch_be16(server->tcp_parser, &dns_len) != ARES_SUCCESS) {
ares__buf_tag_rollback(server->tcp_parser);
- return;
+ break;
}
/* Not enough data for a full response yet */
if (ares__buf_consume(server->tcp_parser, dns_len) != ARES_SUCCESS) {
ares__buf_tag_rollback(server->tcp_parser);
- return;
+ break;
}
/* Can't fail except for misuse */
data = ares__buf_tag_fetch(server->tcp_parser, &data_len);
if (data == NULL) {
ares__buf_tag_clear(server->tcp_parser);
- return;
+ break;
}
/* Strip off 2 bytes length */
@@ -340,13 +344,18 @@ static void read_tcp_data(ares_channel channel, struct server_connection *conn,
data_len -= 2;
/* We finished reading this answer; process it */
- process_answer(channel, data, (int)data_len, conn, 1, now);
+ status = process_answer(channel, data, data_len, conn, ARES_TRUE, now);
+ if (status != ARES_SUCCESS) {
+ handle_conn_error(conn, ARES_TRUE);
+ return;
+ }
/* Since we processed the answer, clear the tag so space can be reclaimed */
ares__buf_tag_clear(server->tcp_parser);
}
-}
+ ares__check_cleanup_conn(channel, conn);
+}
static int socket_list_append(ares_socket_t **socketlist, ares_socket_t fd,
size_t *alloc_cnt, size_t *num)
@@ -354,10 +363,11 @@ static int socket_list_append(ares_socket_t **socketlist, ares_socket_t fd,
if (*num >= *alloc_cnt) {
/* Grow by powers of 2 */
size_t new_alloc = (*alloc_cnt) << 1;
- ares_socket_t *new_list = ares_realloc(socketlist,
- new_alloc * sizeof(*new_list));
- if (new_list == NULL)
+ ares_socket_t *new_list =
+ ares_realloc(socketlist, new_alloc * sizeof(*new_list));
+ if (new_list == NULL) {
return 0;
+ }
*alloc_cnt = new_alloc;
*socketlist = new_list;
}
@@ -366,30 +376,35 @@ static int socket_list_append(ares_socket_t **socketlist, ares_socket_t fd,
return 1;
}
-
-static ares_socket_t *channel_socket_list(ares_channel channel, size_t *num)
+static ares_socket_t *channel_socket_list(const ares_channel_t *channel,
+ size_t *num)
{
- size_t alloc_cnt = 1 << 4;
- int i;
- ares_socket_t *out = ares_malloc(alloc_cnt * sizeof(*out));
+ size_t alloc_cnt = 1 << 4;
+ ares_socket_t *out = ares_malloc(alloc_cnt * sizeof(*out));
+ ares__slist_node_t *snode;
*num = 0;
- if (out == NULL)
+ if (out == NULL) {
return NULL;
+ }
+
+ for (snode = ares__slist_node_first(channel->servers); snode != NULL;
+ snode = ares__slist_node_next(snode)) {
+ struct server_state *server = ares__slist_node_val(snode);
+ ares__llist_node_t *node;
- for (i=0; i<channel->nservers; i++) {
- ares__llist_node_t *node;
- for (node = ares__llist_node_first(channel->servers[i].connections);
- node != NULL;
+ for (node = ares__llist_node_first(server->connections); node != NULL;
node = ares__llist_node_next(node)) {
- struct server_connection *conn = ares__llist_node_val(node);
+ const struct server_connection *conn = ares__llist_node_val(node);
- if (conn->fd == ARES_SOCKET_BAD)
+ if (conn->fd == ARES_SOCKET_BAD) {
continue;
+ }
- if (!socket_list_append(&out, conn->fd, &alloc_cnt, num))
+ if (!socket_list_append(&out, conn->fd, &alloc_cnt, num)) {
goto fail;
+ }
}
}
@@ -402,21 +417,23 @@ fail:
}
/* If any UDP sockets select true for reading, process them. */
-static void read_udp_packets_fd(ares_channel channel,
+static void read_udp_packets_fd(ares_channel_t *channel,
struct server_connection *conn,
- struct timeval *now)
+ struct timeval *now)
{
- ares_ssize_t read_len;
+ ares_ssize_t read_len;
unsigned char buf[MAXENDSSZ + 1];
- ares_socket_t fd = conn->fd; /* Cache for validation */
#ifdef HAVE_RECVFROM
ares_socklen_t fromlen;
+
union {
struct sockaddr sa;
struct sockaddr_in sa4;
struct sockaddr_in6 sa6;
} from;
+
+ memset(&from, 0, sizeof(from));
#endif
/* To reduce event loop overhead, read and process as many
@@ -430,8 +447,8 @@ static void read_udp_packets_fd(ares_channel channel,
} else {
fromlen = sizeof(from.sa6);
}
- read_len = socket_recvfrom(channel, conn->fd, (void *)buf,
- sizeof(buf), 0, &from.sa, &fromlen);
+ read_len = ares__socket_recvfrom(channel, conn->fd, (void *)buf,
+ sizeof(buf), 0, &from.sa, &fromlen);
}
if (read_len == 0) {
@@ -440,10 +457,11 @@ static void read_udp_packets_fd(ares_channel channel,
* tcp */
continue;
} else if (read_len < 0) {
- if (try_again(SOCKERRNO))
- continue;
+ if (try_again(SOCKERRNO)) {
+ break;
+ }
- handle_error(conn, now);
+ handle_conn_error(conn, ARES_TRUE);
return;
#ifdef HAVE_RECVFROM
} else if (!same_address(&from.sa, &conn->server->addr)) {
@@ -454,18 +472,18 @@ static void read_udp_packets_fd(ares_channel channel,
#endif
} else {
- process_answer(channel, buf, (int)read_len, conn, 0, now);
+ process_answer(channel, buf, (size_t)read_len, conn, ARES_FALSE, now);
}
- /* process_answer may invalidate "conn" and close the file descriptor, so
- * check to see if file descriptor is still valid before looping! */
- } while (read_len >= 0 &&
- ares__htable_asvp_get_direct(channel->connnode_by_socket, fd) != NULL);
-}
+ /* Try to read again only if *we* set up the socket, otherwise it may be
+ * a blocking socket and would cause recvfrom to hang. */
+ } while (read_len >= 0 && channel->sock_funcs == NULL);
+ ares__check_cleanup_conn(channel, conn);
+}
-static void read_packets(ares_channel channel, fd_set *read_fds,
- ares_socket_t read_fd, struct timeval *now)
+static void read_packets(ares_channel_t *channel, fd_set *read_fds,
+ ares_socket_t read_fd, struct timeval *now)
{
size_t i;
ares_socket_t *socketlist = NULL;
@@ -473,15 +491,17 @@ static void read_packets(ares_channel channel, fd_set *read_fds,
struct server_connection *conn = NULL;
ares__llist_node_t *node = NULL;
- if (!read_fds && (read_fd == ARES_SOCKET_BAD))
+ if (!read_fds && (read_fd == ARES_SOCKET_BAD)) {
/* no possible action */
return;
+ }
/* Single socket specified */
if (!read_fds) {
node = ares__htable_asvp_get_direct(channel->connnode_by_socket, read_fd);
- if (node == NULL)
+ if (node == NULL) {
return;
+ }
conn = ares__llist_node_val(node);
@@ -494,13 +514,15 @@ static void read_packets(ares_channel channel, fd_set *read_fds,
return;
}
- /* There is no good way to iterate across an fd_set, instead we must pull a list
- * of all known fds, and iterate across that checking against the fd_set. */
+ /* There is no good way to iterate across an fd_set, instead we must pull a
+ * list of all known fds, and iterate across that checking against the fd_set.
+ */
socketlist = channel_socket_list(channel, &num_sockets);
- for (i=0; i<num_sockets; i++) {
- if (!FD_ISSET(socketlist[i], read_fds))
+ for (i = 0; i < num_sockets; i++) {
+ if (!FD_ISSET(socketlist[i], read_fds)) {
continue;
+ }
/* If there's an error and we close this socket, then open
* another with the same fd to talk to another server, then we
@@ -509,10 +531,11 @@ static void read_packets(ares_channel channel, fd_set *read_fds,
* extra system calls and confusion. */
FD_CLR(socketlist[i], read_fds);
- node = ares__htable_asvp_get_direct(channel->connnode_by_socket,
- socketlist[i]);
- if (node == NULL)
+ node =
+ ares__htable_asvp_get_direct(channel->connnode_by_socket, socketlist[i]);
+ if (node == NULL) {
return;
+ }
conn = ares__llist_node_val(node);
@@ -526,18 +549,18 @@ static void read_packets(ares_channel channel, fd_set *read_fds,
ares_free(socketlist);
}
-
/* If any queries have timed out, note the timeout and move them on. */
-static void process_timeouts(ares_channel channel, struct timeval *now)
+static void process_timeouts(ares_channel_t *channel, struct timeval *now)
{
- ares__slist_node_t *node = ares__slist_node_first(channel->queries_by_timeout);
+ ares__slist_node_t *node =
+ ares__slist_node_first(channel->queries_by_timeout);
while (node != NULL) {
- struct query *query = ares__slist_node_val(node);
+ struct query *query = ares__slist_node_val(node);
/* Node might be removed, cache next */
- ares__slist_node_t *next = ares__slist_node_next(node);
- ares_socket_t fd;
-
- /* Since this is sorted, as soon as we hit a query that isn't timed out, break */
+ ares__slist_node_t *next = ares__slist_node_next(node);
+ struct server_connection *conn;
+ /* Since this is sorted, as soon as we hit a query that isn't timed out,
+ * break */
if (!ares__timedout(now, &query->timeout)) {
break;
}
@@ -545,54 +568,104 @@ static void process_timeouts(ares_channel channel, struct timeval *now)
query->error_status = ARES_ETIMEOUT;
query->timeouts++;
-
- fd = query->conn->fd;
- next_server(channel, query, now);
- /* A timeout is a special case where we need to possibly cleanup a
- * a connection */
- ares__check_cleanup_conn(channel, fd);
+ conn = query->conn;
+ server_increment_failures(conn->server);
+ ares__requeue_query(query, now);
+ ares__check_cleanup_conn(channel, conn);
node = next;
}
}
+static ares_status_t rewrite_without_edns(ares_dns_record_t *qdnsrec,
+ struct query *query)
+{
+ ares_status_t status;
+ size_t i;
+ ares_bool_t found_opt_rr = ARES_FALSE;
+ unsigned char *msg = NULL;
+ size_t msglen = 0;
+
+ /* Find and remove the OPT RR record */
+ for (i = 0; i < ares_dns_record_rr_cnt(qdnsrec, ARES_SECTION_ADDITIONAL);
+ i++) {
+ const ares_dns_rr_t *rr;
+ rr = ares_dns_record_rr_get(qdnsrec, ARES_SECTION_ADDITIONAL, i);
+ if (ares_dns_rr_get_type(rr) == ARES_REC_TYPE_OPT) {
+ ares_dns_record_rr_del(qdnsrec, ARES_SECTION_ADDITIONAL, i);
+ found_opt_rr = ARES_TRUE;
+ break;
+ }
+ }
+
+ if (!found_opt_rr) {
+ status = ARES_EFORMERR;
+ goto done;
+ }
-/* Handle an answer from a server. */
-static void process_answer(ares_channel channel, const unsigned char *abuf,
- int alen, struct server_connection *conn, int tcp,
- struct timeval *now)
+ /* Rewrite the DNS message */
+ status = ares_dns_write(qdnsrec, &msg, &msglen);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ ares_free(query->qbuf);
+ query->qbuf = msg;
+ query->qlen = msglen;
+
+done:
+ return status;
+}
+
+/* Handle an answer from a server. This must NEVER cleanup the
+ * server connection! Return something other than ARES_SUCCESS to cause
+ * the connection to be terminated after this call. */
+static ares_status_t process_answer(ares_channel_t *channel,
+ const unsigned char *abuf, size_t alen,
+ struct server_connection *conn,
+ ares_bool_t tcp, struct timeval *now)
{
- int tc, rcode, packetsz;
- unsigned short id;
- struct query *query;
+ struct query *query;
/* Cache these as once ares__send_query() gets called, it may end up
* invalidating the connection all-together */
- struct server_state *server = conn->server;
- ares_socket_t fd = conn->fd;
-
- /* If there's no room in the answer for a header, we can't do much
- * with it. */
- if (alen < HFIXEDSZ) {
- return;
+ struct server_state *server = conn->server;
+ ares_dns_record_t *rdnsrec = NULL;
+ ares_dns_record_t *qdnsrec = NULL;
+ ares_status_t status;
+ ares_bool_t is_cached = ARES_FALSE;
+
+ /* Parse the response */
+ status = ares_dns_parse(abuf, alen, 0, &rdnsrec);
+ if (status != ARES_SUCCESS) {
+ /* Malformations are never accepted */
+ status = ARES_EBADRESP;
+ goto cleanup;
}
- /* Grab the query ID, truncate bit, and response code from the packet. */
- id = DNS_HEADER_QID(abuf); /* Converts to host byte order */
- tc = DNS_HEADER_TC(abuf);
- rcode = DNS_HEADER_RCODE(abuf);
-
/* Find the query corresponding to this packet. The queries are
- * hashed/bucketed by query id, so this lookup should be quick.
+ * hashed/bucketed by query id, so this lookup should be quick.
*/
- query = ares__htable_stvp_get_direct(channel->queries_by_qid, id);
+ query = ares__htable_szvp_get_direct(channel->queries_by_qid,
+ ares_dns_record_get_id(rdnsrec));
if (!query) {
- return;
+ /* We may have stopped listening for this query, that's ok */
+ status = ARES_SUCCESS;
+ goto cleanup;
+ }
+
+ /* Parse the question we sent as we use it to compare */
+ status = ares_dns_parse(query->qbuf, query->qlen, 0, &qdnsrec);
+ if (status != ARES_SUCCESS) {
+ end_query(channel, query, status, NULL);
+ goto cleanup;
}
/* Both the query id and the questions must be the same. We will drop any
* replies that aren't for the same query as this is considered invalid. */
- if (!same_questions(query->qbuf, query->qlen, abuf, alen)) {
- return;
+ if (!same_questions(qdnsrec, rdnsrec)) {
+ /* Possible qid conflict due to delayed response, that's ok */
+ status = ARES_SUCCESS;
+ goto cleanup;
}
/* At this point we know we've received an answer for this query, so we should
@@ -602,189 +675,310 @@ static void process_answer(ares_channel channel, const unsigned char *abuf,
ares__llist_node_destroy(query->node_queries_to_conn);
query->node_queries_to_conn = NULL;
- packetsz = PACKETSZ;
- /* If we use EDNS and server answers with FORMERR without an OPT RR, the protocol
- * extension is not understood by the responder. We must retry the query
- * without EDNS enabled. */
- if (channel->flags & ARES_FLAG_EDNS)
- {
- packetsz = channel->ednspsz;
- if (rcode == FORMERR && has_opt_rr(abuf, alen) != 1)
- {
- int qlen = (query->tcplen - 2) - EDNSFIXEDSZ;
- channel->flags ^= ARES_FLAG_EDNS;
- query->tcplen -= EDNSFIXEDSZ;
- query->qlen -= EDNSFIXEDSZ;
- query->tcpbuf[0] = (unsigned char)((qlen >> 8) & 0xff);
- query->tcpbuf[1] = (unsigned char)(qlen & 0xff);
- DNS_HEADER_SET_ARCOUNT(query->tcpbuf + 2, 0);
- query->tcpbuf = ares_realloc(query->tcpbuf, query->tcplen);
- query->qbuf = query->tcpbuf + 2;
- ares__send_query(channel, query, now);
- ares__check_cleanup_conn(channel, fd);
- return;
- }
+ /* If we use EDNS and server answers with FORMERR without an OPT RR, the
+ * protocol extension is not understood by the responder. We must retry the
+ * query without EDNS enabled. */
+ if (ares_dns_record_get_rcode(rdnsrec) == ARES_RCODE_FORMERR &&
+ ares_dns_has_opt_rr(qdnsrec) && !ares_dns_has_opt_rr(rdnsrec)) {
+ status = rewrite_without_edns(qdnsrec, query);
+ if (status != ARES_SUCCESS) {
+ end_query(channel, query, status, NULL);
+ goto cleanup;
+ }
+
+ ares__send_query(query, now);
+ status = ARES_SUCCESS;
+ goto cleanup;
}
/* If we got a truncated UDP packet and are not ignoring truncation,
* don't accept the packet, and switch the query to TCP if we hadn't
* done so already.
*/
- if ((tc || alen > packetsz) && !tcp && !(channel->flags & ARES_FLAG_IGNTC))
- {
- if (!query->using_tcp)
- {
- query->using_tcp = 1;
- ares__send_query(channel, query, now);
- }
- ares__check_cleanup_conn(channel, fd);
- return;
- }
-
- /* Limit alen to PACKETSZ if we aren't using TCP (only relevant if we
- * are ignoring truncation.
- */
- if (alen > packetsz && !tcp)
- alen = packetsz;
+ if (ares_dns_record_get_flags(rdnsrec) & ARES_FLAG_TC && !tcp &&
+ !(channel->flags & ARES_FLAG_IGNTC)) {
+ query->using_tcp = ARES_TRUE;
+ ares__send_query(query, now);
+ status = ARES_SUCCESS; /* Switched to TCP is ok */
+ goto cleanup;
+ }
/* If we aren't passing through all error packets, discard packets
* with SERVFAIL, NOTIMP, or REFUSED response codes.
*/
- if (!(channel->flags & ARES_FLAG_NOCHECKRESP))
- {
- if (rcode == SERVFAIL || rcode == NOTIMP || rcode == REFUSED)
- {
- switch (rcode) {
- case SERVFAIL:
- query->error_status = ARES_ESERVFAIL;
- break;
- case NOTIMP:
- query->error_status = ARES_ENOTIMP;
- break;
- case REFUSED:
- query->error_status = ARES_EREFUSED;
- break;
- }
- skip_server(channel, query, server);
- if (query->server == (int)server->idx) /* Is this ever not true? */
- next_server(channel, query, now);
- ares__check_cleanup_conn(channel, fd);
- return;
- }
+ if (!(channel->flags & ARES_FLAG_NOCHECKRESP)) {
+ ares_dns_rcode_t rcode = ares_dns_record_get_rcode(rdnsrec);
+ if (rcode == ARES_RCODE_SERVFAIL || rcode == ARES_RCODE_NOTIMP ||
+ rcode == ARES_RCODE_REFUSED) {
+ switch (rcode) {
+ case ARES_RCODE_SERVFAIL:
+ query->error_status = ARES_ESERVFAIL;
+ break;
+ case ARES_RCODE_NOTIMP:
+ query->error_status = ARES_ENOTIMP;
+ break;
+ case ARES_RCODE_REFUSED:
+ query->error_status = ARES_EREFUSED;
+ break;
+ default:
+ break;
+ }
+
+ server_increment_failures(server);
+ ares__requeue_query(query, now);
+
+ /* Should any of these cause a connection termination?
+ * Maybe SERVER_FAILURE? */
+ status = ARES_SUCCESS;
+ goto cleanup;
}
+ }
- end_query(channel, query, ARES_SUCCESS, abuf, alen);
+ /* If cache insertion was successful, it took ownership. We ignore
+ * other cache insertion failures. */
+ if (ares_qcache_insert(channel, now, query, rdnsrec) == ARES_SUCCESS) {
+ is_cached = ARES_TRUE;
+ }
- ares__check_cleanup_conn(channel, fd);
-}
+ server_set_good(server);
+ end_query(channel, query, ARES_SUCCESS, rdnsrec);
+
+ status = ARES_SUCCESS;
+cleanup:
+ /* Don't cleanup the cached pointer to the dns response */
+ if (!is_cached) {
+ ares_dns_record_destroy(rdnsrec);
+ }
-static void handle_error(struct server_connection *conn,
- struct timeval *now)
+ ares_dns_record_destroy(qdnsrec);
+ return status;
+}
+
+static void handle_conn_error(struct server_connection *conn,
+ ares_bool_t critical_failure)
{
- ares_channel channel = conn->server->channel;
struct server_state *server = conn->server;
- ares__llist_t *list_copy;
- ares__llist_node_t *node;
-
- /* We steal the list from the connection then close the connection, then
- * iterate across the list to requeue any inflight queries with the broken
- * connection. Destroying the connection prior to requeuing ensures requests
- * won't go back to the broken connection */
- list_copy = conn->queries_to_conn;
- conn->queries_to_conn = NULL;
+
+ /* Increment failures first before requeue so it is unlikely to requeue
+ * to the same server */
+ if (critical_failure) {
+ server_increment_failures(server);
+ }
+
+ /* This will requeue any connections automatically */
ares__close_connection(conn);
+}
- while ((node = ares__llist_node_first(list_copy)) != NULL) {
- struct query *query = ares__llist_node_val(node);
+ares_status_t ares__requeue_query(struct query *query, struct timeval *now)
+{
+ ares_channel_t *channel = query->channel;
+ size_t max_tries = ares__slist_len(channel->servers) * channel->tries;
+
+ query->try_count++;
+
+ if (query->try_count < max_tries && !query->no_retries) {
+ return ares__send_query(query, now);
+ }
- assert(query->server == (int)server->idx);
- skip_server(channel, query, server);
- /* next_server will remove the current node from the list */
- next_server(channel, query, now);
+ /* If we are here, all attempts to perform query failed. */
+ if (query->error_status == ARES_SUCCESS) {
+ query->error_status = ARES_ETIMEOUT;
}
- ares__llist_destroy(list_copy);
+ end_query(channel, query, query->error_status, NULL);
+ return ARES_ETIMEOUT;
}
+/* Pick a random server from the list, we first get a random number in the
+ * range of the number of servers, then scan until we find that server in
+ * the list */
+static struct server_state *ares__random_server(ares_channel_t *channel)
+{
+ unsigned char c;
+ size_t cnt;
+ size_t idx;
+ ares__slist_node_t *node;
+ size_t num_servers = ares__slist_len(channel->servers);
+
+ /* Silence coverity, not possible */
+ if (num_servers == 0) {
+ return NULL;
+ }
+
+ ares__rand_bytes(channel->rand_state, &c, 1);
+
+ cnt = c;
+ idx = cnt % num_servers;
-static void skip_server(ares_channel channel, struct query *query,
- struct server_state *server)
+ cnt = 0;
+ for (node = ares__slist_node_first(channel->servers); node != NULL;
+ node = ares__slist_node_next(node)) {
+ if (cnt == idx) {
+ return ares__slist_node_val(node);
+ }
+
+ cnt++;
+ }
+
+ return NULL;
+}
+
+/* Pick a server from the list with failover behavior.
+ *
+ * We default to using the first server in the sorted list of servers. That is
+ * the server with the lowest number of consecutive failures and then the
+ * highest priority server (by idx) if there is a draw.
+ *
+ * However, if a server temporarily goes down and hits some failures, then that
+ * server will never be retried until all other servers hit the same number of
+ * failures. This may prevent the server from being retried for a long time.
+ *
+ * To resolve this, with some probability we select a failed server to retry
+ * instead.
+ */
+static struct server_state *ares__failover_server(ares_channel_t *channel)
{
- /* The given server gave us problems with this query, so if we have the
- * luxury of using other servers, then let's skip the potentially broken
- * server and just use the others. If we only have one server and we need to
- * retry then we should just go ahead and re-use that server, since it's our
- * only hope; perhaps we just got unlucky, and retrying will work (eg, the
- * server timed out our TCP connection just as we were sending another
- * request).
+ struct server_state *first_server = ares__slist_first_val(channel->servers);
+ struct server_state *last_server = ares__slist_last_val(channel->servers);
+ unsigned short r;
+
+ /* Defensive code against no servers being available on the channel. */
+ if (first_server == NULL) {
+ return NULL;
+ }
+
+ /* If no servers have failures, then prefer the first server in the list. */
+ if (last_server != NULL && last_server->consec_failures == 0) {
+ return first_server;
+ }
+
+ /* If we are not configured with a server retry chance then return the first
+ * server.
*/
- if (channel->nservers > 1)
- {
- query->server_info[server->idx].skip_server = 1;
+ if (channel->server_retry_chance == 0) {
+ return first_server;
+ }
+
+ /* Generate a random value to decide whether to retry a failed server. The
+ * probability to use is 1/channel->server_retry_chance, rounded up to a
+ * precision of 1/2^B where B is the number of bits in the random value.
+ * We use an unsigned short for the random value for increased precision.
+ */
+ ares__rand_bytes(channel->rand_state, (unsigned char *)&r, sizeof(r));
+ if (r % channel->server_retry_chance == 0) {
+ /* Select a suitable failed server to retry. */
+ struct timeval now = ares__tvnow();
+ ares__slist_node_t *node;
+ for (node = ares__slist_node_first(channel->servers); node != NULL;
+ node = ares__slist_node_next(node)) {
+ struct server_state *node_val = ares__slist_node_val(node);
+ if (node_val != NULL && node_val->consec_failures > 0 &&
+ ares__timedout(&now, &node_val->next_retry_time)) {
+ return node_val;
+ }
}
+ }
+
+ /* If we have not returned yet, then return the first server. */
+ return first_server;
}
-static int next_server(ares_channel channel, struct query *query,
- struct timeval *now)
+static ares_status_t ares__append_tcpbuf(struct server_state *server,
+ const struct query *query)
{
- int status;
- /* We need to try each server channel->tries times. We have channel->nservers
- * servers to try. In total, we need to do channel->nservers * channel->tries
- * attempts. Use query->try to remember how many times we already attempted
- * this query. Use modular arithmetic to find the next server to try.
- * A query can be requested be terminated at the next interval by setting
- * query->no_retries */
- while (++(query->try_count) < (channel->nservers * channel->tries) &&
- !query->no_retries) {
- struct server_state *server;
-
- /* Move on to the next server. */
- query->server = (query->server + 1) % channel->nservers;
- server = &channel->servers[query->server];
-
- /* We don't want to use this server if (1) we've decided to skip this
- * server because of earlier errors we encountered, or (2) we already
- * sent this query over this exact connection.
- */
- if (!query->server_info[query->server].skip_server &&
- !(query->using_tcp &&
- (query->server_info[query->server].tcp_connection_generation ==
- server->tcp_connection_generation))) {
- return ares__send_query(channel, query, now);
- }
+ ares_status_t status;
- /* You might think that with TCP we only need one try. However, even
- * when using TCP, servers can time-out our connection just as we're
- * sending a request, or close our connection because they die, or never
- * send us a reply because they get wedged or tickle a bug that drops
- * our request.
- */
+ status = ares__buf_append_be16(server->tcp_send, (unsigned short)query->qlen);
+ if (status != ARES_SUCCESS) {
+ return status;
}
+ return ares__buf_append(server->tcp_send, query->qbuf, query->qlen);
+}
- /* If we are here, all attempts to perform query failed. */
- status = query->error_status;
- end_query(channel, query, query->error_status, NULL, 0);
- return status;
+static size_t ares__calc_query_timeout(const struct query *query)
+{
+ const ares_channel_t *channel = query->channel;
+ size_t timeplus = channel->timeout;
+ size_t rounds;
+ size_t num_servers = ares__slist_len(channel->servers);
+
+ if (num_servers == 0) {
+ return 0;
+ }
+
+ /* For each trip through the entire server list, we want to double the
+ * retry from the last retry */
+ rounds = (query->try_count / num_servers);
+ if (rounds > 0) {
+ timeplus <<= rounds;
+ }
+
+ if (channel->maxtimeout && timeplus > channel->maxtimeout) {
+ timeplus = channel->maxtimeout;
+ }
+
+ /* Add some jitter to the retry timeout.
+ *
+ * Jitter is needed in situation when resolve requests are performed
+ * simultaneously from multiple hosts and DNS server throttle these requests.
+ * Adding randomness allows to avoid synchronisation of retries.
+ *
+ * Value of timeplus adjusted randomly to the range [0.5 * timeplus,
+ * timeplus].
+ */
+ if (rounds > 0) {
+ unsigned short r;
+ float delta_multiplier;
+
+ ares__rand_bytes(channel->rand_state, (unsigned char *)&r, sizeof(r));
+ delta_multiplier = ((float)r / USHRT_MAX) * 0.5f;
+ timeplus -= (size_t)((float)timeplus * delta_multiplier);
+ }
+
+ /* We want explicitly guarantee that timeplus is greater or equal to timeout
+ * specified in channel options. */
+ if (timeplus < channel->timeout) {
+ timeplus = channel->timeout;
+ }
+
+ return timeplus;
}
-int ares__send_query(ares_channel channel, struct query *query,
- struct timeval *now)
+ares_status_t ares__send_query(struct query *query, struct timeval *now)
{
- struct server_state *server;
+ ares_channel_t *channel = query->channel;
+ struct server_state *server;
struct server_connection *conn;
- int timeplus;
- int status;
+ size_t timeplus;
+ ares_status_t status;
+ ares_bool_t new_connection = ARES_FALSE;
+
+ query->conn = NULL;
+
+ /* Choose the server to send the query to */
+ if (channel->rotate) {
+ /* Pull random server */
+ server = ares__random_server(channel);
+ } else {
+ /* Pull server with failover behavior */
+ server = ares__failover_server(channel);
+ }
+
+ if (server == NULL) {
+ end_query(channel, query, ARES_ENOSERVER /* ? */, NULL);
+ return ARES_ENOSERVER;
+ }
- server = &channel->servers[query->server];
if (query->using_tcp) {
size_t prior_len = 0;
/* Make sure the TCP socket for this server is set up and queue
* a send request.
*/
if (server->tcp_conn == NULL) {
- int err = open_socket(channel, server, 1);
- switch (err) {
+ new_connection = ARES_TRUE;
+ status = ares__open_connection(channel, server, ARES_TRUE);
+ switch (status) {
/* Good result, continue on */
case ARES_SUCCESS:
break;
@@ -793,13 +987,14 @@ int ares__send_query(ares_channel channel, struct query *query,
* error codes */
case ARES_ECONNREFUSED:
case ARES_EBADFAMILY:
- skip_server(channel, query, server);
- return next_server(channel, query, now);
+ server_increment_failures(server);
+ query->error_status = status;
+ return ares__requeue_query(query, now);
/* Anything else is not retryable, likely ENOMEM */
default:
- end_query(channel, query, err, NULL, 0);
- return err;
+ end_query(channel, query, status, NULL);
+ return status;
}
}
@@ -807,18 +1002,22 @@ int ares__send_query(ares_channel channel, struct query *query,
prior_len = ares__buf_len(server->tcp_send);
- status = ares__buf_append(server->tcp_send, query->tcpbuf, query->tcplen);
+ status = ares__append_tcpbuf(server, query);
if (status != ARES_SUCCESS) {
- end_query(channel, query, status, NULL, 0);
- return ARES_ENOMEM;
+ end_query(channel, query, status, NULL);
+
+ /* Only safe to kill connection if it was new, otherwise it should be
+ * cleaned up by another process later */
+ if (new_connection) {
+ ares__close_connection(conn);
+ }
+ return status;
}
if (prior_len == 0) {
SOCK_STATE_CALLBACK(channel, conn->fd, 1, 1);
}
- query->server_info[query->server].tcp_connection_generation =
- server->tcp_connection_generation;
} else {
ares__llist_node_t *node = ares__llist_node_first(server->connections);
@@ -830,14 +1029,15 @@ int ares__send_query(ares_channel channel, struct query *query,
if (conn->is_tcp) {
node = NULL;
} else if (channel->udp_max_queries > 0 &&
- conn->total_queries >= (size_t)channel->udp_max_queries) {
+ conn->total_queries >= channel->udp_max_queries) {
node = NULL;
}
}
if (node == NULL) {
- int err = open_socket(channel, server, 0);
- switch (err) {
+ new_connection = ARES_TRUE;
+ status = ares__open_connection(channel, server, ARES_FALSE);
+ switch (status) {
/* Good result, continue on */
case ARES_SUCCESS:
break;
@@ -846,13 +1046,14 @@ int ares__send_query(ares_channel channel, struct query *query,
* error codes */
case ARES_ECONNREFUSED:
case ARES_EBADFAMILY:
- skip_server(channel, query, server);
- return next_server(channel, query, now);
+ server_increment_failures(server);
+ query->error_status = status;
+ return ares__requeue_query(query, now);
/* Anything else is not retryable, likely ENOMEM */
default:
- end_query(channel, query, err, NULL, 0);
- return err;
+ end_query(channel, query, status, NULL);
+ return status;
}
node = ares__llist_node_first(server->connections);
}
@@ -860,65 +1061,35 @@ int ares__send_query(ares_channel channel, struct query *query,
conn = ares__llist_node_val(node);
if (ares__socket_write(channel, conn->fd, query->qbuf, query->qlen) == -1) {
/* FIXME: Handle EAGAIN here since it likely can happen. */
- skip_server(channel, query, server);
- return next_server(channel, query, now);
- }
- }
-
- /* For each trip through the entire server list, double the channel's
- * assigned timeout, avoiding overflow. If channel->timeout is negative,
- * leave it as-is, even though that should be impossible here.
- */
- timeplus = channel->timeout;
- {
- /* How many times do we want to double it? Presume sane values here. */
- const int shift = query->try_count / channel->nservers;
-
- /* Is there enough room to shift timeplus left that many times?
- *
- * To find out, confirm that all of the bits we'll shift away are zero.
- * Stop considering a shift if we get to the point where we could shift
- * a 1 into the sign bit (i.e. when shift is within two of the bit
- * count).
- *
- * This has the side benefit of leaving negative numbers unchanged.
- */
- if(shift <= (int)(sizeof(int) * CHAR_BIT - 1)
- && (timeplus >> (sizeof(int) * CHAR_BIT - 1 - shift)) == 0)
- {
- timeplus <<= shift;
- }
- }
+ server_increment_failures(server);
+ status = ares__requeue_query(query, now);
- if (channel->maxtimeout != -1 && timeplus > channel->maxtimeout)
- timeplus = channel->maxtimeout;
+ /* Only safe to kill connection if it was new, otherwise it should be
+ * cleaned up by another process later */
+ if (new_connection) {
+ ares__close_connection(conn);
+ }
- if (channel->jitter != -1) {
- int r;
- #ifdef WIN32
- /* Windows does not have rand_r function, so we use regular rand().
- * It is thread-unsafe, but it is better than nothing.
- */
- r = rand();
- #else
- r = rand_r(&channel->jitter_rand_state);
- #endif
- long long delta = (long long)(r - (RAND_MAX >> 1)) * timeplus * channel->jitter;
- delta /= RAND_MAX;
- /* Recall that jitter is expressed in .001 */
- delta /= 1000;
- timeplus += delta;
+ return status;
+ }
}
+ timeplus = ares__calc_query_timeout(query);
/* Keep track of queries bucketed by timeout, so we can process
* timeout events quickly.
*/
ares__slist_node_destroy(query->node_queries_by_timeout);
query->timeout = *now;
timeadd(&query->timeout, timeplus);
- query->node_queries_by_timeout = ares__slist_insert(channel->queries_by_timeout, query);
+ query->node_queries_by_timeout =
+ ares__slist_insert(channel->queries_by_timeout, query);
if (!query->node_queries_by_timeout) {
- end_query(channel, query, ARES_ENOMEM, NULL, 0);
+ end_query(channel, query, ARES_ENOMEM, NULL);
+ /* Only safe to kill connection if it was new, otherwise it should be
+ * cleaned up by another process later */
+ if (new_connection) {
+ ares__close_connection(conn);
+ }
return ARES_ENOMEM;
}
@@ -927,497 +1098,96 @@ int ares__send_query(ares_channel channel, struct query *query,
ares__llist_node_destroy(query->node_queries_to_conn);
query->node_queries_to_conn =
ares__llist_insert_last(conn->queries_to_conn, query);
- query->conn = conn;
- conn->total_queries++;
- return ARES_SUCCESS;
-}
-
-/*
- * setsocknonblock sets the given socket to either blocking or non-blocking
- * mode based on the 'nonblock' boolean argument. This function is highly
- * portable.
- */
-static int setsocknonblock(ares_socket_t sockfd, /* operate on this */
- int nonblock /* TRUE or FALSE */)
-{
-#if defined(USE_BLOCKING_SOCKETS)
-
- return 0; /* returns success */
-#elif defined(HAVE_FCNTL_O_NONBLOCK)
-
- /* most recent unix versions */
- int flags;
- flags = fcntl(sockfd, F_GETFL, 0);
- if (FALSE != nonblock)
- return fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
- else
- return fcntl(sockfd, F_SETFL, flags & (~O_NONBLOCK)); /* LCOV_EXCL_LINE */
-
-#elif defined(HAVE_IOCTL_FIONBIO)
-
- /* older unix versions */
- int flags = nonblock ? 1 : 0;
- return ioctl(sockfd, FIONBIO, &flags);
-
-#elif defined(HAVE_IOCTLSOCKET_FIONBIO)
-
-#ifdef WATT32
- char flags = nonblock ? 1 : 0;
-#else
- /* Windows */
- unsigned long flags = nonblock ? 1UL : 0UL;
-#endif
- return ioctlsocket(sockfd, FIONBIO, &flags);
-
-#elif defined(HAVE_IOCTLSOCKET_CAMEL_FIONBIO)
-
- /* Amiga */
- long flags = nonblock ? 1L : 0L;
- return IoctlSocket(sockfd, FIONBIO, flags);
-
-#elif defined(HAVE_SETSOCKOPT_SO_NONBLOCK)
-
- /* BeOS */
- long b = nonblock ? 1L : 0L;
- return setsockopt(sockfd, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b));
-
-#else
-# error "no non-blocking method was found/used/set"
-#endif
-}
-
-#if defined(IPV6_V6ONLY) && defined(WIN32)
-/* It makes support for IPv4-mapped IPv6 addresses.
- * Linux kernel, NetBSD, FreeBSD and Darwin: default is off;
- * Windows Vista and later: default is on;
- * DragonFly BSD: acts like off, and dummy setting;
- * OpenBSD and earlier Windows: unsupported.
- * Linux: controlled by /proc/sys/net/ipv6/bindv6only.
- */
-static void set_ipv6_v6only(ares_socket_t sockfd, int on)
-{
- (void)setsockopt(sockfd, IPPROTO_IPV6, IPV6_V6ONLY, (void *)&on, sizeof(on));
-}
-#else
-#define set_ipv6_v6only(s,v)
-#endif
-
-static int configure_socket(ares_socket_t s, int family, ares_channel channel)
-{
- union {
- struct sockaddr sa;
- struct sockaddr_in sa4;
- struct sockaddr_in6 sa6;
- } local;
-
- /* do not set options for user-managed sockets */
- if (channel->sock_funcs && channel->sock_funcs->asocket)
- return 0;
-
- (void)setsocknonblock(s, TRUE);
-
-#if defined(FD_CLOEXEC) && !defined(MSDOS)
- /* Configure the socket fd as close-on-exec. */
- if (fcntl(s, F_SETFD, FD_CLOEXEC) == -1)
- return -1; /* LCOV_EXCL_LINE */
-#endif
-
- /* Set the socket's send and receive buffer sizes. */
- if ((channel->socket_send_buffer_size > 0) &&
- setsockopt(s, SOL_SOCKET, SO_SNDBUF,
- (void *)&channel->socket_send_buffer_size,
- sizeof(channel->socket_send_buffer_size)) == -1)
- return -1;
-
- if ((channel->socket_receive_buffer_size > 0) &&
- setsockopt(s, SOL_SOCKET, SO_RCVBUF,
- (void *)&channel->socket_receive_buffer_size,
- sizeof(channel->socket_receive_buffer_size)) == -1)
- return -1;
-
-#ifdef SO_BINDTODEVICE
- if (channel->local_dev_name[0]) {
- if (setsockopt(s, SOL_SOCKET, SO_BINDTODEVICE,
- channel->local_dev_name, sizeof(channel->local_dev_name))) {
- /* Only root can do this, and usually not fatal if it doesn't work, so */
- /* just continue on. */
- }
- }
-#endif
-
- if (family == AF_INET) {
- if (channel->local_ip4) {
- memset(&local.sa4, 0, sizeof(local.sa4));
- local.sa4.sin_family = AF_INET;
- local.sa4.sin_addr.s_addr = htonl(channel->local_ip4);
- if (bind(s, &local.sa, sizeof(local.sa4)) < 0)
- return -1;
+ if (query->node_queries_to_conn == NULL) {
+ end_query(channel, query, ARES_ENOMEM, NULL);
+ /* Only safe to kill connection if it was new, otherwise it should be
+ * cleaned up by another process later */
+ if (new_connection) {
+ ares__close_connection(conn);
}
- }
- else if (family == AF_INET6) {
- if (memcmp(channel->local_ip6, &ares_in6addr_any,
- sizeof(channel->local_ip6)) != 0) {
- memset(&local.sa6, 0, sizeof(local.sa6));
- local.sa6.sin6_family = AF_INET6;
- memcpy(&local.sa6.sin6_addr, channel->local_ip6,
- sizeof(channel->local_ip6));
- if (bind(s, &local.sa, sizeof(local.sa6)) < 0)
- return -1;
- }
- set_ipv6_v6only(s, 0);
+ return ARES_ENOMEM;
}
- return 0;
+ query->conn = conn;
+ conn->total_queries++;
+ return ARES_SUCCESS;
}
-static int open_socket(ares_channel channel, struct server_state *server,
- int is_tcp)
+static ares_bool_t same_questions(const ares_dns_record_t *qrec,
+ const ares_dns_record_t *arec)
{
- ares_socket_t s;
- int opt;
- ares_socklen_t salen;
- union {
- struct sockaddr_in sa4;
- struct sockaddr_in6 sa6;
- } saddr;
- struct sockaddr *sa;
- unsigned short port;
- struct server_connection *conn;
- ares__llist_node_t *node;
-
- if (is_tcp) {
- port = aresx_sitous(server->addr.tcp_port?
- server->addr.tcp_port:channel->tcp_port);
- } else {
- port = aresx_sitous(server->addr.udp_port?
- server->addr.udp_port:channel->udp_port);
- }
-
- switch (server->addr.family) {
- case AF_INET:
- sa = (void *)&saddr.sa4;
- salen = sizeof(saddr.sa4);
- memset(sa, 0, salen);
- saddr.sa4.sin_family = AF_INET;
- saddr.sa4.sin_port = port;
- memcpy(&saddr.sa4.sin_addr, &server->addr.addrV4,
- sizeof(server->addr.addrV4));
- break;
- case AF_INET6:
- sa = (void *)&saddr.sa6;
- salen = sizeof(saddr.sa6);
- memset(sa, 0, salen);
- saddr.sa6.sin6_family = AF_INET6;
- saddr.sa6.sin6_port = port;
- memcpy(&saddr.sa6.sin6_addr, &server->addr.addrV6,
- sizeof(server->addr.addrV6));
- break;
- default:
- return ARES_EBADFAMILY; /* LCOV_EXCL_LINE */
- }
+ size_t i;
+ ares_bool_t rv = ARES_FALSE;
- /* Acquire a socket. */
- s = ares__open_socket(channel, server->addr.family,
- is_tcp?SOCK_STREAM:SOCK_DGRAM, 0);
- if (s == ARES_SOCKET_BAD)
- return ARES_ECONNREFUSED;
- /* Configure it. */
- if (configure_socket(s, server->addr.family, channel) < 0) {
- ares__close_socket(channel, s);
- return ARES_ECONNREFUSED;
+ if (ares_dns_record_query_cnt(qrec) != ares_dns_record_query_cnt(arec)) {
+ goto done;
}
-#ifdef TCP_NODELAY
- if (is_tcp) {
- /*
- * Disable the Nagle algorithm (only relevant for TCP sockets, and thus not
- * in configure_socket). In general, in DNS lookups we're pretty much
- * interested in firing off a single request and then waiting for a reply,
- * so batching isn't very interesting.
- */
- opt = 1;
- if (!channel->sock_funcs || !channel->sock_funcs->asocket) {
- if (setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (void *)&opt, sizeof(opt))
- == -1) {
- ares__close_socket(channel, s);
- return ARES_ECONNREFUSED;
- }
+ for (i = 0; i < ares_dns_record_query_cnt(qrec); i++) {
+ const char *qname = NULL;
+ const char *aname = NULL;
+ ares_dns_rec_type_t qtype;
+ ares_dns_rec_type_t atype;
+ ares_dns_class_t qclass;
+ ares_dns_class_t aclass;
+
+ if (ares_dns_record_query_get(qrec, i, &qname, &qtype, &qclass) !=
+ ARES_SUCCESS ||
+ qname == NULL) {
+ goto done;
}
- }
-#endif
- if (channel->sock_config_cb) {
- int err = channel->sock_config_cb(s, SOCK_STREAM,
- channel->sock_config_cb_data);
- if (err < 0) {
- ares__close_socket(channel, s);
- return ARES_ECONNREFUSED;
+ if (ares_dns_record_query_get(arec, i, &aname, &atype, &aclass) !=
+ ARES_SUCCESS ||
+ aname == NULL) {
+ goto done;
}
- }
-
- /* Connect to the server. */
- if (ares__connect_socket(channel, s, sa, salen) == -1) {
- int err = SOCKERRNO;
-
- if (err != EINPROGRESS && err != EWOULDBLOCK) {
- ares__close_socket(channel, s);
- return ARES_ECONNREFUSED;
+ if (strcasecmp(qname, aname) != 0 || qtype != atype || qclass != aclass) {
+ goto done;
}
}
- if (channel->sock_create_cb) {
- int err = channel->sock_create_cb(s, SOCK_STREAM,
- channel->sock_create_cb_data);
- if (err < 0) {
- ares__close_socket(channel, s);
- return ARES_ECONNREFUSED;
- }
- }
+ rv = ARES_TRUE;
- conn = ares_malloc(sizeof(*conn));
- if (conn == NULL) {
- ares__close_socket(channel, s);
- return ARES_ENOMEM;
- }
- memset(conn, 0, sizeof(*conn));
- conn->fd = s;
- conn->server = server;
- conn->queries_to_conn = ares__llist_create(NULL);
- conn->is_tcp = is_tcp;
- if (conn->queries_to_conn == NULL) {
- ares__close_socket(channel, s);
- ares_free(conn);
- return ARES_ENOMEM;
- }
-
- /* TCP connections are thrown to the end as we don't spawn multiple TCP
- * connections. UDP connections are put on front where the newest connection
- * can be quickly pulled */
- if (is_tcp) {
- node = ares__llist_insert_last(server->connections, conn);
- } else {
- node = ares__llist_insert_first(server->connections, conn);
- }
- if (node == NULL) {
- ares__close_socket(channel, s);
- ares__llist_destroy(conn->queries_to_conn);
- ares_free(conn);
- return ARES_ENOMEM;
- }
-
- /* Register globally to quickly map event on file descriptor to connection
- * node object */
- if (!ares__htable_asvp_insert(channel->connnode_by_socket, s, node)) {
- ares__close_socket(channel, s);
- ares__llist_destroy(conn->queries_to_conn);
- ares__llist_node_claim(node);
- ares_free(conn);
- return ARES_ENOMEM;
- }
-
- SOCK_STATE_CALLBACK(channel, s, 1, 0);
-
- if (is_tcp) {
- server->tcp_connection_generation = ++channel->tcp_connection_generation;
- server->tcp_conn = conn;
- }
-
- return ARES_SUCCESS;
+done:
+ return rv;
}
-
-static int same_questions(const unsigned char *qbuf, int qlen,
- const unsigned char *abuf, int alen)
+static ares_bool_t same_address(const struct sockaddr *sa,
+ const struct ares_addr *aa)
{
- struct {
- const unsigned char *p;
- int qdcount;
- char *name;
- long namelen;
- int type;
- int dnsclass;
- } q, a;
- int i, j;
-
- if (qlen < HFIXEDSZ || alen < HFIXEDSZ)
- return 0;
-
- /* Extract qdcount from the request and reply buffers and compare them. */
- q.qdcount = DNS_HEADER_QDCOUNT(qbuf);
- a.qdcount = DNS_HEADER_QDCOUNT(abuf);
- if (q.qdcount != a.qdcount)
- return 0;
-
- /* For each question in qbuf, find it in abuf. */
- q.p = qbuf + HFIXEDSZ;
- for (i = 0; i < q.qdcount; i++)
- {
- /* Decode the question in the query. */
- if (ares_expand_name(q.p, qbuf, qlen, &q.name, &q.namelen)
- != ARES_SUCCESS)
- return 0;
- q.p += q.namelen;
- if (q.p + QFIXEDSZ > qbuf + qlen)
- {
- ares_free(q.name);
- return 0;
+ const void *addr1;
+ const void *addr2;
+
+ if (sa->sa_family == aa->family) {
+ switch (aa->family) {
+ case AF_INET:
+ addr1 = &aa->addr.addr4;
+ addr2 = &(CARES_INADDR_CAST(struct sockaddr_in *, sa))->sin_addr;
+ if (memcmp(addr1, addr2, sizeof(aa->addr.addr4)) == 0) {
+ return ARES_TRUE; /* match */
}
- q.type = DNS_QUESTION_TYPE(q.p);
- q.dnsclass = DNS_QUESTION_CLASS(q.p);
- q.p += QFIXEDSZ;
-
- /* Search for this question in the answer. */
- a.p = abuf + HFIXEDSZ;
- for (j = 0; j < a.qdcount; j++)
- {
- /* Decode the question in the answer. */
- if (ares_expand_name(a.p, abuf, alen, &a.name, &a.namelen)
- != ARES_SUCCESS)
- {
- ares_free(q.name);
- return 0;
- }
- a.p += a.namelen;
- if (a.p + QFIXEDSZ > abuf + alen)
- {
- ares_free(q.name);
- ares_free(a.name);
- return 0;
- }
- a.type = DNS_QUESTION_TYPE(a.p);
- a.dnsclass = DNS_QUESTION_CLASS(a.p);
- a.p += QFIXEDSZ;
-
- /* Compare the decoded questions. */
- if (strcasecmp(q.name, a.name) == 0 && q.type == a.type
- && q.dnsclass == a.dnsclass)
- {
- ares_free(a.name);
- break;
- }
- ares_free(a.name);
+ break;
+ case AF_INET6:
+ addr1 = &aa->addr.addr6;
+ addr2 = &(CARES_INADDR_CAST(struct sockaddr_in6 *, sa))->sin6_addr;
+ if (memcmp(addr1, addr2, sizeof(aa->addr.addr6)) == 0) {
+ return ARES_TRUE; /* match */
}
-
- ares_free(q.name);
- if (j == a.qdcount)
- return 0;
+ break;
+ default:
+ break; /* LCOV_EXCL_LINE */
}
- return 1;
-}
-
-static int same_address(struct sockaddr *sa, struct ares_addr *aa)
-{
- void *addr1;
- void *addr2;
-
- if (sa->sa_family == aa->family)
- {
- switch (aa->family)
- {
- case AF_INET:
- addr1 = &aa->addrV4;
- addr2 = &(CARES_INADDR_CAST(struct sockaddr_in *, sa))->sin_addr;
- if (memcmp(addr1, addr2, sizeof(aa->addrV4)) == 0)
- return 1; /* match */
- break;
- case AF_INET6:
- addr1 = &aa->addrV6;
- addr2 = &(CARES_INADDR_CAST(struct sockaddr_in6 *, sa))->sin6_addr;
- if (memcmp(addr1, addr2, sizeof(aa->addrV6)) == 0)
- return 1; /* match */
- break;
- default:
- break; /* LCOV_EXCL_LINE */
- }
- }
- return 0; /* different */
-}
-
-/* search for an OPT RR in the response */
-static int has_opt_rr(const unsigned char *abuf, int alen)
-{
- unsigned int qdcount, ancount, nscount, arcount, i;
- const unsigned char *aptr;
- int status;
-
- if (alen < HFIXEDSZ)
- return -1;
-
- /* Parse the answer header. */
- qdcount = DNS_HEADER_QDCOUNT(abuf);
- ancount = DNS_HEADER_ANCOUNT(abuf);
- nscount = DNS_HEADER_NSCOUNT(abuf);
- arcount = DNS_HEADER_ARCOUNT(abuf);
-
- aptr = abuf + HFIXEDSZ;
-
- /* skip the questions */
- for (i = 0; i < qdcount; i++)
- {
- char* name;
- long len;
- status = ares_expand_name(aptr, abuf, alen, &name, &len);
- if (status != ARES_SUCCESS)
- return -1;
- ares_free_string(name);
- if (aptr + len + QFIXEDSZ > abuf + alen)
- return -1;
- aptr += len + QFIXEDSZ;
- }
-
- /* skip the ancount and nscount */
- for (i = 0; i < ancount + nscount; i++)
- {
- char* name;
- long len;
- int dlen;
- status = ares_expand_name(aptr, abuf, alen, &name, &len);
- if (status != ARES_SUCCESS)
- return -1;
- ares_free_string(name);
- if (aptr + len + RRFIXEDSZ > abuf + alen)
- return -1;
- aptr += len;
- dlen = DNS_RR_LEN(aptr);
- aptr += RRFIXEDSZ;
- if (aptr + dlen > abuf + alen)
- return -1;
- aptr += dlen;
- }
-
- /* search for rr type (41) - opt */
- for (i = 0; i < arcount; i++)
- {
- char* name;
- long len;
- int dlen;
- status = ares_expand_name(aptr, abuf, alen, &name, &len);
- if (status != ARES_SUCCESS)
- return -1;
- ares_free_string(name);
- if (aptr + len + RRFIXEDSZ > abuf + alen)
- return -1;
- aptr += len;
-
- if (DNS_RR_TYPE(aptr) == T_OPT)
- return 1;
-
- dlen = DNS_RR_LEN(aptr);
- aptr += RRFIXEDSZ;
- if (aptr + dlen > abuf + alen)
- return -1;
- aptr += dlen;
- }
-
- return 0;
+ }
+ return ARES_FALSE; /* different */
}
static void ares_detach_query(struct query *query)
{
/* Remove the query from all the lists in which it is linked */
- ares__htable_stvp_remove(query->channel->queries_by_qid, query->qid);
+ ares__htable_szvp_remove(query->channel->queries_by_qid, query->qid);
ares__slist_node_destroy(query->node_queries_by_timeout);
ares__llist_node_destroy(query->node_queries_to_conn);
ares__llist_node_destroy(query->node_all_queries);
@@ -1426,20 +1196,19 @@ static void ares_detach_query(struct query *query)
query->node_all_queries = NULL;
}
-static void end_query(ares_channel channel, struct query *query, int status,
- const unsigned char *abuf, int alen)
+static void end_query(ares_channel_t *channel, struct query *query,
+ ares_status_t status, const ares_dns_record_t *dnsrec)
{
- (void)channel;
-
- ares_detach_query(query);
-
/* Invoke the callback. */
- query->callback(query->arg, status, query->timeouts,
- /* due to prior design flaws, abuf isn't meant to be modified,
- * but bad prototypes, ugh. Lets cast off constfor compat. */
- (unsigned char *)((void *)((size_t)abuf)),
- alen);
+ query->callback(query->arg, status, query->timeouts, dnsrec);
ares__free_query(query);
+
+ /* Check and notify if no other queries are enqueued on the channel. This
+ * must come after the callback and freeing the query for 2 reasons.
+ * 1) The callback itself may enqueue a new query
+ * 2) Technically the current query isn't detached until it is free()'d.
+ */
+ ares_queue_notify_empty(channel);
}
void ares__free_query(struct query *query)
@@ -1447,66 +1216,9 @@ void ares__free_query(struct query *query)
ares_detach_query(query);
/* Zero out some important stuff, to help catch bugs */
query->callback = NULL;
- query->arg = NULL;
+ query->arg = NULL;
/* Deallocate the memory associated with the query */
- ares_free(query->tcpbuf);
- ares_free(query->server_info);
- ares_free(query);
-}
-
-ares_socket_t ares__open_socket(ares_channel channel,
- int af, int type, int protocol)
-{
- if (channel->sock_funcs && channel->sock_funcs->asocket) {
- return channel->sock_funcs->asocket(af,
- type,
- protocol,
- channel->sock_func_cb_data);
- }
-
- return socket(af, type, protocol);
-}
-
-int ares__connect_socket(ares_channel channel,
- ares_socket_t sockfd,
- const struct sockaddr *addr,
- ares_socklen_t addrlen)
-{
- if (channel->sock_funcs && channel->sock_funcs->aconnect) {
- return channel->sock_funcs->aconnect(sockfd,
- addr,
- addrlen,
- channel->sock_func_cb_data);
- }
-
- return connect(sockfd, addr, addrlen);
-}
+ ares_free(query->qbuf);
-void ares__close_socket(ares_channel channel, ares_socket_t s)
-{
- if (channel->sock_funcs && channel->sock_funcs->aclose) {
- channel->sock_funcs->aclose(s, channel->sock_func_cb_data);
- } else {
- sclose(s);
- }
-}
-
-#ifndef HAVE_WRITEV
-/* Structure for scatter/gather I/O. */
-struct iovec
-{
- void *iov_base; /* Pointer to data. */
- size_t iov_len; /* Length of data. */
-};
-#endif
-
-static ares_ssize_t ares__socket_write(ares_channel channel, ares_socket_t s, const void * data, size_t len)
-{
- if (channel->sock_funcs && channel->sock_funcs->asendv) {
- struct iovec vec;
- vec.iov_base = (void*)data;
- vec.iov_len = len;
- return channel->sock_funcs->asendv(s, &vec, 1, channel->sock_func_cb_data);
- }
- return swrite(s, data, len);
+ ares_free(query);
}
diff --git a/contrib/libs/c-ares/src/lib/ares_qcache.c b/contrib/libs/c-ares/src/lib/ares_qcache.c
new file mode 100644
index 0000000000..2af1125a0d
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares_qcache.c
@@ -0,0 +1,444 @@
+/* MIT License
+ *
+ * Copyright (c) 2023 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#include "ares_setup.h"
+#include "ares.h"
+#include "ares_private.h"
+
+struct ares__qcache {
+ ares__htable_strvp_t *cache;
+ ares__slist_t *expire;
+ unsigned int max_ttl;
+};
+
+typedef struct {
+ char *key;
+ ares_dns_record_t *dnsrec;
+ time_t expire_ts;
+ time_t insert_ts;
+} ares__qcache_entry_t;
+
+static char *ares__qcache_calc_key(const ares_dns_record_t *dnsrec)
+{
+ ares__buf_t *buf = ares__buf_create();
+ size_t i;
+ ares_status_t status;
+ ares_dns_flags_t flags;
+
+ if (dnsrec == NULL || buf == NULL) {
+ return NULL;
+ }
+
+ /* Format is OPCODE|FLAGS[|QTYPE1|QCLASS1|QNAME1]... */
+
+ status = ares__buf_append_str(
+ buf, ares_dns_opcode_tostr(ares_dns_record_get_opcode(dnsrec)));
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ status = ares__buf_append_byte(buf, '|');
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ flags = ares_dns_record_get_flags(dnsrec);
+ /* Only care about RD and CD */
+ if (flags & ARES_FLAG_RD) {
+ status = ares__buf_append_str(buf, "rd");
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+ }
+ if (flags & ARES_FLAG_CD) {
+ status = ares__buf_append_str(buf, "cd");
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+ }
+
+ for (i = 0; i < ares_dns_record_query_cnt(dnsrec); i++) {
+ const char *name;
+ size_t name_len;
+ ares_dns_rec_type_t qtype;
+ ares_dns_class_t qclass;
+
+ status = ares_dns_record_query_get(dnsrec, i, &name, &qtype, &qclass);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ status = ares__buf_append_byte(buf, '|');
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ status = ares__buf_append_str(buf, ares_dns_rec_type_tostr(qtype));
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ status = ares__buf_append_byte(buf, '|');
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ status = ares__buf_append_str(buf, ares_dns_class_tostr(qclass));
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ status = ares__buf_append_byte(buf, '|');
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ /* On queries, a '.' may be appended to the name to indicate an explicit
+ * name lookup without performing a search. Strip this since its not part
+ * of a cached response. */
+ name_len = ares_strlen(name);
+ if (name_len && name[name_len - 1] == '.') {
+ name_len--;
+ }
+
+ status = ares__buf_append(buf, (const unsigned char *)name, name_len);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+ }
+
+ return ares__buf_finish_str(buf, NULL);
+
+fail:
+ ares__buf_destroy(buf);
+ return NULL;
+}
+
+static void ares__qcache_expire(ares__qcache_t *cache,
+ const struct timeval *now)
+{
+ ares__slist_node_t *node;
+
+ if (cache == NULL) {
+ return;
+ }
+
+ while ((node = ares__slist_node_first(cache->expire)) != NULL) {
+ const ares__qcache_entry_t *entry = ares__slist_node_val(node);
+ if (entry->expire_ts > now->tv_sec) {
+ break;
+ }
+
+ ares__htable_strvp_remove(cache->cache, entry->key);
+ ares__slist_node_destroy(node);
+ }
+}
+
+void ares__qcache_flush(ares__qcache_t *cache)
+{
+ struct timeval now;
+ memset(&now, 0, sizeof(now));
+ ares__qcache_expire(cache, &now);
+}
+
+void ares__qcache_destroy(ares__qcache_t *cache)
+{
+ if (cache == NULL) {
+ return;
+ }
+
+ ares__htable_strvp_destroy(cache->cache);
+ ares__slist_destroy(cache->expire);
+ ares_free(cache);
+}
+
+static int ares__qcache_entry_sort_cb(const void *arg1, const void *arg2)
+{
+ const ares__qcache_entry_t *entry1 = arg1;
+ const ares__qcache_entry_t *entry2 = arg2;
+
+ if (entry1->expire_ts > entry2->expire_ts) {
+ return 1;
+ }
+
+ if (entry1->expire_ts < entry2->expire_ts) {
+ return -1;
+ }
+
+ return 0;
+}
+
+static void ares__qcache_entry_destroy_cb(void *arg)
+{
+ ares__qcache_entry_t *entry = arg;
+ if (entry == NULL) {
+ return;
+ }
+
+ ares_free(entry->key);
+ ares_dns_record_destroy(entry->dnsrec);
+ ares_free(entry);
+}
+
+ares_status_t ares__qcache_create(ares_rand_state *rand_state,
+ unsigned int max_ttl,
+ ares__qcache_t **cache_out)
+{
+ ares_status_t status = ARES_SUCCESS;
+ ares__qcache_t *cache;
+
+ cache = ares_malloc_zero(sizeof(*cache));
+ if (cache == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ cache->cache = ares__htable_strvp_create(NULL);
+ if (cache->cache == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ cache->expire = ares__slist_create(rand_state, ares__qcache_entry_sort_cb,
+ ares__qcache_entry_destroy_cb);
+ if (cache->expire == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ cache->max_ttl = max_ttl;
+
+done:
+ if (status != ARES_SUCCESS) {
+ *cache_out = NULL;
+ ares__qcache_destroy(cache);
+ return status;
+ }
+
+ *cache_out = cache;
+ return status;
+}
+
+static unsigned int ares__qcache_calc_minttl(ares_dns_record_t *dnsrec)
+{
+ unsigned int minttl = 0xFFFFFFFF;
+ size_t sect;
+
+ for (sect = ARES_SECTION_ANSWER; sect <= ARES_SECTION_ADDITIONAL; sect++) {
+ size_t i;
+ for (i = 0; i < ares_dns_record_rr_cnt(dnsrec, (ares_dns_section_t)sect);
+ i++) {
+ const ares_dns_rr_t *rr =
+ ares_dns_record_rr_get(dnsrec, (ares_dns_section_t)sect, i);
+ ares_dns_rec_type_t type = ares_dns_rr_get_type(rr);
+ unsigned int ttl = ares_dns_rr_get_ttl(rr);
+ if (type == ARES_REC_TYPE_OPT || type == ARES_REC_TYPE_SOA) {
+ continue;
+ }
+
+ if (ttl < minttl) {
+ minttl = ttl;
+ }
+ }
+ }
+
+ return minttl;
+}
+
+static unsigned int ares__qcache_soa_minimum(ares_dns_record_t *dnsrec)
+{
+ size_t i;
+
+ /* RFC 2308 Section 5 says its the minimum of MINIMUM and the TTL of the
+ * record. */
+ for (i = 0; i < ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_AUTHORITY); i++) {
+ const ares_dns_rr_t *rr =
+ ares_dns_record_rr_get(dnsrec, ARES_SECTION_AUTHORITY, i);
+ ares_dns_rec_type_t type = ares_dns_rr_get_type(rr);
+ unsigned int ttl;
+ unsigned int minimum;
+
+ if (type != ARES_REC_TYPE_SOA) {
+ continue;
+ }
+
+ minimum = ares_dns_rr_get_u32(rr, ARES_RR_SOA_MINIMUM);
+ ttl = ares_dns_rr_get_ttl(rr);
+
+ if (ttl > minimum) {
+ return minimum;
+ }
+ return ttl;
+ }
+
+ return 0;
+}
+
+static char *ares__qcache_calc_key_frombuf(const unsigned char *qbuf,
+ size_t qlen)
+{
+ ares_status_t status;
+ ares_dns_record_t *dnsrec = NULL;
+ char *key = NULL;
+
+ status = ares_dns_parse(qbuf, qlen, 0, &dnsrec);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ key = ares__qcache_calc_key(dnsrec);
+
+done:
+ ares_dns_record_destroy(dnsrec);
+ return key;
+}
+
+/* On success, takes ownership of dnsrec */
+static ares_status_t ares__qcache_insert(ares__qcache_t *qcache,
+ ares_dns_record_t *dnsrec,
+ const unsigned char *qbuf, size_t qlen,
+ const struct timeval *now)
+{
+ ares__qcache_entry_t *entry;
+ unsigned int ttl;
+ ares_dns_rcode_t rcode = ares_dns_record_get_rcode(dnsrec);
+ ares_dns_flags_t flags = ares_dns_record_get_flags(dnsrec);
+
+ if (qcache == NULL || dnsrec == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ /* Only save NOERROR or NXDOMAIN */
+ if (rcode != ARES_RCODE_NOERROR && rcode != ARES_RCODE_NXDOMAIN) {
+ return ARES_ENOTIMP;
+ }
+
+ /* Don't save truncated queries */
+ if (flags & ARES_FLAG_TC) {
+ return ARES_ENOTIMP;
+ }
+
+ /* Look at SOA for NXDOMAIN for minimum */
+ if (rcode == ARES_RCODE_NXDOMAIN) {
+ ttl = ares__qcache_soa_minimum(dnsrec);
+ } else {
+ ttl = ares__qcache_calc_minttl(dnsrec);
+ }
+
+ /* Don't cache something that is already expired */
+ if (ttl == 0) {
+ return ARES_EREFUSED;
+ }
+
+ if (ttl > qcache->max_ttl) {
+ ttl = qcache->max_ttl;
+ }
+
+ entry = ares_malloc_zero(sizeof(*entry));
+ if (entry == NULL) {
+ goto fail;
+ }
+
+ entry->dnsrec = dnsrec;
+ entry->expire_ts = now->tv_sec + (time_t)ttl;
+ entry->insert_ts = now->tv_sec;
+
+ /* We can't guarantee the server responded with the same flags as the
+ * request had, so we have to re-parse the request in order to generate the
+ * key for caching, but we'll only do this once we know for sure we really
+ * want to cache it */
+ entry->key = ares__qcache_calc_key_frombuf(qbuf, qlen);
+ if (entry->key == NULL) {
+ goto fail;
+ }
+
+ if (!ares__htable_strvp_insert(qcache->cache, entry->key, entry)) {
+ goto fail;
+ }
+
+ if (ares__slist_insert(qcache->expire, entry) == NULL) {
+ goto fail;
+ }
+
+ return ARES_SUCCESS;
+
+fail:
+ if (entry != NULL && entry->key != NULL) {
+ ares__htable_strvp_remove(qcache->cache, entry->key);
+ ares_free(entry->key);
+ ares_free(entry);
+ }
+ return ARES_ENOMEM;
+}
+
+ares_status_t ares_qcache_fetch(ares_channel_t *channel,
+ const struct timeval *now,
+ const ares_dns_record_t *dnsrec,
+ const ares_dns_record_t **dnsrec_resp)
+{
+ char *key = NULL;
+ ares__qcache_entry_t *entry;
+ ares_status_t status = ARES_SUCCESS;
+
+ if (channel == NULL || dnsrec == NULL || dnsrec_resp == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ if (channel->qcache == NULL) {
+ return ARES_ENOTFOUND;
+ }
+
+ ares__qcache_expire(channel->qcache, now);
+
+ key = ares__qcache_calc_key(dnsrec);
+ if (key == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ entry = ares__htable_strvp_get_direct(channel->qcache->cache, key);
+ if (entry == NULL) {
+ status = ARES_ENOTFOUND;
+ goto done;
+ }
+
+ ares_dns_record_write_ttl_decrement(
+ entry->dnsrec, (unsigned int)(now->tv_sec - entry->insert_ts));
+
+ *dnsrec_resp = entry->dnsrec;
+
+done:
+ ares_free(key);
+ return status;
+}
+
+ares_status_t ares_qcache_insert(ares_channel_t *channel,
+ const struct timeval *now,
+ const struct query *query,
+ ares_dns_record_t *dnsrec)
+{
+ return ares__qcache_insert(channel->qcache, dnsrec, query->qbuf, query->qlen,
+ now);
+}
diff --git a/contrib/libs/c-ares/src/lib/ares_query.c b/contrib/libs/c-ares/src/lib/ares_query.c
index 04521d1c85..0eea80e7fc 100644
--- a/contrib/libs/c-ares/src/lib/ares_query.c
+++ b/contrib/libs/c-ares/src/lib/ares_query.c
@@ -37,115 +37,116 @@
#include "ares_dns.h"
#include "ares_private.h"
-struct qquery {
- ares_callback callback;
- void *arg;
-};
-
-static void qcallback(void *arg, int status, int timeouts, unsigned char *abuf, int alen);
-
-
-/* a unique query id is generated using an rc4 key. Since the id may already
- be used by a running query (as infrequent as it may be), a lookup is
- performed per id generation. In practice this search should happen only
- once per newly generated id
-*/
-static unsigned short generate_unique_id(ares_channel channel)
+typedef struct {
+ ares_callback_dnsrec callback;
+ void *arg;
+} ares_query_dnsrec_arg_t;
+
+static void ares_query_dnsrec_cb(void *arg, ares_status_t status,
+ size_t timeouts,
+ const ares_dns_record_t *dnsrec)
{
- unsigned short id;
-
- do {
- id = ares__generate_new_id(channel->rand_state);
- } while (ares__htable_stvp_get(channel->queries_by_qid, id, NULL));
-
- return (unsigned short)id;
+ ares_query_dnsrec_arg_t *qquery = arg;
+
+ if (status != ARES_SUCCESS) {
+ qquery->callback(qquery->arg, status, timeouts, dnsrec);
+ } else {
+ size_t ancount;
+ ares_dns_rcode_t rcode;
+ /* Pull the response code and answer count from the packet and convert any
+ * errors.
+ */
+ rcode = ares_dns_record_get_rcode(dnsrec);
+ ancount = ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER);
+ status = ares_dns_query_reply_tostatus(rcode, ancount);
+ qquery->callback(qquery->arg, status, timeouts, dnsrec);
+ }
+ ares_free(qquery);
}
-int ares_query_qid(ares_channel channel, const char *name,
- int dnsclass, int type, ares_callback callback,
- void *arg, unsigned short *qid)
+static ares_status_t ares_query_int(ares_channel_t *channel, const char *name,
+ ares_dns_class_t dnsclass,
+ ares_dns_rec_type_t type,
+ ares_callback_dnsrec callback, void *arg,
+ unsigned short *qid)
{
- struct qquery *qquery;
- unsigned char *qbuf;
- int qlen, rd, status;
- unsigned short id = generate_unique_id(channel);
-
- /* Compose the query. */
- rd = !(channel->flags & ARES_FLAG_NORECURSE);
- status = ares_create_query(name, dnsclass, type, id, rd, &qbuf,
- &qlen, (channel->flags & ARES_FLAG_EDNS) ? channel->ednspsz : 0);
- if (status != ARES_SUCCESS)
- {
- if (qbuf != NULL) ares_free(qbuf);
- callback(arg, status, 0, NULL, 0);
- return status;
+ ares_status_t status;
+ ares_dns_record_t *dnsrec = NULL;
+ ares_dns_flags_t flags = 0;
+ ares_query_dnsrec_arg_t *qquery = NULL;
+
+ if (channel == NULL || name == NULL || callback == NULL) {
+ status = ARES_EFORMERR;
+ if (callback != NULL) {
+ callback(arg, status, 0, NULL);
}
+ return status;
+ }
+
+ if (!(channel->flags & ARES_FLAG_NORECURSE)) {
+ flags |= ARES_FLAG_RD;
+ }
+
+ status = ares_dns_record_create_query(
+ &dnsrec, name, dnsclass, type, 0, flags,
+ (size_t)(channel->flags & ARES_FLAG_EDNS) ? channel->ednspsz : 0);
+ if (status != ARES_SUCCESS) {
+ callback(arg, status, 0, NULL);
+ return status;
+ }
+
+ qquery = ares_malloc(sizeof(*qquery));
+ if (qquery == NULL) {
+ status = ARES_ENOMEM;
+ callback(arg, status, 0, NULL);
+ ares_dns_record_destroy(dnsrec);
+ return status;
+ }
- /* Allocate and fill in the query structure. */
- qquery = ares_malloc(sizeof(struct qquery));
- if (!qquery)
- {
- ares_free_string(qbuf);
- callback(arg, ARES_ENOMEM, 0, NULL, 0);
- return ARES_ENOMEM;
- }
qquery->callback = callback;
- qquery->arg = arg;
+ qquery->arg = arg;
/* Send it off. qcallback will be called when we get an answer. */
- status = ares_send_ex(channel, qbuf, qlen, qcallback, qquery);
- ares_free_string(qbuf);
+ status = ares_send_dnsrec(channel, dnsrec, ares_query_dnsrec_cb, qquery, qid);
- if (status == ARES_SUCCESS && qid)
- *qid = id;
+ ares_dns_record_destroy(dnsrec);
+ return status;
+}
+ares_status_t ares_query_dnsrec(ares_channel_t *channel, const char *name,
+ ares_dns_class_t dnsclass,
+ ares_dns_rec_type_t type,
+ ares_callback_dnsrec callback, void *arg,
+ unsigned short *qid)
+{
+ ares_status_t status;
+
+ if (channel == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ ares__channel_lock(channel);
+ status = ares_query_int(channel, name, dnsclass, type, callback, arg, qid);
+ ares__channel_unlock(channel);
return status;
}
-void ares_query(ares_channel channel, const char *name, int dnsclass,
+void ares_query(ares_channel_t *channel, const char *name, int dnsclass,
int type, ares_callback callback, void *arg)
{
- ares_query_qid(channel, name, dnsclass, type, callback, arg, NULL);
-}
+ void *carg = NULL;
+ if (channel == NULL) {
+ return;
+ }
-static void qcallback(void *arg, int status, int timeouts, unsigned char *abuf, int alen)
-{
- struct qquery *qquery = (struct qquery *) arg;
- unsigned int ancount;
- int rcode;
-
- if (status != ARES_SUCCESS)
- qquery->callback(qquery->arg, status, timeouts, abuf, alen);
- else
- {
- /* Pull the response code and answer count from the packet. */
- rcode = DNS_HEADER_RCODE(abuf);
- ancount = DNS_HEADER_ANCOUNT(abuf);
-
- /* Convert errors. */
- switch (rcode)
- {
- case NOERROR:
- status = (ancount > 0) ? ARES_SUCCESS : ARES_ENODATA;
- break;
- case FORMERR:
- status = ARES_EFORMERR;
- break;
- case SERVFAIL:
- status = ARES_ESERVFAIL;
- break;
- case NXDOMAIN:
- status = ARES_ENOTFOUND;
- break;
- case NOTIMP:
- status = ARES_ENOTIMP;
- break;
- case REFUSED:
- status = ARES_EREFUSED;
- break;
- }
- qquery->callback(qquery->arg, status, timeouts, abuf, alen);
- }
- ares_free(qquery);
+ carg = ares__dnsrec_convert_arg(callback, arg);
+ if (carg == NULL) {
+ callback(arg, ARES_ENOMEM, 0, NULL, 0);
+ return;
+ }
+
+ ares_query_dnsrec(channel, name, (ares_dns_class_t)dnsclass,
+ (ares_dns_rec_type_t)type, ares__dnsrec_convert_cb, carg,
+ NULL);
}
diff --git a/contrib/libs/c-ares/src/lib/ares_rand.c b/contrib/libs/c-ares/src/lib/ares_rand.c
index 99a5a04cff..a7a74c9a8d 100644
--- a/contrib/libs/c-ares/src/lib/ares_rand.c
+++ b/contrib/libs/c-ares/src/lib/ares_rand.c
@@ -27,65 +27,58 @@
#include "ares_setup.h"
#include "ares.h"
#include "ares_private.h"
-#include "ares_nowarn.h"
#include <stdlib.h>
-#if !defined(HAVE_ARC4RANDOM_BUF) && !defined(HAVE_GETRANDOM) && !defined(_WIN32)
-# define ARES_NEEDS_RC4 1
+/* Older MacOS versions require including AvailabilityMacros.h before
+ * sys/random.h */
+#ifdef HAVE_AVAILABILITYMACROS_H
+# include <AvailabilityMacros.h>
#endif
-typedef enum {
- ARES_RAND_OS = 1, /* OS-provided such as RtlGenRandom or arc4random */
- ARES_RAND_FILE = 2, /* OS file-backed random number generator */
-#ifdef ARES_NEEDS_RC4
- ARES_RAND_RC4 = 3 /* Internal RC4 based PRNG */
+#ifdef HAVE_SYS_RANDOM_H
+# include <sys/random.h>
#endif
-} ares_rand_backend;
-/* Don't build RC4 code if it goes unused as it will generate dead code
- * warnings */
-#ifdef ARES_NEEDS_RC4
-# define ARES_RC4_KEY_LEN 32 /* 256 bits */
+typedef enum {
+ ARES_RAND_OS = 1 << 0, /* OS-provided such as RtlGenRandom or arc4random */
+ ARES_RAND_FILE = 1 << 1, /* OS file-backed random number generator */
+ ARES_RAND_RC4 = 1 << 2, /* Internal RC4 based PRNG */
+} ares_rand_backend;
-typedef struct ares_rand_rc4
-{
+#define ARES_RC4_KEY_LEN 32 /* 256 bits */
+
+typedef struct ares_rand_rc4 {
unsigned char S[256];
size_t i;
size_t j;
} ares_rand_rc4;
-
-#ifdef _MSC_VER
-typedef unsigned __int64 cares_u64;
-#else
-typedef unsigned long long cares_u64;
-#endif
-
-
static unsigned int ares_u32_from_ptr(void *addr)
{
- if (sizeof(void *) == 8) {
- return (unsigned int)((((cares_u64)addr >> 32) & 0xFFFFFFFF) | ((cares_u64)addr & 0xFFFFFFFF));
- }
- return (unsigned int)((size_t)addr & 0xFFFFFFFF);
+ if (sizeof(void *) == 8) {
+ return (unsigned int)((((ares_uint64_t)addr >> 32) & 0xFFFFFFFF) |
+ ((ares_uint64_t)addr & 0xFFFFFFFF));
+ }
+ return (unsigned int)((size_t)addr & 0xFFFFFFFF);
}
-
/* initialize an rc4 key as the last possible fallback. */
-static void ares_rc4_generate_key(ares_rand_rc4 *rc4_state, unsigned char *key, size_t key_len)
+static void ares_rc4_generate_key(ares_rand_rc4 *rc4_state, unsigned char *key,
+ size_t key_len)
{
size_t i;
size_t len = 0;
unsigned int data;
struct timeval tv;
- if (key_len != ARES_RC4_KEY_LEN)
+ if (key_len != ARES_RC4_KEY_LEN) {
return;
+ }
- /* Randomness is hard to come by. Maybe the system randomizes heap and stack addresses.
- * Maybe the current timestamp give us some randomness.
- * Use rc4_state (heap), &i (stack), and ares__tvnow()
+ /* Randomness is hard to come by. Maybe the system randomizes heap and stack
+ * addresses. Maybe the current timestamp give us some randomness. Use
+ * rc4_state (heap), &i (stack), and ares__tvnow()
*/
data = ares_u32_from_ptr(rc4_state);
memcpy(key + len, &data, sizeof(data));
@@ -95,19 +88,19 @@ static void ares_rc4_generate_key(ares_rand_rc4 *rc4_state, unsigned char *key,
memcpy(key + len, &data, sizeof(data));
len += sizeof(data);
- tv = ares__tvnow();
+ tv = ares__tvnow();
data = (unsigned int)((tv.tv_sec | tv.tv_usec) & 0xFFFFFFFF);
memcpy(key + len, &data, sizeof(data));
len += sizeof(data);
- srand(ares_u32_from_ptr(rc4_state) | ares_u32_from_ptr(&i) | (unsigned int)((tv.tv_sec | tv.tv_usec) & 0xFFFFFFFF));
+ srand(ares_u32_from_ptr(rc4_state) | ares_u32_from_ptr(&i) |
+ (unsigned int)((tv.tv_sec | tv.tv_usec) & 0xFFFFFFFF));
- for (i=len; i<key_len; i++) {
- key[i]=(unsigned char)(rand() % 256); /* LCOV_EXCL_LINE */
+ for (i = len; i < key_len; i++) {
+ key[i] = (unsigned char)(rand() % 256); /* LCOV_EXCL_LINE */
}
}
-
static void ares_rc4_init(ares_rand_rc4 *rc4_state)
{
unsigned char key[ARES_RC4_KEY_LEN];
@@ -120,7 +113,7 @@ static void ares_rc4_init(ares_rand_rc4 *rc4_state)
rc4_state->S[i] = i & 0xFF;
}
- for(i = 0, j = 0; i < 256; i++) {
+ for (i = 0, j = 0; i < 256; i++) {
j = (j + rc4_state->S[i] + key[i % sizeof(key)]) % 256;
ARES_SWAP_BYTE(&rc4_state->S[i], &rc4_state->S[j]);
}
@@ -129,16 +122,17 @@ static void ares_rc4_init(ares_rand_rc4 *rc4_state)
rc4_state->j = 0;
}
-
-/* Just outputs the key schedule, no need to XOR with any data since we have none */
-static void ares_rc4_prng(ares_rand_rc4 *rc4_state, unsigned char *buf, size_t len)
+/* Just outputs the key schedule, no need to XOR with any data since we have
+ * none */
+static void ares_rc4_prng(ares_rand_rc4 *rc4_state, unsigned char *buf,
+ size_t len)
{
unsigned char *S = rc4_state->S;
size_t i = rc4_state->i;
size_t j = rc4_state->j;
size_t cnt;
- for (cnt=0; cnt<len; cnt++) {
+ for (cnt = 0; cnt < len; cnt++) {
i = (i + 1) % 256;
j = (j + S[i]) % 256;
@@ -150,17 +144,13 @@ static void ares_rc4_prng(ares_rand_rc4 *rc4_state, unsigned char *buf, size_t l
rc4_state->j = j;
}
-#endif /* ARES_NEEDS_RC4 */
-
-
-struct ares_rand_state
-{
+struct ares_rand_state {
ares_rand_backend type;
+ ares_rand_backend bad_backends;
+
union {
- FILE *rand_file;
-#ifdef ARES_NEEDS_RC4
+ FILE *rand_file;
ares_rand_rc4 rc4;
-#endif
} state;
/* Since except for RC4, random data will likely result in a syscall, lets
@@ -168,11 +158,10 @@ struct ares_rand_state
* that means we should only need a syscall every 128 queries. 256bytes
* appears to be a sweet spot that may be able to be served without
* interruption */
- unsigned char cache[256];
- size_t cache_remaining;
+ unsigned char cache[256];
+ size_t cache_remaining;
};
-
/* Define RtlGenRandom = SystemFunction036. This is in advapi32.dll. There is
* no need to dynamically load this, other software used widely does not.
* http://blogs.msdn.com/michael_howard/archive/2005/01/14/353379.aspx
@@ -181,45 +170,49 @@ struct ares_rand_state
#ifdef _WIN32
BOOLEAN WINAPI SystemFunction036(PVOID RandomBuffer, ULONG RandomBufferLength);
# ifndef RtlGenRandom
-# define RtlGenRandom(a,b) SystemFunction036(a,b)
+# define RtlGenRandom(a, b) SystemFunction036(a, b)
# endif
#endif
-static int ares__init_rand_engine(ares_rand_state *state)
+static ares_bool_t ares__init_rand_engine(ares_rand_state *state)
{
- memset(state, 0, sizeof(*state));
+ state->cache_remaining = 0;
#if defined(HAVE_ARC4RANDOM_BUF) || defined(HAVE_GETRANDOM) || defined(_WIN32)
- state->type = ARES_RAND_OS;
- return 1;
-#elif defined(CARES_RANDOM_FILE)
- state->type = ARES_RAND_FILE;
- state->state.rand_file = fopen(CARES_RANDOM_FILE, "rb");
- if (state->state.rand_file) {
- setvbuf(state->state.rand_file, NULL, _IONBF, 0);
- return 1;
+ if (!(state->bad_backends & ARES_RAND_OS)) {
+ state->type = ARES_RAND_OS;
+ return ARES_TRUE;
+ }
+#endif
+
+#if defined(CARES_RANDOM_FILE)
+ if (!(state->bad_backends & ARES_RAND_FILE)) {
+ state->type = ARES_RAND_FILE;
+ state->state.rand_file = fopen(CARES_RANDOM_FILE, "rb");
+ if (state->state.rand_file) {
+ setvbuf(state->state.rand_file, NULL, _IONBF, 0);
+ return ARES_TRUE;
+ }
}
/* Fall-Thru on failure to RC4 */
#endif
-#ifdef ARES_NEEDS_RC4
state->type = ARES_RAND_RC4;
ares_rc4_init(&state->state.rc4);
/* Currently cannot fail */
- return 1;
-#endif
+ return ARES_TRUE;
}
-
ares_rand_state *ares__init_rand_state(void)
{
ares_rand_state *state = NULL;
- state = ares_malloc(sizeof(*state));
- if (!state)
+ state = ares_malloc_zero(sizeof(*state));
+ if (!state) {
return NULL;
+ }
if (!ares__init_rand_engine(state)) {
ares_free(state);
@@ -229,11 +222,11 @@ ares_rand_state *ares__init_rand_state(void)
return state;
}
-
static void ares__clear_rand_state(ares_rand_state *state)
{
- if (!state)
+ if (!state) {
return;
+ }
switch (state->type) {
case ARES_RAND_OS:
@@ -241,59 +234,61 @@ static void ares__clear_rand_state(ares_rand_state *state)
case ARES_RAND_FILE:
fclose(state->state.rand_file);
break;
-#ifdef ARES_NEEDS_RC4
case ARES_RAND_RC4:
break;
-#endif
}
}
-
static void ares__reinit_rand(ares_rand_state *state)
{
ares__clear_rand_state(state);
ares__init_rand_engine(state);
}
-
void ares__destroy_rand_state(ares_rand_state *state)
{
- if (!state)
+ if (!state) {
return;
+ }
ares__clear_rand_state(state);
ares_free(state);
}
-
static void ares__rand_bytes_fetch(ares_rand_state *state, unsigned char *buf,
size_t len)
{
-
while (1) {
size_t bytes_read = 0;
switch (state->type) {
case ARES_RAND_OS:
#ifdef _WIN32
- RtlGenRandom(buf, len);
+ RtlGenRandom(buf, (ULONG)len);
return;
#elif defined(HAVE_ARC4RANDOM_BUF)
arc4random_buf(buf, len);
return;
#elif defined(HAVE_GETRANDOM)
while (1) {
- size_t n = len - bytes_read;
+ size_t n = len - bytes_read;
/* getrandom() on Linux always succeeds and is never
* interrupted by a signal when requesting <= 256 bytes.
*/
ssize_t rv = getrandom(buf + bytes_read, n > 256 ? 256 : n, 0);
- if (rv <= 0)
+ if (rv <= 0) {
+ /* We need to fall back to another backend */
+ if (errno == ENOSYS) {
+ state->bad_backends |= ARES_RAND_OS;
+ break;
+ }
continue; /* Just retry. */
+ }
- bytes_read += rv;
- if (bytes_read == len)
+ bytes_read += (size_t)rv;
+ if (bytes_read == len) {
return;
+ }
}
break;
#else
@@ -303,21 +298,22 @@ static void ares__rand_bytes_fetch(ares_rand_state *state, unsigned char *buf,
case ARES_RAND_FILE:
while (1) {
- size_t rv = fread(buf + bytes_read, 1, len - bytes_read, state->state.rand_file);
- if (rv == 0)
+ size_t rv = fread(buf + bytes_read, 1, len - bytes_read,
+ state->state.rand_file);
+ if (rv == 0) {
break; /* critical error, will reinit rand state */
+ }
bytes_read += rv;
- if (bytes_read == len)
+ if (bytes_read == len) {
return;
+ }
}
break;
-#ifdef ARES_NEEDS_RC4
case ARES_RAND_RC4:
ares_rc4_prng(&state->state.rc4, buf, len);
return;
-#endif
}
/* If we didn't return before we got here, that means we had a critical rand
@@ -326,7 +322,6 @@ static void ares__rand_bytes_fetch(ares_rand_state *state, unsigned char *buf,
}
}
-
void ares__rand_bytes(ares_rand_state *state, unsigned char *buf, size_t len)
{
/* See if we need to refill the cache to serve the request, but if len is
@@ -349,12 +344,10 @@ void ares__rand_bytes(ares_rand_state *state, unsigned char *buf, size_t len)
ares__rand_bytes_fetch(state, buf, len);
}
-
unsigned short ares__generate_new_id(ares_rand_state *state)
{
- unsigned short r=0;
+ unsigned short r = 0;
ares__rand_bytes(state, (unsigned char *)&r, sizeof(r));
return r;
}
-
diff --git a/contrib/libs/c-ares/src/lib/ares_search.c b/contrib/libs/c-ares/src/lib/ares_search.c
index d72b4c444e..4fd909cd4f 100644
--- a/contrib/libs/c-ares/src/lib/ares_search.c
+++ b/contrib/libs/c-ares/src/lib/ares_search.c
@@ -33,208 +33,454 @@
#include "ares.h"
#include "ares_private.h"
+#include "ares_dns.h"
struct search_query {
- /* Arguments passed to ares_search */
- ares_channel channel;
- char *name; /* copied into an allocated buffer */
- int dnsclass;
- int type;
- ares_callback callback;
- void *arg;
+ /* Arguments passed to ares_search_dnsrec() */
+ ares_channel_t *channel;
+ ares_callback_dnsrec callback;
+ void *arg;
+
+ /* Duplicate of DNS record passed to ares_search_dnsrec() */
+ ares_dns_record_t *dnsrec;
+
+ /* Search order for names */
+ char **names;
+ size_t names_cnt;
- int status_as_is; /* error status from trying as-is */
- int next_domain; /* next search domain to try */
- int trying_as_is; /* current query is for name as-is */
- int timeouts; /* number of timeouts we saw for this request */
- int ever_got_nodata; /* did we ever get ARES_ENODATA along the way? */
+ /* State tracking progress through the search query */
+ size_t next_name_idx; /* next name index being attempted */
+ size_t timeouts; /* number of timeouts we saw for this request */
+ ares_bool_t ever_got_nodata; /* did we ever get ARES_ENODATA along the way? */
};
-static void search_callback(void *arg, int status, int timeouts,
- unsigned char *abuf, int alen);
-static void end_squery(struct search_query *squery, int status,
- unsigned char *abuf, int alen);
+static void squery_free(struct search_query *squery)
+{
+ if (squery == NULL) {
+ return;
+ }
+ ares__strsplit_free(squery->names, squery->names_cnt);
+ ares_dns_record_destroy(squery->dnsrec);
+ ares_free(squery);
+}
-void ares_search(ares_channel channel, const char *name, int dnsclass,
- int type, ares_callback callback, void *arg)
+/* End a search query by invoking the user callback and freeing the
+ * search_query structure.
+ */
+static void end_squery(struct search_query *squery, ares_status_t status,
+ const ares_dns_record_t *dnsrec)
+{
+ squery->callback(squery->arg, status, squery->timeouts, dnsrec);
+ squery_free(squery);
+}
+
+static void search_callback(void *arg, ares_status_t status, size_t timeouts,
+ const ares_dns_record_t *dnsrec);
+
+static ares_status_t ares_search_next(ares_channel_t *channel,
+ struct search_query *squery,
+ ares_bool_t *skip_cleanup)
{
- struct search_query *squery;
- char *s;
- const char *p;
- int status, ndots;
+ ares_status_t status;
- /* Per RFC 7686, reject queries for ".onion" domain names with NXDOMAIN. */
- if (ares__is_onion_domain(name))
- {
- callback(arg, ARES_ENOTFOUND, 0, NULL, 0);
- return;
- }
+ *skip_cleanup = ARES_FALSE;
+
+ /* Misuse check */
+ if (squery->next_name_idx >= squery->names_cnt) {
+ return ARES_EFORMERR;
+ }
+
+ status = ares_dns_record_query_set_name(
+ squery->dnsrec, 0, squery->names[squery->next_name_idx++]);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ status =
+ ares_send_dnsrec(channel, squery->dnsrec, search_callback, squery, NULL);
- /* If name only yields one domain to search, then we don't have
- * to keep extra state, so just do an ares_query().
+ if (status != ARES_EFORMERR) {
+ *skip_cleanup = ARES_TRUE;
+ }
+
+ return status;
+}
+
+static void search_callback(void *arg, ares_status_t status, size_t timeouts,
+ const ares_dns_record_t *dnsrec)
+{
+ struct search_query *squery = (struct search_query *)arg;
+ ares_channel_t *channel = squery->channel;
+ ares_dns_rcode_t rcode;
+ size_t ancount;
+ ares_status_t mystatus;
+ ares_bool_t skip_cleanup = ARES_FALSE;
+
+ squery->timeouts += timeouts;
+
+ if (status != ARES_SUCCESS) {
+ end_squery(squery, status, dnsrec);
+ return;
+ }
+
+ rcode = ares_dns_record_get_rcode(dnsrec);
+ ancount = ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER);
+ mystatus = ares_dns_query_reply_tostatus(rcode, ancount);
+
+ if (mystatus != ARES_ENODATA && mystatus != ARES_ESERVFAIL &&
+ mystatus != ARES_ENOTFOUND) {
+ end_squery(squery, mystatus, dnsrec);
+ return;
+ }
+
+ /* If we ever get ARES_ENODATA along the way, record that; if the search
+ * should run to the very end and we got at least one ARES_ENODATA,
+ * then callers like ares_gethostbyname() may want to try a T_A search
+ * even if the last domain we queried for T_AAAA resource records
+ * returned ARES_ENOTFOUND.
*/
- status = ares__single_domain(channel, name, &s);
- if (status != ARES_SUCCESS)
- {
- callback(arg, status, 0, NULL, 0);
- return;
+ if (mystatus == ARES_ENODATA) {
+ squery->ever_got_nodata = ARES_TRUE;
+ }
+
+ if (squery->next_name_idx < squery->names_cnt) {
+ mystatus = ares_search_next(channel, squery, &skip_cleanup);
+ if (mystatus != ARES_SUCCESS && !skip_cleanup) {
+ end_squery(squery, mystatus, NULL);
}
- if (s)
- {
- ares_query(channel, s, dnsclass, type, callback, arg);
- ares_free(s);
- return;
+ return;
+ }
+
+
+ /* We have no more domains to search, return an appropriate response. */
+ if (mystatus == ARES_ENOTFOUND && squery->ever_got_nodata) {
+ end_squery(squery, ARES_ENODATA, NULL);
+ return;
+ }
+
+ end_squery(squery, mystatus, NULL);
+}
+
+/* Determine if the domain should be looked up as-is, or if it is eligible
+ * for search by appending domains */
+static ares_bool_t ares__search_eligible(const ares_channel_t *channel,
+ const char *name)
+{
+ size_t len = ares_strlen(name);
+
+ /* Name ends in '.', cannot search */
+ if (len && name[len - 1] == '.') {
+ return ARES_FALSE;
+ }
+
+ if (channel->flags & ARES_FLAG_NOSEARCH) {
+ return ARES_FALSE;
+ }
+
+ return ARES_TRUE;
+}
+
+ares_status_t ares__search_name_list(const ares_channel_t *channel,
+ const char *name, char ***names,
+ size_t *names_len)
+{
+ ares_status_t status;
+ char **list = NULL;
+ size_t list_len = 0;
+ char *alias = NULL;
+ size_t ndots = 0;
+ size_t idx = 0;
+ const char *p;
+ size_t i;
+
+ /* Perform HOSTALIASES resolution */
+ status = ares__lookup_hostaliases(channel, name, &alias);
+ if (status == ARES_SUCCESS) {
+ /* If hostalias succeeds, there is no searching, it is used as-is */
+ list_len = 1;
+ list = ares_malloc_zero(sizeof(*list) * list_len);
+ if (list == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
}
+ list[0] = alias;
+ alias = NULL;
+ goto done;
+ } else if (status != ARES_ENOTFOUND) {
+ goto done;
+ }
- /* Allocate a search_query structure to hold the state necessary for
- * doing multiple lookups.
- */
- squery = ares_malloc(sizeof(struct search_query));
- if (!squery)
- {
- callback(arg, ARES_ENOMEM, 0, NULL, 0);
- return;
+ /* See if searching is eligible at all, if not, look up as-is only */
+ if (!ares__search_eligible(channel, name)) {
+ list_len = 1;
+ list = ares_malloc_zero(sizeof(*list) * list_len);
+ if (list == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
}
- squery->channel = channel;
- squery->name = ares_strdup(name);
- if (!squery->name)
- {
- ares_free(squery);
- callback(arg, ARES_ENOMEM, 0, NULL, 0);
- return;
+ list[0] = ares_strdup(name);
+ if (list[0] == NULL) {
+ status = ARES_ENOMEM;
+ } else {
+ status = ARES_SUCCESS;
}
- squery->dnsclass = dnsclass;
- squery->type = type;
- squery->status_as_is = -1;
- squery->callback = callback;
- squery->arg = arg;
- squery->timeouts = 0;
- squery->ever_got_nodata = 0;
-
- /* Count the number of dots in name. */
+ goto done;
+ }
+
+ /* Count the number of dots in name */
ndots = 0;
- for (p = name; *p; p++)
- {
- if (*p == '.')
- ndots++;
+ for (p = name; *p != 0; p++) {
+ if (*p == '.') {
+ ndots++;
+ }
+ }
+
+ /* Allocate an entry for each search domain, plus one for as-is */
+ list_len = channel->ndomains + 1;
+ list = ares_malloc_zero(sizeof(*list) * list_len);
+ if (list == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ /* Set status here, its possible there are no search domains at all, so
+ * status may be ARES_ENOTFOUND from ares__lookup_hostaliases(). */
+ status = ARES_SUCCESS;
+
+ /* Try as-is first */
+ if (ndots >= channel->ndots) {
+ list[idx] = ares_strdup(name);
+ if (list[idx] == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
}
+ idx++;
+ }
- /* If ndots is at least the channel ndots threshold (usually 1),
- * then we try the name as-is first. Otherwise, we try the name
- * as-is last.
- */
- if (ndots >= channel->ndots)
- {
- /* Try the name as-is first. */
- squery->next_domain = 0;
- squery->trying_as_is = 1;
- ares_query(channel, name, dnsclass, type, search_callback, squery);
+ /* Append each search suffix to the name */
+ for (i = 0; i < channel->ndomains; i++) {
+ status = ares__cat_domain(name, channel->domains[i], &list[idx]);
+ if (status != ARES_SUCCESS) {
+ goto done;
}
- else
- {
- /* Try the name as-is last; start with the first search domain. */
- squery->next_domain = 1;
- squery->trying_as_is = 0;
- status = ares__cat_domain(name, channel->domains[0], &s);
- if (status == ARES_SUCCESS)
- {
- ares_query(channel, s, dnsclass, type, search_callback, squery);
- ares_free(s);
- }
- else
- {
- /* failed, free the malloc()ed memory */
- ares_free(squery->name);
- ares_free(squery);
- callback(arg, status, 0, NULL, 0);
- }
+ idx++;
+ }
+
+ /* Try as-is last */
+ if (ndots < channel->ndots) {
+ list[idx] = ares_strdup(name);
+ if (list[idx] == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
}
+ idx++;
+ }
+
+
+done:
+ if (status == ARES_SUCCESS) {
+ *names = list;
+ *names_len = list_len;
+ } else {
+ ares__strsplit_free(list, list_len);
+ }
+
+ ares_free(alias);
+ return status;
}
-static void search_callback(void *arg, int status, int timeouts,
- unsigned char *abuf, int alen)
+static ares_status_t ares_search_int(ares_channel_t *channel,
+ const ares_dns_record_t *dnsrec,
+ ares_callback_dnsrec callback, void *arg)
{
- struct search_query *squery = (struct search_query *) arg;
- ares_channel channel = squery->channel;
- char *s;
+ struct search_query *squery = NULL;
+ const char *name;
+ ares_status_t status = ARES_SUCCESS;
+ ares_bool_t skip_cleanup = ARES_FALSE;
- squery->timeouts += timeouts;
+ /* Extract the name for the search. Note that searches are only supported for
+ * DNS records containing a single query.
+ */
+ if (ares_dns_record_query_cnt(dnsrec) != 1) {
+ status = ARES_EBADQUERY;
+ goto fail;
+ }
+
+ status = ares_dns_record_query_get(dnsrec, 0, &name, NULL, NULL);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ /* Per RFC 7686, reject queries for ".onion" domain names with NXDOMAIN. */
+ if (ares__is_onion_domain(name)) {
+ status = ARES_ENOTFOUND;
+ goto fail;
+ }
+
+ /* Allocate a search_query structure to hold the state necessary for
+ * doing multiple lookups.
+ */
+ squery = ares_malloc_zero(sizeof(*squery));
+ if (squery == NULL) {
+ status = ARES_ENOMEM;
+ goto fail;
+ }
+
+ squery->channel = channel;
+
+ /* Duplicate DNS record since, name will need to be rewritten */
+ squery->dnsrec = ares_dns_record_duplicate(dnsrec);
+ if (squery->dnsrec == NULL) {
+ status = ARES_ENOMEM;
+ goto fail;
+ }
+
+ squery->callback = callback;
+ squery->arg = arg;
+ squery->timeouts = 0;
+ squery->ever_got_nodata = ARES_FALSE;
+
+ status =
+ ares__search_name_list(channel, name, &squery->names, &squery->names_cnt);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ status = ares_search_next(channel, squery, &skip_cleanup);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ return status;
+
+fail:
+ if (!skip_cleanup) {
+ squery_free(squery);
+ callback(arg, status, 0, NULL);
+ }
+ return status;
+}
- /* Stop searching unless we got a non-fatal error. */
- if (status != ARES_ENODATA && status != ARES_ESERVFAIL
- && status != ARES_ENOTFOUND)
- end_squery(squery, status, abuf, alen);
- else
- {
- /* Save the status if we were trying as-is. */
- if (squery->trying_as_is)
- squery->status_as_is = status;
-
- /*
- * If we ever get ARES_ENODATA along the way, record that; if the search
- * should run to the very end and we got at least one ARES_ENODATA,
- * then callers like ares_gethostbyname() may want to try a T_A search
- * even if the last domain we queried for T_AAAA resource records
- * returned ARES_ENOTFOUND.
- */
- if (status == ARES_ENODATA)
- squery->ever_got_nodata = 1;
-
- if (squery->next_domain < channel->ndomains)
- {
- /* Try the next domain. */
- status = ares__cat_domain(squery->name,
- channel->domains[squery->next_domain], &s);
- if (status != ARES_SUCCESS)
- end_squery(squery, status, NULL, 0);
- else
- {
- squery->trying_as_is = 0;
- squery->next_domain++;
- ares_query(channel, s, squery->dnsclass, squery->type,
- search_callback, squery);
- ares_free(s);
- }
- }
- else if (squery->status_as_is == -1)
- {
- /* Try the name as-is at the end. */
- squery->trying_as_is = 1;
- ares_query(channel, squery->name, squery->dnsclass, squery->type,
- search_callback, squery);
- }
- else {
- if (squery->status_as_is == ARES_ENOTFOUND && squery->ever_got_nodata) {
- end_squery(squery, ARES_ENODATA, NULL, 0);
- }
- else
- end_squery(squery, squery->status_as_is, NULL, 0);
- }
+/* Callback argument structure passed to ares__dnsrec_convert_cb(). */
+typedef struct {
+ ares_callback callback;
+ void *arg;
+} dnsrec_convert_arg_t;
+
+/*! Function to create callback arg for converting from ares_callback_dnsrec
+ * to ares_calback */
+void *ares__dnsrec_convert_arg(ares_callback callback, void *arg)
+{
+ dnsrec_convert_arg_t *carg = ares_malloc_zero(sizeof(*carg));
+ if (carg == NULL) {
+ return NULL;
+ }
+ carg->callback = callback;
+ carg->arg = arg;
+ return carg;
+}
+
+/*! Callback function used to convert from the ares_callback_dnsrec prototype to
+ * the ares_callback prototype, by writing the result and passing that to
+ * the inner callback.
+ */
+void ares__dnsrec_convert_cb(void *arg, ares_status_t status, size_t timeouts,
+ const ares_dns_record_t *dnsrec)
+{
+ dnsrec_convert_arg_t *carg = arg;
+ unsigned char *abuf = NULL;
+ size_t alen = 0;
+
+ if (dnsrec != NULL) {
+ ares_status_t mystatus = ares_dns_write(dnsrec, &abuf, &alen);
+ if (mystatus != ARES_SUCCESS) {
+ status = mystatus;
}
+ }
+
+ carg->callback(carg->arg, (int)status, (int)timeouts, abuf, (int)alen);
+
+ ares_free(abuf);
+ ares_free(carg);
}
-static void end_squery(struct search_query *squery, int status,
- unsigned char *abuf, int alen)
+/* Search for a DNS name with given class and type. Wrapper around
+ * ares_search_int() where the DNS record to search is first constructed.
+ */
+void ares_search(ares_channel_t *channel, const char *name, int dnsclass,
+ int type, ares_callback callback, void *arg)
{
- squery->callback(squery->arg, status, squery->timeouts, abuf, alen);
- ares_free(squery->name);
- ares_free(squery);
+ ares_status_t status;
+ ares_dns_record_t *dnsrec = NULL;
+ size_t max_udp_size;
+ ares_dns_flags_t rd_flag;
+ void *carg = NULL;
+ if (channel == NULL || name == NULL) {
+ return;
+ }
+
+ /* For now, ares_search_int() uses the ares_callback prototype. We need to
+ * wrap the callback passed to this function in ares__dnsrec_convert_cb, to
+ * convert from ares_callback_dnsrec to ares_callback. Allocate the convert
+ * arg structure here.
+ */
+ carg = ares__dnsrec_convert_arg(callback, arg);
+ if (carg == NULL) {
+ callback(arg, ARES_ENOMEM, 0, NULL, 0);
+ return;
+ }
+
+ rd_flag = !(channel->flags & ARES_FLAG_NORECURSE) ? ARES_FLAG_RD : 0;
+ max_udp_size = (channel->flags & ARES_FLAG_EDNS) ? channel->ednspsz : 0;
+ status = ares_dns_record_create_query(
+ &dnsrec, name, (ares_dns_class_t)dnsclass, (ares_dns_rec_type_t)type, 0,
+ rd_flag, max_udp_size);
+ if (status != ARES_SUCCESS) {
+ callback(arg, (int)status, 0, NULL, 0);
+ ares_free(carg);
+ return;
+ }
+
+ ares__channel_lock(channel);
+ ares_search_int(channel, dnsrec, ares__dnsrec_convert_cb, carg);
+ ares__channel_unlock(channel);
+
+ ares_dns_record_destroy(dnsrec);
+}
+
+/* Search for a DNS record. Wrapper around ares_search_int(). */
+ares_status_t ares_search_dnsrec(ares_channel_t *channel,
+ const ares_dns_record_t *dnsrec,
+ ares_callback_dnsrec callback, void *arg)
+{
+ ares_status_t status;
+
+ if (channel == NULL || dnsrec == NULL || callback == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ ares__channel_lock(channel);
+ status = ares_search_int(channel, dnsrec, callback, arg);
+ ares__channel_unlock(channel);
+
+ return status;
}
/* Concatenate two domains. */
-int ares__cat_domain(const char *name, const char *domain, char **s)
+ares_status_t ares__cat_domain(const char *name, const char *domain, char **s)
{
- size_t nlen = strlen(name);
- size_t dlen = strlen(domain);
+ size_t nlen = ares_strlen(name);
+ size_t dlen = ares_strlen(domain);
*s = ares_malloc(nlen + 1 + dlen + 1);
- if (!*s)
+ if (!*s) {
return ARES_ENOMEM;
+ }
memcpy(*s, name, nlen);
(*s)[nlen] = '.';
if (strcmp(domain, ".") == 0) {
/* Avoid appending the root domain to the separator, which would set *s to
- an ill-formed value (ending in two consequtive dots). */
+ an ill-formed value (ending in two consecutive dots). */
dlen = 0;
}
memcpy(*s + nlen + 1, domain, dlen);
@@ -242,96 +488,113 @@ int ares__cat_domain(const char *name, const char *domain, char **s)
return ARES_SUCCESS;
}
-/* Determine if this name only yields one query. If it does, set *s to
- * the string we should query, in an allocated buffer. If not, set *s
- * to NULL.
- */
-int ares__single_domain(ares_channel channel, const char *name, char **s)
+ares_status_t ares__lookup_hostaliases(const ares_channel_t *channel,
+ const char *name, char **alias)
{
- size_t len = strlen(name);
- const char *hostaliases;
- FILE *fp;
- char *line = NULL;
- int status;
- size_t linesize;
- const char *p, *q;
- int error;
-
- /* If the name contains a trailing dot, then the single query is the name
- * sans the trailing dot.
+ ares_status_t status = ARES_SUCCESS;
+ const char *hostaliases = NULL;
+ ares__buf_t *buf = NULL;
+ ares__llist_t *lines = NULL;
+ ares__llist_node_t *node;
+
+ if (channel == NULL || name == NULL || alias == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ *alias = NULL;
+
+ /* Configuration says to not perform alias lookup */
+ if (channel->flags & ARES_FLAG_NOALIASES) {
+ return ARES_ENOTFOUND;
+ }
+
+ /* If a domain has a '.', its not allowed to perform an alias lookup */
+ if (strchr(name, '.') != NULL) {
+ return ARES_ENOTFOUND;
+ }
+
+ hostaliases = getenv("HOSTALIASES");
+ if (hostaliases == NULL) {
+ status = ARES_ENOTFOUND;
+ goto done;
+ }
+
+ buf = ares__buf_create();
+ if (buf == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ status = ares__buf_load_file(hostaliases, buf);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ /* The HOSTALIASES file is structured as one alias per line. The first
+ * field in the line is the simple hostname with no periods, followed by
+ * whitespace, then the full domain name, e.g.:
+ *
+ * c-ares www.c-ares.org
+ * curl www.curl.se
*/
- if ((len > 0) && (name[len - 1] == '.'))
- {
- *s = ares_strdup(name);
- return (*s) ? ARES_SUCCESS : ARES_ENOMEM;
+
+ status = ares__buf_split(buf, (const unsigned char *)"\n", 1,
+ ARES_BUF_SPLIT_TRIM, 0, &lines);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ for (node = ares__llist_node_first(lines); node != NULL;
+ node = ares__llist_node_next(node)) {
+ ares__buf_t *line = ares__llist_node_val(node);
+ char hostname[64] = "";
+ char fqdn[256] = "";
+
+ /* Pull off hostname */
+ ares__buf_tag(line);
+ ares__buf_consume_nonwhitespace(line);
+ if (ares__buf_tag_fetch_string(line, hostname, sizeof(hostname)) !=
+ ARES_SUCCESS) {
+ continue;
}
- if (!(channel->flags & ARES_FLAG_NOALIASES) && !strchr(name, '.'))
- {
- /* The name might be a host alias. */
- hostaliases = getenv("HOSTALIASES");
- if (hostaliases)
- {
- fp = fopen(hostaliases, "r");
- if (fp)
- {
- while ((status = ares__read_line(fp, &line, &linesize))
- == ARES_SUCCESS)
- {
- if (strncasecmp(line, name, len) != 0 ||
- !ISSPACE(line[len]))
- continue;
- p = line + len;
- while (ISSPACE(*p))
- p++;
- if (*p)
- {
- q = p + 1;
- while (*q && !ISSPACE(*q))
- q++;
- *s = ares_malloc(q - p + 1);
- if (*s)
- {
- memcpy(*s, p, q - p);
- (*s)[q - p] = 0;
- }
- ares_free(line);
- fclose(fp);
- return (*s) ? ARES_SUCCESS : ARES_ENOMEM;
- }
- }
- ares_free(line);
- fclose(fp);
- if (status != ARES_SUCCESS && status != ARES_EOF)
- return status;
- }
- else
- {
- error = ERRNO;
- switch(error)
- {
- case ENOENT:
- case ESRCH:
- break;
- default:
- DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n",
- error, strerror(error)));
- DEBUGF(fprintf(stderr, "Error opening file: %s\n",
- hostaliases));
- *s = NULL;
- return ARES_EFILE;
- }
- }
- }
+ /* Match hostname */
+ if (strcasecmp(hostname, name) != 0) {
+ continue;
}
- if (channel->flags & ARES_FLAG_NOSEARCH || channel->ndomains == 0)
- {
- /* No domain search to do; just try the name as-is. */
- *s = ares_strdup(name);
- return (*s) ? ARES_SUCCESS : ARES_ENOMEM;
+ /* consume whitespace */
+ ares__buf_consume_whitespace(line, ARES_TRUE);
+
+ /* pull off fqdn */
+ ares__buf_tag(line);
+ ares__buf_consume_nonwhitespace(line);
+ if (ares__buf_tag_fetch_string(line, fqdn, sizeof(fqdn)) != ARES_SUCCESS ||
+ ares_strlen(fqdn) == 0) {
+ continue;
}
- *s = NULL;
- return ARES_SUCCESS;
+ /* Validate characterset */
+ if (!ares__is_hostname(fqdn)) {
+ continue;
+ }
+
+ *alias = ares_strdup(fqdn);
+ if (*alias == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ /* Good! */
+ status = ARES_SUCCESS;
+ goto done;
+ }
+
+ status = ARES_ENOTFOUND;
+
+done:
+ ares__buf_destroy(buf);
+ ares__llist_destroy(lines);
+
+ return status;
}
diff --git a/contrib/libs/c-ares/src/lib/ares_send.c b/contrib/libs/c-ares/src/lib/ares_send.c
index 9507796720..54f2b504d5 100644
--- a/contrib/libs/c-ares/src/lib/ares_send.c
+++ b/contrib/libs/c-ares/src/lib/ares_send.c
@@ -37,98 +37,91 @@
#include "ares_dns.h"
#include "ares_private.h"
-int ares_send_ex(ares_channel channel, const unsigned char *qbuf, int qlen,
- ares_callback callback, void *arg)
+static unsigned short generate_unique_qid(ares_channel_t *channel)
{
- struct query *query;
- int i, packetsz;
- struct timeval now;
+ unsigned short id;
+
+ do {
+ id = ares__generate_new_id(channel->rand_state);
+ } while (ares__htable_szvp_get(channel->queries_by_qid, id, NULL));
+
+ return id;
+}
+
+static ares_status_t ares_send_dnsrec_int(ares_channel_t *channel,
+ const ares_dns_record_t *dnsrec,
+ ares_callback_dnsrec callback,
+ void *arg, unsigned short *qid)
+{
+ struct query *query;
+ size_t packetsz;
+ struct timeval now = ares__tvnow();
+ ares_status_t status;
+ unsigned short id = generate_unique_qid(channel);
+ const ares_dns_record_t *dnsrec_resp = NULL;
+
+ if (ares__slist_len(channel->servers) == 0) {
+ callback(arg, ARES_ENOSERVER, 0, NULL);
+ return ARES_ENOSERVER;
+ }
+
+ /* Check query cache */
+ status = ares_qcache_fetch(channel, &now, dnsrec, &dnsrec_resp);
+ if (status != ARES_ENOTFOUND) {
+ /* ARES_SUCCESS means we retrieved the cache, anything else is a critical
+ * failure, all result in termination */
+ callback(arg, status, 0, dnsrec_resp);
+ return status;
+ }
- /* Verify that the query is at least long enough to hold the header. */
- if (qlen < HFIXEDSZ || qlen >= (1 << 16))
- {
- callback(arg, ARES_EBADQUERY, 0, NULL, 0);
- return ARES_EBADQUERY;
- }
- if (channel->nservers < 1)
- {
- callback(arg, ARES_ESERVFAIL, 0, NULL, 0);
- return ARES_ESERVFAIL;
- }
/* Allocate space for query and allocated fields. */
query = ares_malloc(sizeof(struct query));
- if (!query)
- {
- callback(arg, ARES_ENOMEM, 0, NULL, 0);
- return ARES_ENOMEM;
- }
+ if (!query) {
+ callback(arg, ARES_ENOMEM, 0, NULL);
+ return ARES_ENOMEM;
+ }
memset(query, 0, sizeof(*query));
+
query->channel = channel;
- query->tcpbuf = ares_malloc(qlen + 2);
- if (!query->tcpbuf)
- {
- ares_free(query);
- callback(arg, ARES_ENOMEM, 0, NULL, 0);
- return ARES_ENOMEM;
- }
- query->server_info = ares_malloc(channel->nservers *
- sizeof(query->server_info[0]));
- if (!query->server_info)
- {
- ares_free(query->tcpbuf);
- ares_free(query);
- callback(arg, ARES_ENOMEM, 0, NULL, 0);
- return ARES_ENOMEM;
- }
-
- /* Compute the query ID. Start with no timeout. */
- query->qid = DNS_HEADER_QID(qbuf);
- query->timeout.tv_sec = 0;
+
+ status = ares_dns_write(dnsrec, &query->qbuf, &query->qlen);
+ if (status != ARES_SUCCESS) {
+ ares_free(query);
+ callback(arg, status, 0, NULL);
+ return status;
+ }
+
+ query->qid = id;
+ query->timeout.tv_sec = 0;
query->timeout.tv_usec = 0;
- /* Form the TCP query buffer by prepending qlen (as two
- * network-order bytes) to qbuf.
- */
- query->tcpbuf[0] = (unsigned char)((qlen >> 8) & 0xff);
- query->tcpbuf[1] = (unsigned char)(qlen & 0xff);
- memcpy(query->tcpbuf + 2, qbuf, qlen);
- query->tcplen = qlen + 2;
+ /* Ignore first 2 bytes, assign our own query id */
+ query->qbuf[0] = (unsigned char)((id >> 8) & 0xFF);
+ query->qbuf[1] = (unsigned char)(id & 0xFF);
/* Fill in query arguments. */
- query->qbuf = query->tcpbuf + 2;
- query->qlen = qlen;
query->callback = callback;
- query->arg = arg;
+ query->arg = arg;
/* Initialize query status. */
query->try_count = 0;
- /* Choose the server to send the query to. If rotation is enabled, keep track
- * of the next server we want to use. */
- query->server = channel->last_server;
- if (channel->rotate == 1)
- channel->last_server = (channel->last_server + 1) % channel->nservers;
-
- for (i = 0; i < channel->nservers; i++)
- {
- query->server_info[i].skip_server = 0;
- query->server_info[i].tcp_connection_generation = 0;
- }
-
packetsz = (channel->flags & ARES_FLAG_EDNS) ? channel->ednspsz : PACKETSZ;
- query->using_tcp = (channel->flags & ARES_FLAG_USEVC) || qlen > packetsz;
+ query->using_tcp =
+ (channel->flags & ARES_FLAG_USEVC) || query->qlen > packetsz;
- query->error_status = ARES_ECONNREFUSED;
- query->timeouts = 0;
+ query->error_status = ARES_SUCCESS;
+ query->timeouts = 0;
/* Initialize our list nodes. */
query->node_queries_by_timeout = NULL;
query->node_queries_to_conn = NULL;
/* Chain the query into the list of all queries. */
- query->node_all_queries = ares__llist_insert_last(channel->all_queries, query);
+ query->node_all_queries =
+ ares__llist_insert_last(channel->all_queries, query);
if (query->node_all_queries == NULL) {
- callback(arg, ARES_ENOMEM, 0, NULL, 0);
+ callback(arg, ARES_ENOMEM, 0, NULL);
ares__free_query(query);
return ARES_ENOMEM;
}
@@ -136,19 +129,90 @@ int ares_send_ex(ares_channel channel, const unsigned char *qbuf, int qlen,
/* Keep track of queries bucketed by qid, so we can process DNS
* responses quickly.
*/
- if (!ares__htable_stvp_insert(channel->queries_by_qid, query->qid, query)) {
- callback(arg, ARES_ENOMEM, 0, NULL, 0);
+ if (!ares__htable_szvp_insert(channel->queries_by_qid, query->qid, query)) {
+ callback(arg, ARES_ENOMEM, 0, NULL);
ares__free_query(query);
return ARES_ENOMEM;
}
/* Perform the first query action. */
- now = ares__tvnow();
- return ares__send_query(channel, query, &now);
+
+ status = ares__send_query(query, &now);
+ if (status == ARES_SUCCESS && qid) {
+ *qid = id;
+ }
+ return status;
}
-void ares_send(ares_channel channel, const unsigned char *qbuf, int qlen,
+ares_status_t ares_send_dnsrec(ares_channel_t *channel,
+ const ares_dns_record_t *dnsrec,
+ ares_callback_dnsrec callback, void *arg,
+ unsigned short *qid)
+{
+ ares_status_t status;
+
+ if (channel == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ ares__channel_lock(channel);
+
+ status = ares_send_dnsrec_int(channel, dnsrec, callback, arg, qid);
+
+ ares__channel_unlock(channel);
+
+ return status;
+}
+
+void ares_send(ares_channel_t *channel, const unsigned char *qbuf, int qlen,
ares_callback callback, void *arg)
{
- ares_send_ex(channel, qbuf, qlen, callback, arg);
+ ares_dns_record_t *dnsrec = NULL;
+ ares_status_t status;
+ void *carg = NULL;
+
+ if (channel == NULL) {
+ return;
+ }
+
+ /* Verify that the query is at least long enough to hold the header. */
+ if (qlen < HFIXEDSZ || qlen >= (1 << 16)) {
+ callback(arg, ARES_EBADQUERY, 0, NULL, 0);
+ return;
+ }
+
+ status = ares_dns_parse(qbuf, (size_t)qlen, 0, &dnsrec);
+ if (status != ARES_SUCCESS) {
+ callback(arg, (int)status, 0, NULL, 0);
+ return;
+ }
+
+ carg = ares__dnsrec_convert_arg(callback, arg);
+ if (carg == NULL) {
+ status = ARES_ENOMEM;
+ ares_dns_record_destroy(dnsrec);
+ callback(arg, (int)status, 0, NULL, 0);
+ return;
+ }
+
+ ares_send_dnsrec(channel, dnsrec, ares__dnsrec_convert_cb, carg, NULL);
+
+ ares_dns_record_destroy(dnsrec);
+}
+
+size_t ares_queue_active_queries(ares_channel_t *channel)
+{
+ size_t len;
+
+ if (channel == NULL) {
+ return 0;
+ }
+
+ ares__channel_lock(channel);
+
+ len = ares__llist_len(channel->all_queries);
+
+ ares__channel_unlock(channel);
+
+ return len;
}
diff --git a/contrib/libs/c-ares/src/lib/ares_setup.h b/contrib/libs/c-ares/src/lib/ares_setup.h
index f1cd5c0cea..c506449dbd 100644
--- a/contrib/libs/c-ares/src/lib/ares_setup.h
+++ b/contrib/libs/c-ares/src/lib/ares_setup.h
@@ -31,7 +31,7 @@
*/
#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32)
-#define WIN32
+# define WIN32
#endif
/*
@@ -40,12 +40,12 @@
*/
#if defined(HAVE_CONFIG_H) && !defined(_MSC_VER)
-#include "ares_config.h"
+# include "ares_config.h"
#else
-#ifdef WIN32
-#include "config-win32.h"
-#endif
+# ifdef WIN32
+# include "config-win32.h"
+# endif
#endif /* HAVE_CONFIG_H */
@@ -123,7 +123,7 @@
# ifdef HAVE_WINSOCK2_H
# include <winsock2.h>
# ifdef HAVE_WS2TCPIP_H
-# include <ws2tcpip.h>
+# include <ws2tcpip.h>
# endif
# else
# ifdef HAVE_WINSOCK_H
@@ -138,8 +138,9 @@
* undefine USE_WINSOCK.
*/
-#undef USE_WINSOCK
-
+#ifdef USE_WINSOCK
+# undef USE_WINSOCK
+#endif
#ifdef HAVE_WINSOCK2_H
# define USE_WINSOCK 2
#else
@@ -154,17 +155,17 @@
#ifndef HAVE_CONFIG_H
-#if !defined(HAVE_SYS_TIME_H) && !defined(_MSC_VER) && !defined(__WATCOMC__)
-#define HAVE_SYS_TIME_H
-#endif
+# if !defined(HAVE_SYS_TIME_H) && !defined(_MSC_VER) && !defined(__WATCOMC__)
+# define HAVE_SYS_TIME_H
+# endif
-#if !defined(HAVE_UNISTD_H) && !defined(_MSC_VER)
-#define HAVE_UNISTD_H 1
-#endif
+# if !defined(HAVE_UNISTD_H) && !defined(_MSC_VER)
+# define HAVE_UNISTD_H 1
+# endif
-#if !defined(HAVE_SYS_UIO_H) && !defined(WIN32) && !defined(MSDOS)
-#define HAVE_SYS_UIO_H
-#endif
+# if !defined(HAVE_SYS_UIO_H) && !defined(WIN32) && !defined(MSDOS)
+# define HAVE_SYS_UIO_H
+# endif
#endif /* HAVE_CONFIG_H */
@@ -193,7 +194,7 @@
* but it is not fully implemented and missing identifiers, so udefine here.
*/
#if (defined(ANDROID) || defined(__ANDROID__) || defined(__MVS__)) && \
- defined(HAVE_ARPA_NAMESER_H)
+ defined(HAVE_ARPA_NAMESER_H)
# undef HAVE_ARPA_NAMESER_H
#endif
@@ -203,21 +204,35 @@
* --enable-debug) so we undef them again here.
*/
-#undef PACKAGE_STRING
-#undef PACKAGE_TARNAME
-#undef PACKAGE_VERSION
-#undef PACKAGE_BUGREPORT
-#undef PACKAGE_NAME
-#undef VERSION
-#undef PACKAGE
+#ifdef PACKAGE_STRING
+# undef PACKAGE_STRING
+#endif
+#ifdef PACKAGE_TARNAME
+# undef PACKAGE_TARNAME
+#endif
+#ifdef PACKAGE_VERSION
+# undef PACKAGE_VERSION
+#endif
+#ifdef PACKAGE_BUGREPORT
+# undef PACKAGE_BUGREPORT
+#endif
+#ifdef PACKAGE_NAME
+# undef PACKAGE_NAME
+#endif
+#ifdef VERSION
+# undef VERSION
+#endif
+#ifdef PACKAGE
+# undef PACKAGE
+#endif
/* IPv6 compatibility */
#if !defined(HAVE_AF_INET6)
-#if defined(HAVE_PF_INET6)
-#define AF_INET6 PF_INET6
-#else
-#define AF_INET6 AF_MAX+1
-#endif
+# if defined(HAVE_PF_INET6)
+# define AF_INET6 PF_INET6
+# else
+# define AF_INET6 AF_MAX + 1
+# endif
#endif
/*
@@ -225,7 +240,7 @@
*/
#ifndef __SETUP_ONCE_H
-#include "setup_once.h"
+# include "setup_once.h"
#endif
#endif /* HEADER_CARES_SETUP_H */
diff --git a/contrib/libs/c-ares/src/lib/ares_str.c b/contrib/libs/c-ares/src/lib/ares_str.c
new file mode 100644
index 0000000000..5f25cfeaff
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares_str.c
@@ -0,0 +1,269 @@
+/* MIT License
+ *
+ * Copyright (c) 1998 Massachusetts Institute of Technology
+ * Copyright (c) The c-ares project and its contributors
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#include "ares_setup.h"
+#include "ares_str.h"
+#include "ares.h"
+#include "ares_private.h"
+
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+
+size_t ares_strlen(const char *str)
+{
+ if (str == NULL) {
+ return 0;
+ }
+
+ return strlen(str);
+}
+
+char *ares_strdup(const char *s1)
+{
+ size_t len;
+ char *out;
+
+ if (s1 == NULL) {
+ return NULL;
+ }
+
+ len = ares_strlen(s1);
+
+ /* Don't see how this is possible */
+ if (len == SIZE_MAX) {
+ return NULL;
+ }
+
+ out = ares_malloc(len + 1);
+ if (out == NULL) {
+ return NULL;
+ }
+
+ if (len) {
+ memcpy(out, s1, len);
+ }
+
+ out[len] = 0;
+ return out;
+}
+
+size_t ares_strcpy(char *dest, const char *src, size_t dest_size)
+{
+ size_t len = 0;
+
+ if (dest == NULL || dest_size == 0) {
+ return 0;
+ }
+
+ len = ares_strlen(src);
+
+ if (len >= dest_size) {
+ len = dest_size - 1;
+ }
+
+ if (len) {
+ memcpy(dest, src, len);
+ }
+
+ dest[len] = 0;
+ return len;
+}
+
+ares_bool_t ares_str_isnum(const char *str)
+{
+ size_t i;
+
+ if (str == NULL || *str == 0) {
+ return ARES_FALSE;
+ }
+
+ for (i = 0; str[i] != 0; i++) {
+ if (str[i] < '0' || str[i] > '9') {
+ return ARES_FALSE;
+ }
+ }
+ return ARES_TRUE;
+}
+
+void ares__str_rtrim(char *str)
+{
+ size_t len;
+ size_t i;
+
+ if (str == NULL) {
+ return;
+ }
+
+ len = ares_strlen(str);
+ for (i = len; i > 0; i--) {
+ if (!ares__isspace(str[i - 1])) {
+ break;
+ }
+ }
+ str[i] = 0;
+}
+
+void ares__str_ltrim(char *str)
+{
+ size_t i;
+ size_t len;
+
+ if (str == NULL) {
+ return;
+ }
+
+ for (i = 0; str[i] != 0 && ares__isspace(str[i]); i++) {
+ /* Do nothing */
+ }
+
+ if (i == 0) {
+ return;
+ }
+
+ len = ares_strlen(str);
+ if (i != len) {
+ memmove(str, str + i, len - i);
+ }
+ str[len - i] = 0;
+}
+
+void ares__str_trim(char *str)
+{
+ ares__str_ltrim(str);
+ ares__str_rtrim(str);
+}
+
+/* tolower() is locale-specific. Use a lookup table fast conversion that only
+ * operates on ASCII */
+static const unsigned char ares__tolower_lookup[] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C,
+ 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
+ 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26,
+ 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33,
+ 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40,
+ 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D,
+ 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A,
+ 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+ 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74,
+ 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x80, 0x81,
+ 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E,
+ 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B,
+ 0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8,
+ 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5,
+ 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1, 0xC2,
+ 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
+ 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC,
+ 0xDD, 0xDE, 0xDF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9,
+ 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6,
+ 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF
+};
+
+unsigned char ares__tolower(unsigned char c)
+{
+ return ares__tolower_lookup[c];
+}
+
+ares_bool_t ares__memeq_ci(const unsigned char *ptr, const unsigned char *val,
+ size_t len)
+{
+ size_t i;
+ for (i = 0; i < len; i++) {
+ if (ares__tolower_lookup[ptr[i]] != ares__tolower_lookup[val[i]]) {
+ return ARES_FALSE;
+ }
+ }
+ return ARES_TRUE;
+}
+
+ares_bool_t ares__isspace(int ch)
+{
+ switch (ch) {
+ case '\r':
+ case '\t':
+ case ' ':
+ case '\v':
+ case '\f':
+ case '\n':
+ return ARES_TRUE;
+ default:
+ break;
+ }
+ return ARES_FALSE;
+}
+
+ares_bool_t ares__isprint(int ch)
+{
+ if (ch >= 0x20 && ch <= 0x7E) {
+ return ARES_TRUE;
+ }
+ return ARES_FALSE;
+}
+
+/* Character set allowed by hostnames. This is to include the normal
+ * domain name character set plus:
+ * - underscores which are used in SRV records.
+ * - Forward slashes such as are used for classless in-addr.arpa
+ * delegation (CNAMEs)
+ * - Asterisks may be used for wildcard domains in CNAMEs as seen in the
+ * real world.
+ * While RFC 2181 section 11 does state not to do validation,
+ * that applies to servers, not clients. Vulnerabilities have been
+ * reported when this validation is not performed. Security is more
+ * important than edge-case compatibility (which is probably invalid
+ * anyhow). */
+ares_bool_t ares__is_hostnamech(int ch)
+{
+ /* [A-Za-z0-9-*._/]
+ * Don't use isalnum() as it is locale-specific
+ */
+ if (ch >= 'A' && ch <= 'Z') {
+ return ARES_TRUE;
+ }
+ if (ch >= 'a' && ch <= 'z') {
+ return ARES_TRUE;
+ }
+ if (ch >= '0' && ch <= '9') {
+ return ARES_TRUE;
+ }
+ if (ch == '-' || ch == '.' || ch == '_' || ch == '/' || ch == '*') {
+ return ARES_TRUE;
+ }
+
+ return ARES_FALSE;
+}
+
+ares_bool_t ares__is_hostname(const char *str)
+{
+ size_t i;
+ for (i = 0; str[i] != 0; i++) {
+ if (!ares__is_hostnamech(str[i])) {
+ return ARES_FALSE;
+ }
+ }
+ return ARES_TRUE;
+}
diff --git a/contrib/libs/c-ares/src/lib/ares_strdup.c b/contrib/libs/c-ares/src/lib/ares_str.h
index db5dd1d84b..8d869073d8 100644
--- a/contrib/libs/c-ares/src/lib/ares_strdup.c
+++ b/contrib/libs/c-ares/src/lib/ares_str.h
@@ -24,29 +24,43 @@
*
* SPDX-License-Identifier: MIT
*/
+#ifndef __ARES_STR_H
+#define __ARES_STR_H
#include "ares_setup.h"
-#include "ares_strdup.h"
#include "ares.h"
-#include "ares_private.h"
-
-char *ares_strdup(const char *s1)
-{
- size_t sz;
- char * s2;
-
- if(s1) {
- sz = strlen(s1);
- if(sz < (size_t)-1) {
- sz++;
- if(sz < ((size_t)-1)) {
- s2 = ares_malloc(sz);
- if(s2) {
- memcpy(s2, s1, sz);
- return s2;
- }
- }
- }
- }
- return (char *)NULL;
-}
+
+char *ares_strdup(const char *s1);
+
+size_t ares_strlen(const char *str);
+
+/*! Copy string from source to destination with destination buffer size
+ * provided. The destination is guaranteed to be null terminated, if the
+ * provided buffer isn't large enough, only those bytes from the source that
+ * will fit will be copied.
+ *
+ * \param[out] dest Destination buffer
+ * \param[in] src Source to copy
+ * \param[in] dest_size Size of destination buffer
+ * \return String length. Will be at most dest_size-1
+ */
+size_t ares_strcpy(char *dest, const char *src, size_t dest_size);
+
+ares_bool_t ares_str_isnum(const char *str);
+
+void ares__str_ltrim(char *str);
+void ares__str_rtrim(char *str);
+void ares__str_trim(char *str);
+
+unsigned char ares__tolower(unsigned char c);
+ares_bool_t ares__memeq_ci(const unsigned char *ptr, const unsigned char *val,
+ size_t len);
+
+ares_bool_t ares__isspace(int ch);
+ares_bool_t ares__isprint(int ch);
+ares_bool_t ares__is_hostnamech(int ch);
+
+ares_bool_t ares__is_hostname(const char *str);
+
+
+#endif /* __ARES_STR_H */
diff --git a/contrib/libs/c-ares/src/lib/ares_strcasecmp.c b/contrib/libs/c-ares/src/lib/ares_strcasecmp.c
index e7fd527404..b91cbbe154 100644
--- a/contrib/libs/c-ares/src/lib/ares_strcasecmp.c
+++ b/contrib/libs/c-ares/src/lib/ares_strcasecmp.c
@@ -31,46 +31,49 @@
#ifndef HAVE_STRCASECMP
int ares_strcasecmp(const char *a, const char *b)
{
-#if defined(HAVE_STRCMPI)
+# if defined(HAVE_STRCMPI)
return strcmpi(a, b);
-#elif defined(HAVE_STRICMP)
+# elif defined(HAVE_STRICMP)
return stricmp(a, b);
-#else
+# else
size_t i;
for (i = 0; i < (size_t)-1; i++) {
int c1 = ISUPPER(a[i]) ? tolower(a[i]) : a[i];
int c2 = ISUPPER(b[i]) ? tolower(b[i]) : b[i];
- if (c1 != c2)
- return c1-c2;
- if (!c1)
+ if (c1 != c2) {
+ return c1 - c2;
+ }
+ if (!c1) {
break;
+ }
}
return 0;
-#endif
+# endif
}
#endif
#ifndef HAVE_STRNCASECMP
int ares_strncasecmp(const char *a, const char *b, size_t n)
{
-#if defined(HAVE_STRNCMPI)
+# if defined(HAVE_STRNCMPI)
return strncmpi(a, b, n);
-#elif defined(HAVE_STRNICMP)
+# elif defined(HAVE_STRNICMP)
return strnicmp(a, b, n);
-#else
+# else
size_t i;
for (i = 0; i < n; i++) {
int c1 = ISUPPER(a[i]) ? tolower(a[i]) : a[i];
int c2 = ISUPPER(b[i]) ? tolower(b[i]) : b[i];
- if (c1 != c2)
- return c1-c2;
- if (!c1)
+ if (c1 != c2) {
+ return c1 - c2;
+ }
+ if (!c1) {
break;
+ }
}
return 0;
-#endif
+# endif
}
#endif
-
diff --git a/contrib/libs/c-ares/src/lib/ares_strdup.h b/contrib/libs/c-ares/src/lib/ares_strdup.h
deleted file mode 100644
index 06e8cdccb5..0000000000
--- a/contrib/libs/c-ares/src/lib/ares_strdup.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/* MIT License
- *
- * Copyright (c) 1998 Massachusetts Institute of Technology
- * Copyright (c) The c-ares project and its contributors
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- * SPDX-License-Identifier: MIT
- */
-#ifndef HEADER_CARES_STRDUP_H
-#define HEADER_CARES_STRDUP_H
-
-#include "ares_setup.h"
-
-extern char *ares_strdup(const char *s1);
-
-#endif /* HEADER_CARES_STRDUP_H */
diff --git a/contrib/libs/c-ares/src/lib/ares_strerror.c b/contrib/libs/c-ares/src/lib/ares_strerror.c
index 7e301ff94f..ae94f9619e 100644
--- a/contrib/libs/c-ares/src/lib/ares_strerror.c
+++ b/contrib/libs/c-ares/src/lib/ares_strerror.c
@@ -31,37 +31,63 @@
const char *ares_strerror(int code)
{
- /* Return a string literal from a table. */
- const char *errtext[] = {
- "Successful completion",
- "DNS server returned answer with no data",
- "DNS server claims query was misformatted",
- "DNS server returned general failure",
- "Domain name not found",
- "DNS server does not implement requested operation",
- "DNS server refused query",
- "Misformatted DNS query",
- "Misformatted domain name",
- "Unsupported address family",
- "Misformatted DNS reply",
- "Could not contact DNS servers",
- "Timeout while contacting DNS servers",
- "End of file",
- "Error reading file",
- "Out of memory",
- "Channel is being destroyed",
- "Misformatted string",
- "Illegal flags specified",
- "Given hostname is not numeric",
- "Illegal hints flags specified",
- "c-ares library initialization not yet performed",
- "Error loading iphlpapi.dll",
- "Could not find GetNetworkParams function",
- "DNS query cancelled"
- };
+ ares_status_t status = (ares_status_t)code;
+ switch (status) {
+ case ARES_SUCCESS:
+ return "Successful completion";
+ case ARES_ENODATA:
+ return "DNS server returned answer with no data";
+ case ARES_EFORMERR:
+ return "DNS server claims query was misformatted";
+ case ARES_ESERVFAIL:
+ return "DNS server returned general failure";
+ case ARES_ENOTFOUND:
+ return "Domain name not found";
+ case ARES_ENOTIMP:
+ return "DNS server does not implement requested operation";
+ case ARES_EREFUSED:
+ return "DNS server refused query";
+ case ARES_EBADQUERY:
+ return "Misformatted DNS query";
+ case ARES_EBADNAME:
+ return "Misformatted domain name";
+ case ARES_EBADFAMILY:
+ return "Unsupported address family";
+ case ARES_EBADRESP:
+ return "Misformatted DNS reply";
+ case ARES_ECONNREFUSED:
+ return "Could not contact DNS servers";
+ case ARES_ETIMEOUT:
+ return "Timeout while contacting DNS servers";
+ case ARES_EOF:
+ return "End of file";
+ case ARES_EFILE:
+ return "Error reading file";
+ case ARES_ENOMEM:
+ return "Out of memory";
+ case ARES_EDESTRUCTION:
+ return "Channel is being destroyed";
+ case ARES_EBADSTR:
+ return "Misformatted string";
+ case ARES_EBADFLAGS:
+ return "Illegal flags specified";
+ case ARES_ENONAME:
+ return "Given hostname is not numeric";
+ case ARES_EBADHINTS:
+ return "Illegal hints flags specified";
+ case ARES_ENOTINITIALIZED:
+ return "c-ares library initialization not yet performed";
+ case ARES_ELOADIPHLPAPI:
+ return "Error loading iphlpapi.dll";
+ case ARES_EADDRGETNETWORKPARAMS:
+ return "Could not find GetNetworkParams function";
+ case ARES_ECANCELLED:
+ return "DNS query cancelled";
+ case ARES_ESERVICE:
+ return "Invalid service name or number";
+ case ARES_ENOSERVER:
+ return "No DNS servers were configured";
+ }
- if(code >= 0 && code < (int)(sizeof(errtext) / sizeof(*errtext)))
- return errtext[code];
- else
- return "unknown";
+ return "unknown";
}
diff --git a/contrib/libs/c-ares/src/lib/ares_strsplit.c b/contrib/libs/c-ares/src/lib/ares_strsplit.c
index 985a02dbbf..395bf1ebb9 100644
--- a/contrib/libs/c-ares/src/lib/ares_strsplit.c
+++ b/contrib/libs/c-ares/src/lib/ares_strsplit.c
@@ -25,7 +25,7 @@
*/
#if defined(__MVS__)
-#include <strings.h>
+# include <strings.h>
#endif
#include "ares_setup.h"
@@ -36,70 +36,105 @@ void ares__strsplit_free(char **elms, size_t num_elm)
{
size_t i;
- if (elms == NULL)
+ if (elms == NULL) {
return;
+ }
- for (i=0; i<num_elm; i++)
+ for (i = 0; i < num_elm; i++) {
ares_free(elms[i]);
+ }
ares_free(elms);
}
-char **ares__strsplit(const char *in, const char *delms, size_t *num_elm) {
- const char *p;
- char **table;
- void *tmp;
- size_t i, j, k, count;
+char **ares__strsplit_duplicate(char **elms, size_t num_elm)
+{
+ size_t i;
+ char **out;
- if (in == NULL || delms == NULL || num_elm == NULL)
+ if (elms == NULL || num_elm == 0) {
return NULL;
+ }
- *num_elm = 0;
+ out = ares_malloc_zero(sizeof(*elms) * num_elm);
+ if (out == NULL) {
+ return NULL;
+ }
- /* count non-empty delimited substrings */
- count = 0;
- p = in;
- do {
- i = strcspn(p, delms);
- if (i != 0) {
- /* string is non-empty */
- count++;
- p += i;
+ for (i = 0; i < num_elm; i++) {
+ out[i] = ares_strdup(elms[i]);
+ if (out[i] == NULL) {
+ ares__strsplit_free(out, num_elm);
+ return NULL;
}
- } while (*p++ != 0);
+ }
+
+ return out;
+}
- if (count == 0)
+char **ares__strsplit(const char *in, const char *delms, size_t *num_elm)
+{
+ ares_status_t status;
+ ares__buf_t *buf = NULL;
+ ares__llist_t *llist = NULL;
+ ares__llist_node_t *node;
+ char **out = NULL;
+ size_t cnt = 0;
+ size_t idx = 0;
+
+ if (in == NULL || delms == NULL || num_elm == NULL) {
return NULL;
- table = ares_malloc(count * sizeof(*table));
- if (table == NULL)
+ }
+
+ *num_elm = 0;
+
+ buf = ares__buf_create_const((const unsigned char *)in, ares_strlen(in));
+ if (buf == NULL) {
return NULL;
+ }
+
+ status = ares__buf_split(
+ buf, (const unsigned char *)delms, ares_strlen(delms),
+ ARES_BUF_SPLIT_NO_DUPLICATES | ARES_BUF_SPLIT_CASE_INSENSITIVE, 0, &llist);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ cnt = ares__llist_len(llist);
+ if (cnt == 0) {
+ status = ARES_EFORMERR;
+ goto done;
+ }
- j = 0; /* current table entry */
- /* re-calculate indices and allocate new strings for table */
- for (p = in; j < count; p += i + 1) {
- i = strcspn(p, delms);
- if (i != 0) {
- for (k = 0; k < j; k++) {
- if (strncasecmp(table[k], p, i) == 0 && table[k][i] == 0)
- break;
- }
- if (k == j) {
- /* copy unique strings only */
- table[j] = ares_malloc(i + 1);
- if (table[j] == NULL) {
- ares__strsplit_free(table, j);
- return NULL;
- }
- strncpy(table[j], p, i);
- table[j++][i] = 0;
- } else
- count--;
+
+ out = ares_malloc_zero(cnt * sizeof(*out));
+ if (out == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ for (node = ares__llist_node_first(llist); node != NULL;
+ node = ares__llist_node_next(node)) {
+ ares__buf_t *val = ares__llist_node_val(node);
+ char *temp = NULL;
+
+ status = ares__buf_fetch_str_dup(val, ares__buf_len(val), &temp);
+ if (status != ARES_SUCCESS) {
+ goto done;
}
+
+ out[idx++] = temp;
}
- tmp = ares_realloc(table, count * sizeof (*table));
- if (tmp != NULL)
- table = tmp;
+ *num_elm = cnt;
+ status = ARES_SUCCESS;
+
+done:
+ ares__llist_destroy(llist);
+ ares__buf_destroy(buf);
+ if (status != ARES_SUCCESS) {
+ ares__strsplit_free(out, cnt);
+ out = NULL;
+ }
- *num_elm = count;
- return table;
+ return out;
}
diff --git a/contrib/libs/c-ares/src/lib/ares_strsplit.h b/contrib/libs/c-ares/src/lib/ares_strsplit.h
index d3c258fec0..af650eee53 100644
--- a/contrib/libs/c-ares/src/lib/ares_strsplit.h
+++ b/contrib/libs/c-ares/src/lib/ares_strsplit.h
@@ -31,11 +31,11 @@
/* Split a string on delms skipping empty or duplicate elements.
*
* param in String to split.
- * param delms String of characters to treat as a delimitor.
- * Each character in the string is a delimitor so
- * there can be multiple delimitors to split on.
+ * param delms String of characters to treat as a delimiter.
+ * Each character in the string is a delimiter so
+ * there can be multiple delimiters to split on.
* E.g. ", " will split on all comma's and spaces.
- * Duplicate entries are removed.
+ * Duplicate (case-insensitive) entries are removed.
* param num_elm Return parameter of the number of elements
* in the result array.
*
@@ -45,8 +45,9 @@
char **ares__strsplit(const char *in, const char *delms, size_t *num_elm);
/* Frees the result returned from ares__strsplit(). */
-void ares__strsplit_free(char **elms, size_t num_elm);
+void ares__strsplit_free(char **elms, size_t num_elm);
+/* Duplicate the array */
+char **ares__strsplit_duplicate(char **elms, size_t num_elm);
#endif /* HEADER_CARES_STRSPLIT_H */
-
diff --git a/contrib/libs/c-ares/src/lib/ares_sysconfig.c b/contrib/libs/c-ares/src/lib/ares_sysconfig.c
new file mode 100644
index 0000000000..474534512a
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares_sysconfig.c
@@ -0,0 +1,1111 @@
+/* MIT License
+ *
+ * Copyright (c) 1998 Massachusetts Institute of Technology
+ * Copyright (c) 2007 Daniel Stenberg
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#include "ares_setup.h"
+
+#ifdef HAVE_SYS_PARAM_H
+# include <sys/param.h>
+#endif
+
+#ifdef HAVE_NETINET_IN_H
+# include <netinet/in.h>
+#endif
+
+#ifdef HAVE_NETDB_H
+# include <netdb.h>
+#endif
+
+#ifdef HAVE_ARPA_INET_H
+# include <arpa/inet.h>
+#endif
+
+#include "ares_nameser.h"
+
+#if defined(ANDROID) || defined(__ANDROID__)
+# include <sys/system_properties.h>
+# include "ares_android.h"
+/* From the Bionic sources */
+# define DNS_PROP_NAME_PREFIX "net.dns"
+# define MAX_DNS_PROPERTIES 8
+#endif
+
+#if defined(CARES_USE_LIBRESOLV)
+# include <resolv.h>
+#endif
+
+#if defined(USE_WINSOCK)
+# if defined(HAVE_IPHLPAPI_H)
+# include <iphlpapi.h>
+# endif
+# if defined(HAVE_NETIOAPI_H)
+# include <netioapi.h>
+# endif
+#endif
+
+#include "ares.h"
+#include "ares_inet_net_pton.h"
+#include "ares_platform.h"
+#include "ares_private.h"
+
+#ifdef WATT32
+# undef WIN32 /* Redefined in MingW/MSVC headers */
+#endif
+
+
+#ifdef WIN32
+/*
+ * get_REG_SZ()
+ *
+ * Given a 'hKey' handle to an open registry key and a 'leafKeyName' pointer
+ * to the name of the registry leaf key to be queried, fetch it's string
+ * value and return a pointer in *outptr to a newly allocated memory area
+ * holding it as a null-terminated string.
+ *
+ * Returns 0 and nullifies *outptr upon inability to return a string value.
+ *
+ * Returns 1 and sets *outptr when returning a dynamically allocated string.
+ *
+ * Supported on Windows NT 3.5 and newer.
+ */
+static ares_bool_t get_REG_SZ(HKEY hKey, const char *leafKeyName, char **outptr)
+{
+ DWORD size = 0;
+ int res;
+
+ *outptr = NULL;
+
+ /* Find out size of string stored in registry */
+ res = RegQueryValueExA(hKey, leafKeyName, 0, NULL, NULL, &size);
+ if ((res != ERROR_SUCCESS && res != ERROR_MORE_DATA) || !size) {
+ return ARES_FALSE;
+ }
+
+ /* Allocate buffer of indicated size plus one given that string
+ might have been stored without null termination */
+ *outptr = ares_malloc(size + 1);
+ if (!*outptr) {
+ return ARES_FALSE;
+ }
+
+ /* Get the value for real */
+ res = RegQueryValueExA(hKey, leafKeyName, 0, NULL, (unsigned char *)*outptr,
+ &size);
+ if ((res != ERROR_SUCCESS) || (size == 1)) {
+ ares_free(*outptr);
+ *outptr = NULL;
+ return ARES_FALSE;
+ }
+
+ /* Null terminate buffer always */
+ *(*outptr + size) = '\0';
+
+ return ARES_TRUE;
+}
+
+static void commanjoin(char **dst, const char * const src, const size_t len)
+{
+ char *newbuf;
+ size_t newsize;
+
+ /* 1 for terminating 0 and 2 for , and terminating 0 */
+ newsize = len + (*dst ? (ares_strlen(*dst) + 2) : 1);
+ newbuf = ares_realloc(*dst, newsize);
+ if (!newbuf) {
+ return;
+ }
+ if (*dst == NULL) {
+ *newbuf = '\0';
+ }
+ *dst = newbuf;
+ if (ares_strlen(*dst) != 0) {
+ strcat(*dst, ",");
+ }
+ strncat(*dst, src, len);
+}
+
+/*
+ * commajoin()
+ *
+ * RTF code.
+ */
+static void commajoin(char **dst, const char *src)
+{
+ commanjoin(dst, src, ares_strlen(src));
+}
+
+/* A structure to hold the string form of IPv4 and IPv6 addresses so we can
+ * sort them by a metric.
+ */
+typedef struct {
+ /* The metric we sort them by. */
+ ULONG metric;
+
+ /* Original index of the item, used as a secondary sort parameter to make
+ * qsort() stable if the metrics are equal */
+ size_t orig_idx;
+
+ /* Room enough for the string form of any IPv4 or IPv6 address that
+ * ares_inet_ntop() will create. Based on the existing c-ares practice.
+ */
+ char text[INET6_ADDRSTRLEN + 8 + 64]; /* [%s]:NNNNN%iface */
+} Address;
+
+/* Sort Address values \a left and \a right by metric, returning the usual
+ * indicators for qsort().
+ */
+static int compareAddresses(const void *arg1, const void *arg2)
+{
+ const Address * const left = arg1;
+ const Address * const right = arg2;
+ /* Lower metric the more preferred */
+ if (left->metric < right->metric) {
+ return -1;
+ }
+ if (left->metric > right->metric) {
+ return 1;
+ }
+ /* If metrics are equal, lower original index more preferred */
+ if (left->orig_idx < right->orig_idx) {
+ return -1;
+ }
+ if (left->orig_idx > right->orig_idx) {
+ return 1;
+ }
+ return 0;
+}
+
+/* There can be multiple routes to "the Internet". And there can be different
+ * DNS servers associated with each of the interfaces that offer those routes.
+ * We have to assume that any DNS server can serve any request. But, some DNS
+ * servers may only respond if requested over their associated interface. But
+ * we also want to use "the preferred route to the Internet" whenever possible
+ * (and not use DNS servers on a non-preferred route even by forcing request
+ * to go out on the associated non-preferred interface). i.e. We want to use
+ * the DNS servers associated with the same interface that we would use to
+ * make a general request to anything else.
+ *
+ * But, Windows won't sort the DNS servers by the metrics associated with the
+ * routes and interfaces _even_ though it obviously sends IP packets based on
+ * those same routes and metrics. So, we must do it ourselves.
+ *
+ * So, we sort the DNS servers by the same metric values used to determine how
+ * an outgoing IP packet will go, thus effectively using the DNS servers
+ * associated with the interface that the DNS requests themselves will
+ * travel. This gives us optimal routing and avoids issues where DNS servers
+ * won't respond to requests that don't arrive via some specific subnetwork
+ * (and thus some specific interface).
+ *
+ * This function computes the metric we use to sort. On the interface
+ * identified by \a luid, it determines the best route to \a dest and combines
+ * that route's metric with \a interfaceMetric to compute a metric for the
+ * destination address on that interface. This metric can be used as a weight
+ * to sort the DNS server addresses associated with each interface (lower is
+ * better).
+ *
+ * Note that by restricting the route search to the specific interface with
+ * which the DNS servers are associated, this function asks the question "What
+ * is the metric for sending IP packets to this DNS server?" which allows us
+ * to sort the DNS servers correctly.
+ */
+static ULONG getBestRouteMetric(IF_LUID * const luid, /* Can't be const :( */
+ const SOCKADDR_INET * const dest,
+ const ULONG interfaceMetric)
+{
+ /* On this interface, get the best route to that destination. */
+# if defined(__WATCOMC__)
+ /* OpenWatcom's builtin Windows SDK does not have a definition for
+ * MIB_IPFORWARD_ROW2, and also does not allow the usage of SOCKADDR_INET
+ * as a variable. Let's work around this by returning the worst possible
+ * metric, but only when using the OpenWatcom compiler.
+ * It may be worth investigating using a different version of the Windows
+ * SDK with OpenWatcom in the future, though this may be fixed in OpenWatcom
+ * 2.0.
+ */
+ return (ULONG)-1;
+# else
+ MIB_IPFORWARD_ROW2 row;
+ SOCKADDR_INET ignored;
+ if (GetBestRoute2(/* The interface to use. The index is ignored since we are
+ * passing a LUID.
+ */
+ luid, 0,
+ /* No specific source address. */
+ NULL,
+ /* Our destination address. */
+ dest,
+ /* No options. */
+ 0,
+ /* The route row. */
+ &row,
+ /* The best source address, which we don't need. */
+ &ignored) != NO_ERROR
+ /* If the metric is "unused" (-1) or too large for us to add the two
+ * metrics, use the worst possible, thus sorting this last.
+ */
+ || row.Metric == (ULONG)-1 ||
+ row.Metric > ((ULONG)-1) - interfaceMetric) {
+ /* Return the worst possible metric. */
+ return (ULONG)-1;
+ }
+
+ /* Return the metric value from that row, plus the interface metric.
+ *
+ * See
+ * http://msdn.microsoft.com/en-us/library/windows/desktop/aa814494(v=vs.85).aspx
+ * which describes the combination as a "sum".
+ */
+ return row.Metric + interfaceMetric;
+# endif /* __WATCOMC__ */
+}
+
+/*
+ * get_DNS_Windows()
+ *
+ * Locates DNS info using GetAdaptersAddresses() function from the Internet
+ * Protocol Helper (IP Helper) API. When located, this returns a pointer
+ * in *outptr to a newly allocated memory area holding a null-terminated
+ * string with a space or comma separated list of DNS IP addresses.
+ *
+ * Returns 0 and nullifies *outptr upon inability to return DNSes string.
+ *
+ * Returns 1 and sets *outptr when returning a dynamically allocated string.
+ *
+ * Implementation supports Windows XP and newer.
+ */
+# define IPAA_INITIAL_BUF_SZ 15 * 1024
+# define IPAA_MAX_TRIES 3
+
+static ares_bool_t get_DNS_Windows(char **outptr)
+{
+ IP_ADAPTER_DNS_SERVER_ADDRESS *ipaDNSAddr;
+ IP_ADAPTER_ADDRESSES *ipaa;
+ IP_ADAPTER_ADDRESSES *newipaa;
+ IP_ADAPTER_ADDRESSES *ipaaEntry;
+ ULONG ReqBufsz = IPAA_INITIAL_BUF_SZ;
+ ULONG Bufsz = IPAA_INITIAL_BUF_SZ;
+ ULONG AddrFlags = 0;
+ int trying = IPAA_MAX_TRIES;
+ ULONG res;
+
+ /* The capacity of addresses, in elements. */
+ size_t addressesSize;
+ /* The number of elements in addresses. */
+ size_t addressesIndex = 0;
+ /* The addresses we will sort. */
+ Address *addresses;
+
+ union {
+ struct sockaddr *sa;
+ struct sockaddr_in *sa4;
+ struct sockaddr_in6 *sa6;
+ } namesrvr;
+
+ *outptr = NULL;
+
+ ipaa = ares_malloc(Bufsz);
+ if (!ipaa) {
+ return ARES_FALSE;
+ }
+
+ /* Start with enough room for a few DNS server addresses and we'll grow it
+ * as we encounter more.
+ */
+ addressesSize = 4;
+ addresses = (Address *)ares_malloc(sizeof(Address) * addressesSize);
+ if (addresses == NULL) {
+ /* We need room for at least some addresses to function. */
+ ares_free(ipaa);
+ return ARES_FALSE;
+ }
+
+ /* Usually this call succeeds with initial buffer size */
+ res = GetAdaptersAddresses(AF_UNSPEC, AddrFlags, NULL, ipaa, &ReqBufsz);
+ if ((res != ERROR_BUFFER_OVERFLOW) && (res != ERROR_SUCCESS)) {
+ goto done;
+ }
+
+ while ((res == ERROR_BUFFER_OVERFLOW) && (--trying)) {
+ if (Bufsz < ReqBufsz) {
+ newipaa = ares_realloc(ipaa, ReqBufsz);
+ if (!newipaa) {
+ goto done;
+ }
+ Bufsz = ReqBufsz;
+ ipaa = newipaa;
+ }
+ res = GetAdaptersAddresses(AF_UNSPEC, AddrFlags, NULL, ipaa, &ReqBufsz);
+ if (res == ERROR_SUCCESS) {
+ break;
+ }
+ }
+ if (res != ERROR_SUCCESS) {
+ goto done;
+ }
+
+ for (ipaaEntry = ipaa; ipaaEntry; ipaaEntry = ipaaEntry->Next) {
+ if (ipaaEntry->OperStatus != IfOperStatusUp) {
+ continue;
+ }
+
+ /* For each interface, find any associated DNS servers as IPv4 or IPv6
+ * addresses. For each found address, find the best route to that DNS
+ * server address _on_ _that_ _interface_ (at this moment in time) and
+ * compute the resulting total metric, just as Windows routing will do.
+ * Then, sort all the addresses found by the metric.
+ */
+ for (ipaDNSAddr = ipaaEntry->FirstDnsServerAddress; ipaDNSAddr;
+ ipaDNSAddr = ipaDNSAddr->Next) {
+ char ipaddr[INET6_ADDRSTRLEN] = "";
+ namesrvr.sa = ipaDNSAddr->Address.lpSockaddr;
+
+ if (namesrvr.sa->sa_family == AF_INET) {
+ if ((namesrvr.sa4->sin_addr.S_un.S_addr == INADDR_ANY) ||
+ (namesrvr.sa4->sin_addr.S_un.S_addr == INADDR_NONE)) {
+ continue;
+ }
+
+ /* Allocate room for another address, if necessary, else skip. */
+ if (addressesIndex == addressesSize) {
+ const size_t newSize = addressesSize + 4;
+ Address * const newMem =
+ (Address *)ares_realloc(addresses, sizeof(Address) * newSize);
+ if (newMem == NULL) {
+ continue;
+ }
+ addresses = newMem;
+ addressesSize = newSize;
+ }
+
+ addresses[addressesIndex].metric = getBestRouteMetric(
+ &ipaaEntry->Luid, (SOCKADDR_INET *)((void *)(namesrvr.sa)),
+ ipaaEntry->Ipv4Metric);
+
+ /* Record insertion index to make qsort stable */
+ addresses[addressesIndex].orig_idx = addressesIndex;
+
+ if (!ares_inet_ntop(AF_INET, &namesrvr.sa4->sin_addr, ipaddr,
+ sizeof(ipaddr))) {
+ continue;
+ }
+ snprintf(addresses[addressesIndex].text,
+ sizeof(addresses[addressesIndex].text), "[%s]:%u", ipaddr,
+ ntohs(namesrvr.sa4->sin_port));
+ ++addressesIndex;
+ } else if (namesrvr.sa->sa_family == AF_INET6) {
+ unsigned int ll_scope = 0;
+ struct ares_addr addr;
+
+ if (memcmp(&namesrvr.sa6->sin6_addr, &ares_in6addr_any,
+ sizeof(namesrvr.sa6->sin6_addr)) == 0) {
+ continue;
+ }
+
+ /* Allocate room for another address, if necessary, else skip. */
+ if (addressesIndex == addressesSize) {
+ const size_t newSize = addressesSize + 4;
+ Address * const newMem =
+ (Address *)ares_realloc(addresses, sizeof(Address) * newSize);
+ if (newMem == NULL) {
+ continue;
+ }
+ addresses = newMem;
+ addressesSize = newSize;
+ }
+
+ /* See if its link-local */
+ memset(&addr, 0, sizeof(addr));
+ addr.family = AF_INET6;
+ memcpy(&addr.addr.addr6, &namesrvr.sa6->sin6_addr, 16);
+ if (ares__addr_is_linklocal(&addr)) {
+ ll_scope = ipaaEntry->Ipv6IfIndex;
+ }
+
+ addresses[addressesIndex].metric = getBestRouteMetric(
+ &ipaaEntry->Luid, (SOCKADDR_INET *)((void *)(namesrvr.sa)),
+ ipaaEntry->Ipv6Metric);
+
+ /* Record insertion index to make qsort stable */
+ addresses[addressesIndex].orig_idx = addressesIndex;
+
+ if (!ares_inet_ntop(AF_INET6, &namesrvr.sa6->sin6_addr, ipaddr,
+ sizeof(ipaddr))) {
+ continue;
+ }
+
+ if (ll_scope) {
+ snprintf(addresses[addressesIndex].text,
+ sizeof(addresses[addressesIndex].text), "[%s]:%u%%%u",
+ ipaddr, ntohs(namesrvr.sa6->sin6_port), ll_scope);
+ } else {
+ snprintf(addresses[addressesIndex].text,
+ sizeof(addresses[addressesIndex].text), "[%s]:%u", ipaddr,
+ ntohs(namesrvr.sa6->sin6_port));
+ }
+ ++addressesIndex;
+ } else {
+ /* Skip non-IPv4/IPv6 addresses completely. */
+ continue;
+ }
+ }
+ }
+
+ /* Sort all of the textual addresses by their metric (and original index if
+ * metrics are equal). */
+ qsort(addresses, addressesIndex, sizeof(*addresses), compareAddresses);
+
+ /* Join them all into a single string, removing duplicates. */
+ {
+ size_t i;
+ for (i = 0; i < addressesIndex; ++i) {
+ size_t j;
+ /* Look for this address text appearing previously in the results. */
+ for (j = 0; j < i; ++j) {
+ if (strcmp(addresses[j].text, addresses[i].text) == 0) {
+ break;
+ }
+ }
+ /* Iff we didn't emit this address already, emit it now. */
+ if (j == i) {
+ /* Add that to outptr (if we can). */
+ commajoin(outptr, addresses[i].text);
+ }
+ }
+ }
+
+done:
+ ares_free(addresses);
+
+ if (ipaa) {
+ ares_free(ipaa);
+ }
+
+ if (!*outptr) {
+ return ARES_FALSE;
+ }
+
+ return ARES_TRUE;
+}
+
+/*
+ * get_SuffixList_Windows()
+ *
+ * Reads the "DNS Suffix Search List" from registry and writes the list items
+ * whitespace separated to outptr. If the Search List is empty, the
+ * "Primary Dns Suffix" is written to outptr.
+ *
+ * Returns 0 and nullifies *outptr upon inability to return the suffix list.
+ *
+ * Returns 1 and sets *outptr when returning a dynamically allocated string.
+ *
+ * Implementation supports Windows Server 2003 and newer
+ */
+static ares_bool_t get_SuffixList_Windows(char **outptr)
+{
+ HKEY hKey;
+ HKEY hKeyEnum;
+ char keyName[256];
+ DWORD keyNameBuffSize;
+ DWORD keyIdx = 0;
+ char *p = NULL;
+
+ *outptr = NULL;
+
+ if (ares__getplatform() != WIN_NT) {
+ return ARES_FALSE;
+ }
+
+ /* 1. Global DNS Suffix Search List */
+ if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0, KEY_READ, &hKey) ==
+ ERROR_SUCCESS) {
+ get_REG_SZ(hKey, SEARCHLIST_KEY, outptr);
+ if (get_REG_SZ(hKey, DOMAIN_KEY, &p)) {
+ commajoin(outptr, p);
+ ares_free(p);
+ p = NULL;
+ }
+ RegCloseKey(hKey);
+ }
+
+ if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_NT_DNSCLIENT, 0, KEY_READ, &hKey) ==
+ ERROR_SUCCESS) {
+ if (get_REG_SZ(hKey, SEARCHLIST_KEY, &p)) {
+ commajoin(outptr, p);
+ ares_free(p);
+ p = NULL;
+ }
+ RegCloseKey(hKey);
+ }
+
+ /* 2. Connection Specific Search List composed of:
+ * a. Primary DNS Suffix */
+ if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_DNSCLIENT, 0, KEY_READ, &hKey) ==
+ ERROR_SUCCESS) {
+ if (get_REG_SZ(hKey, PRIMARYDNSSUFFIX_KEY, &p)) {
+ commajoin(outptr, p);
+ ares_free(p);
+ p = NULL;
+ }
+ RegCloseKey(hKey);
+ }
+
+ /* b. Interface SearchList, Domain, DhcpDomain */
+ if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY "\\" INTERFACES_KEY, 0,
+ KEY_READ, &hKey) == ERROR_SUCCESS) {
+ for (;;) {
+ keyNameBuffSize = sizeof(keyName);
+ if (RegEnumKeyExA(hKey, keyIdx++, keyName, &keyNameBuffSize, 0, NULL,
+ NULL, NULL) != ERROR_SUCCESS) {
+ break;
+ }
+ if (RegOpenKeyExA(hKey, keyName, 0, KEY_QUERY_VALUE, &hKeyEnum) !=
+ ERROR_SUCCESS) {
+ continue;
+ }
+ /* p can be comma separated (SearchList) */
+ if (get_REG_SZ(hKeyEnum, SEARCHLIST_KEY, &p)) {
+ commajoin(outptr, p);
+ ares_free(p);
+ p = NULL;
+ }
+ if (get_REG_SZ(hKeyEnum, DOMAIN_KEY, &p)) {
+ commajoin(outptr, p);
+ ares_free(p);
+ p = NULL;
+ }
+ if (get_REG_SZ(hKeyEnum, DHCPDOMAIN_KEY, &p)) {
+ commajoin(outptr, p);
+ ares_free(p);
+ p = NULL;
+ }
+ RegCloseKey(hKeyEnum);
+ }
+ RegCloseKey(hKey);
+ }
+
+ return *outptr != NULL ? ARES_TRUE : ARES_FALSE;
+}
+
+static ares_status_t ares__init_sysconfig_windows(ares_sysconfig_t *sysconfig)
+{
+ char *line = NULL;
+ ares_status_t status = ARES_SUCCESS;
+
+ if (get_DNS_Windows(&line)) {
+ status = ares__sconfig_append_fromstr(&sysconfig->sconfig, line, ARES_TRUE);
+ ares_free(line);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+
+ if (get_SuffixList_Windows(&line)) {
+ sysconfig->domains = ares__strsplit(line, ", ", &sysconfig->ndomains);
+ ares_free(line);
+ if (sysconfig->domains == NULL) {
+ status = ARES_EFILE;
+ }
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+
+done:
+ return status;
+}
+#endif
+
+#if defined(__MVS__)
+static ares_status_t ares__init_sysconfig_mvs(ares_sysconfig_t *sysconfig)
+{
+ struct __res_state *res = 0;
+ size_t count4;
+ size_t count6;
+ int i;
+ __STATEEXTIPV6 *v6;
+ arse__llist_t *sconfig = NULL;
+ ares_status_t status;
+
+ if (0 == res) {
+ int rc = res_init();
+ while (rc == -1 && h_errno == TRY_AGAIN) {
+ rc = res_init();
+ }
+ if (rc == -1) {
+ return ARES_ENOMEM;
+ }
+ res = __res();
+ }
+
+ v6 = res->__res_extIPv6;
+ if (res->nscount > 0) {
+ count4 = (size_t)res->nscount;
+ }
+
+ if (v6 && v6->__stat_nscount > 0) {
+ count6 = (size_t)v6->__stat_nscount;
+ } else {
+ count6 = 0;
+ }
+
+ for (i = 0; i < count4; i++) {
+ struct sockaddr_in *addr_in = &(res->nsaddr_list[i]);
+ struct ares_addr addr;
+
+ addr.addr.addr4.s_addr = addr_in->sin_addr.s_addr;
+ addr.family = AF_INET;
+
+ status =
+ ares__sconfig_append(&sysconfig->sconfig, &addr, htons(addr_in->sin_port),
+ htons(addr_in->sin_port), NULL);
+
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+
+ for (i = 0; i < count6; i++) {
+ struct sockaddr_in6 *addr_in = &(v6->__stat_nsaddr_list[i]);
+ struct ares_addr addr;
+
+ addr.family = AF_INET6;
+ memcpy(&(addr.addr.addr6), &(addr_in->sin6_addr),
+ sizeof(addr_in->sin6_addr));
+
+ status =
+ ares__sconfig_append(&sysconfig->sconfig, &addr, htons(addr_in->sin_port),
+ htons(addr_in->sin_port), NULL);
+
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+
+ return ARES_SUCCESS;
+}
+#endif
+
+#if defined(__riscos__)
+static ares_status_t ares__init_sysconfig_riscos(ares_sysconfig_t *sysconfig)
+{
+ char *line;
+ ares_status_t status = ARES_SUCCESS;
+
+ /* Under RISC OS, name servers are listed in the
+ system variable Inet$Resolvers, space separated. */
+ line = getenv("Inet$Resolvers");
+ if (line) {
+ char *resolvers = ares_strdup(line);
+ char *pos;
+ char *space;
+
+ if (!resolvers) {
+ return ARES_ENOMEM;
+ }
+
+ pos = resolvers;
+ do {
+ space = strchr(pos, ' ');
+ if (space) {
+ *space = '\0';
+ }
+ status =
+ ares__sconfig_append_fromstr(&sysconfig->sconfig, pos, ARES_TRUE);
+ if (status != ARES_SUCCESS) {
+ break;
+ }
+ pos = space + 1;
+ } while (space);
+
+ ares_free(resolvers);
+ }
+
+ return status;
+}
+#endif
+
+#if defined(WATT32)
+static ares_status_t ares__init_sysconfig_watt32(ares_sysconfig_t *sysconfig)
+{
+ size_t i;
+ ares_status_t status;
+
+ sock_init();
+
+ for (i = 0; def_nameservers[i]; i++) {
+ struct ares_addr addr;
+
+ addr.family = AF_INET;
+ addr.addr.addr4.s_addr = htonl(def_nameservers[i]);
+
+ status = ares__sconfig_append(&sysconfig->sconfig, &addr, 0, 0, NULL);
+
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+
+ return ARES_SUCCESS;
+}
+#endif
+
+#if defined(ANDROID) || defined(__ANDROID__)
+static ares_status_t ares__init_sysconfig_android(ares_sysconfig_t *sysconfig)
+{
+ size_t i;
+ char **dns_servers;
+ char *domains;
+ size_t num_servers;
+ ares_status_t status = ARES_EFILE;
+
+ /* Use the Android connectivity manager to get a list
+ * of DNS servers. As of Android 8 (Oreo) net.dns#
+ * system properties are no longer available. Google claims this
+ * improves privacy. Apps now need the ACCESS_NETWORK_STATE
+ * permission and must use the ConnectivityManager which
+ * is Java only. */
+ dns_servers = ares_get_android_server_list(MAX_DNS_PROPERTIES, &num_servers);
+ if (dns_servers != NULL) {
+ for (i = 0; i < num_servers; i++) {
+ status = ares__sconfig_append_fromstr(&sysconfig->sconfig, dns_servers[i],
+ ARES_TRUE);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+ for (i = 0; i < num_servers; i++) {
+ ares_free(dns_servers[i]);
+ }
+ ares_free(dns_servers);
+ }
+
+ domains = ares_get_android_search_domains_list();
+ sysconfig->domains = ares__strsplit(domains, ", ", &sysconfig->ndomains);
+ ares_free(domains);
+
+# ifdef HAVE___SYSTEM_PROPERTY_GET
+ /* Old way using the system property still in place as
+ * a fallback. Older android versions can still use this.
+ * it's possible for older apps not not have added the new
+ * permission and we want to try to avoid breaking those.
+ *
+ * We'll only run this if we don't have any dns servers
+ * because this will get the same ones (if it works). */
+ if (sysconfig->sconfig == NULL) {
+ char propname[PROP_NAME_MAX];
+ char propvalue[PROP_VALUE_MAX] = "";
+ for (i = 1; i <= MAX_DNS_PROPERTIES; i++) {
+ snprintf(propname, sizeof(propname), "%s%u", DNS_PROP_NAME_PREFIX, i);
+ if (__system_property_get(propname, propvalue) < 1) {
+ break;
+ }
+ status =
+ ares__sconfig_append_fromstr(&sysconfig->sconfig, propvalue, ARES_TRUE);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+ }
+# endif /* HAVE___SYSTEM_PROPERTY_GET */
+
+ return status;
+}
+#endif
+
+#if defined(CARES_USE_LIBRESOLV)
+static ares_status_t ares__init_sysconfig_libresolv(ares_sysconfig_t *sysconfig)
+{
+ struct __res_state res;
+ ares_status_t status = ARES_SUCCESS;
+ union res_sockaddr_union addr[MAXNS];
+ int nscount;
+ size_t i;
+ size_t entries = 0;
+ ares__buf_t *ipbuf = NULL;
+
+ memset(&res, 0, sizeof(res));
+
+ if (res_ninit(&res) != 0 || !(res.options & RES_INIT)) {
+ return ARES_EFILE;
+ }
+
+ nscount = res_getservers(&res, addr, MAXNS);
+
+ for (i = 0; i < (size_t)nscount; ++i) {
+ char ipaddr[INET6_ADDRSTRLEN] = "";
+ char *ipstr = NULL;
+ unsigned short port = 0;
+ unsigned int ll_scope = 0;
+
+ sa_family_t family = addr[i].sin.sin_family;
+ if (family == AF_INET) {
+ ares_inet_ntop(family, &addr[i].sin.sin_addr, ipaddr, sizeof(ipaddr));
+ port = ntohs(addr[i].sin.sin_port);
+ } else if (family == AF_INET6) {
+ ares_inet_ntop(family, &addr[i].sin6.sin6_addr, ipaddr, sizeof(ipaddr));
+ port = ntohs(addr[i].sin6.sin6_port);
+ ll_scope = addr[i].sin6.sin6_scope_id;
+ } else {
+ continue;
+ }
+
+
+ /* [ip]:port%iface */
+ ipbuf = ares__buf_create();
+ if (ipbuf == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ status = ares__buf_append_str(ipbuf, "[");
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ status = ares__buf_append_str(ipbuf, ipaddr);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ status = ares__buf_append_str(ipbuf, "]");
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ if (port) {
+ status = ares__buf_append_str(ipbuf, ":");
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ status = ares__buf_append_num_dec(ipbuf, port, 0);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+
+ if (ll_scope) {
+ status = ares__buf_append_str(ipbuf, "%");
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ status = ares__buf_append_num_dec(ipbuf, ll_scope, 0);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+
+ ipstr = ares__buf_finish_str(ipbuf, NULL);
+ ipbuf = NULL;
+ if (ipstr == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ status =
+ ares__sconfig_append_fromstr(&sysconfig->sconfig, ipstr, ARES_TRUE);
+
+ ares_free(ipstr);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+
+ while ((entries < MAXDNSRCH) && res.dnsrch[entries]) {
+ entries++;
+ }
+
+ if (entries) {
+ sysconfig->domains = ares_malloc_zero(entries * sizeof(char *));
+ if (sysconfig->domains == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ } else {
+ sysconfig->ndomains = entries;
+ for (i = 0; i < sysconfig->ndomains; i++) {
+ sysconfig->domains[i] = ares_strdup(res.dnsrch[i]);
+ if (sysconfig->domains[i] == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ }
+ }
+ }
+
+ if (res.ndots >= 0) {
+ sysconfig->ndots = (size_t)res.ndots;
+ }
+ if (res.retry > 0) {
+ sysconfig->tries = (size_t)res.retry;
+ }
+ if (res.options & RES_ROTATE) {
+ sysconfig->rotate = ARES_TRUE;
+ }
+
+ if (res.retrans > 0) {
+ if (res.retrans > 0) {
+ sysconfig->timeout_ms = (unsigned int)res.retrans * 1000;
+ }
+# ifdef __APPLE__
+ if (res.retry >= 0) {
+ sysconfig->timeout_ms /=
+ ((unsigned int)res.retry + 1) *
+ (unsigned int)(res.nscount > 0 ? res.nscount : 1);
+ }
+# endif
+ }
+
+done:
+ ares__buf_destroy(ipbuf);
+ res_ndestroy(&res);
+ return status;
+}
+#endif
+
+static void ares_sysconfig_free(ares_sysconfig_t *sysconfig)
+{
+ ares__llist_destroy(sysconfig->sconfig);
+ ares__strsplit_free(sysconfig->domains, sysconfig->ndomains);
+ ares_free(sysconfig->sortlist);
+ ares_free(sysconfig->lookups);
+ memset(sysconfig, 0, sizeof(*sysconfig));
+}
+
+static ares_status_t ares_sysconfig_apply(ares_channel_t *channel,
+ const ares_sysconfig_t *sysconfig)
+{
+ ares_status_t status;
+
+ if (sysconfig->sconfig && !(channel->optmask & ARES_OPT_SERVERS)) {
+ status = ares__servers_update(channel, sysconfig->sconfig, ARES_FALSE);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+
+ if (sysconfig->domains && !(channel->optmask & ARES_OPT_DOMAINS)) {
+ /* Make sure we duplicate first then replace so even if there is
+ * ARES_ENOMEM, the channel stays in a good state */
+ char **temp =
+ ares__strsplit_duplicate(sysconfig->domains, sysconfig->ndomains);
+ if (temp == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ ares__strsplit_free(channel->domains, channel->ndomains);
+ channel->domains = temp;
+ channel->ndomains = sysconfig->ndomains;
+ }
+
+ if (sysconfig->lookups && !(channel->optmask & ARES_OPT_LOOKUPS)) {
+ char *temp = ares_strdup(sysconfig->lookups);
+ if (temp == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ ares_free(channel->lookups);
+ channel->lookups = temp;
+ }
+
+ if (sysconfig->sortlist && !(channel->optmask & ARES_OPT_SORTLIST)) {
+ struct apattern *temp =
+ ares_malloc(sizeof(*channel->sortlist) * sysconfig->nsortlist);
+ if (temp == NULL) {
+ return ARES_ENOMEM;
+ }
+ memcpy(temp, sysconfig->sortlist,
+ sizeof(*channel->sortlist) * sysconfig->nsortlist);
+
+ ares_free(channel->sortlist);
+ channel->sortlist = temp;
+ channel->nsort = sysconfig->nsortlist;
+ }
+
+ if (sysconfig->ndots && !(channel->optmask & ARES_OPT_NDOTS)) {
+ channel->ndots = sysconfig->ndots;
+ }
+
+ if (sysconfig->tries && !(channel->optmask & ARES_OPT_TRIES)) {
+ channel->tries = sysconfig->tries;
+ }
+
+ if (sysconfig->timeout_ms && !(channel->optmask & ARES_OPT_TIMEOUTMS)) {
+ channel->timeout = sysconfig->timeout_ms;
+ }
+
+ if (!(channel->optmask & (ARES_OPT_ROTATE | ARES_OPT_NOROTATE))) {
+ channel->rotate = sysconfig->rotate;
+ }
+
+ if (sysconfig->usevc) {
+ channel->flags |= ARES_FLAG_USEVC;
+ }
+
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares__init_by_sysconfig(ares_channel_t *channel)
+{
+ ares_status_t status;
+ ares_sysconfig_t sysconfig;
+
+ memset(&sysconfig, 0, sizeof(sysconfig));
+
+#ifdef _WIN32
+ status = ares__init_sysconfig_windows(&sysconfig);
+#elif defined(__MVS__)
+ status = ares__init_sysconfig_mvs(&sysconfig);
+#elif defined(__riscos__)
+ status = ares__init_sysconfig_riscos(&sysconfig);
+#elif defined(WATT32)
+ status = ares__init_sysconfig_watt32(&sysconfig);
+#elif defined(ANDROID) || defined(__ANDROID__)
+ status = ares__init_sysconfig_android(&sysconfig);
+#elif defined(CARES_USE_LIBRESOLV)
+ status = ares__init_sysconfig_libresolv(&sysconfig);
+#else
+ status = ares__init_sysconfig_files(channel, &sysconfig);
+#endif
+
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ /* Environment is supposed to override sysconfig */
+ status = ares__init_by_environment(&sysconfig);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ status = ares_sysconfig_apply(channel, &sysconfig);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+done:
+ ares_sysconfig_free(&sysconfig);
+
+ return status;
+}
diff --git a/contrib/libs/c-ares/src/lib/ares_sysconfig_files.c b/contrib/libs/c-ares/src/lib/ares_sysconfig_files.c
new file mode 100644
index 0000000000..557888bc74
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares_sysconfig_files.c
@@ -0,0 +1,811 @@
+/* MIT License
+ *
+ * Copyright (c) 1998 Massachusetts Institute of Technology
+ * Copyright (c) 2007 Daniel Stenberg
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#include "ares_setup.h"
+
+#ifdef HAVE_SYS_PARAM_H
+# include <sys/param.h>
+#endif
+
+#ifdef HAVE_NETINET_IN_H
+# include <netinet/in.h>
+#endif
+
+#ifdef HAVE_NETDB_H
+# include <netdb.h>
+#endif
+
+#ifdef HAVE_ARPA_INET_H
+# include <arpa/inet.h>
+#endif
+
+#include "ares_nameser.h"
+
+#if defined(ANDROID) || defined(__ANDROID__)
+# include <sys/system_properties.h>
+# include "ares_android.h"
+/* From the Bionic sources */
+# define DNS_PROP_NAME_PREFIX "net.dns"
+# define MAX_DNS_PROPERTIES 8
+#endif
+
+#if defined(CARES_USE_LIBRESOLV)
+# include <resolv.h>
+#endif
+
+#if defined(USE_WINSOCK) && defined(HAVE_IPHLPAPI_H)
+# include <iphlpapi.h>
+#endif
+
+#include "ares.h"
+#include "ares_inet_net_pton.h"
+#include "ares_platform.h"
+#include "ares_private.h"
+
+static unsigned char ip_natural_mask(const struct ares_addr *addr)
+{
+ const unsigned char *ptr = NULL;
+ /* This is an odd one. If a raw ipv4 address is specified, then we take
+ * what is called a natural mask, which means we look at the first octet
+ * of the ip address and for values 0-127 we assume it is a class A (/8),
+ * for values 128-191 we assume it is a class B (/16), and for 192-223
+ * we assume it is a class C (/24). 223-239 is Class D which and 240-255 is
+ * Class E, however, there is no pre-defined mask for this, so we'll use
+ * /24 as well as that's what the old code did.
+ *
+ * For IPv6, we'll use /64.
+ */
+
+ if (addr->family == AF_INET6) {
+ return 64;
+ }
+
+ ptr = (const unsigned char *)&addr->addr.addr4;
+ if (*ptr < 128) {
+ return 8;
+ }
+
+ if (*ptr < 192) {
+ return 16;
+ }
+
+ return 24;
+}
+
+static ares_bool_t sortlist_append(struct apattern **sortlist, size_t *nsort,
+ const struct apattern *pat)
+{
+ struct apattern *newsort;
+
+ newsort = ares_realloc(*sortlist, (*nsort + 1) * sizeof(*newsort));
+ if (newsort == NULL) {
+ return ARES_FALSE;
+ }
+
+ *sortlist = newsort;
+
+ memcpy(&(*sortlist)[*nsort], pat, sizeof(**sortlist));
+ (*nsort)++;
+
+ return ARES_TRUE;
+}
+
+static ares_status_t parse_sort(ares__buf_t *buf, struct apattern *pat)
+{
+ ares_status_t status;
+ const unsigned char ip_charset[] = "ABCDEFabcdef0123456789.:";
+ char ipaddr[INET6_ADDRSTRLEN] = "";
+ size_t addrlen;
+
+ memset(pat, 0, sizeof(*pat));
+
+ /* Consume any leading whitespace */
+ ares__buf_consume_whitespace(buf, ARES_TRUE);
+
+ /* If no length, just ignore, return ENOTFOUND as an indicator */
+ if (ares__buf_len(buf) == 0) {
+ return ARES_ENOTFOUND;
+ }
+
+ ares__buf_tag(buf);
+
+ /* Consume ip address */
+ if (ares__buf_consume_charset(buf, ip_charset, sizeof(ip_charset) - 1) == 0) {
+ return ARES_EBADSTR;
+ }
+
+ /* Fetch ip address */
+ status = ares__buf_tag_fetch_string(buf, ipaddr, sizeof(ipaddr));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Parse it to make sure its valid */
+ pat->addr.family = AF_UNSPEC;
+ if (ares_dns_pton(ipaddr, &pat->addr, &addrlen) == NULL) {
+ return ARES_EBADSTR;
+ }
+
+ /* See if there is a subnet mask */
+ if (ares__buf_begins_with(buf, (const unsigned char *)"/", 1)) {
+ char maskstr[16];
+ const unsigned char ipv4_charset[] = "0123456789.";
+
+
+ /* Consume / */
+ ares__buf_consume(buf, 1);
+
+ ares__buf_tag(buf);
+
+ /* Consume mask */
+ if (ares__buf_consume_charset(buf, ipv4_charset,
+ sizeof(ipv4_charset) - 1) == 0) {
+ return ARES_EBADSTR;
+ }
+
+ /* Fetch mask */
+ status = ares__buf_tag_fetch_string(buf, maskstr, sizeof(maskstr));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ if (ares_str_isnum(maskstr)) {
+ /* Numeric mask */
+ int mask = atoi(maskstr);
+ if (mask < 0 || mask > 128) {
+ return ARES_EBADSTR;
+ }
+ if (pat->addr.family == AF_INET && mask > 32) {
+ return ARES_EBADSTR;
+ }
+ pat->mask = (unsigned char)mask;
+ } else {
+ /* Ipv4 subnet style mask */
+ struct ares_addr maskaddr;
+ const unsigned char *ptr;
+
+ memset(&maskaddr, 0, sizeof(maskaddr));
+ maskaddr.family = AF_INET;
+ if (ares_dns_pton(maskstr, &maskaddr, &addrlen) == NULL) {
+ return ARES_EBADSTR;
+ }
+ ptr = (const unsigned char *)&maskaddr.addr.addr4;
+ pat->mask = (unsigned char)(ares__count_bits_u8(ptr[0]) +
+ ares__count_bits_u8(ptr[1]) +
+ ares__count_bits_u8(ptr[2]) +
+ ares__count_bits_u8(ptr[3]));
+ }
+ } else {
+ pat->mask = ip_natural_mask(&pat->addr);
+ }
+
+ /* Consume any trailing whitespace */
+ ares__buf_consume_whitespace(buf, ARES_TRUE);
+
+ /* If we have any trailing bytes other than whitespace, its a parse failure */
+ if (ares__buf_len(buf) != 0) {
+ return ARES_EBADSTR;
+ }
+
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares__parse_sortlist(struct apattern **sortlist, size_t *nsort,
+ const char *str)
+{
+ ares__buf_t *buf = NULL;
+ ares__llist_t *list = NULL;
+ ares_status_t status = ARES_SUCCESS;
+ ares__llist_node_t *node = NULL;
+
+ if (sortlist == NULL || nsort == NULL || str == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ if (*sortlist != NULL) {
+ ares_free(*sortlist);
+ }
+
+ *sortlist = NULL;
+ *nsort = 0;
+
+ buf = ares__buf_create_const((const unsigned char *)str, ares_strlen(str));
+ if (buf == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ /* Split on space or semicolon */
+ status = ares__buf_split(buf, (const unsigned char *)" ;", 2,
+ ARES_BUF_SPLIT_NONE, 0, &list);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ for (node = ares__llist_node_first(list); node != NULL;
+ node = ares__llist_node_next(node)) {
+ ares__buf_t *entry = ares__llist_node_val(node);
+
+ struct apattern pat;
+
+ status = parse_sort(entry, &pat);
+ if (status != ARES_SUCCESS && status != ARES_ENOTFOUND) {
+ goto done;
+ }
+
+ if (status != ARES_SUCCESS) {
+ continue;
+ }
+
+ if (!sortlist_append(sortlist, nsort, &pat)) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ }
+
+ status = ARES_SUCCESS;
+
+done:
+ ares__buf_destroy(buf);
+ ares__llist_destroy(list);
+
+ if (status != ARES_SUCCESS) {
+ ares_free(*sortlist);
+ *sortlist = NULL;
+ *nsort = 0;
+ }
+
+ return status;
+}
+
+static ares_status_t config_search(ares_sysconfig_t *sysconfig, const char *str,
+ size_t max_domains)
+{
+ if (sysconfig->domains && sysconfig->ndomains > 0) {
+ /* if we already have some domains present, free them first */
+ ares__strsplit_free(sysconfig->domains, sysconfig->ndomains);
+ sysconfig->domains = NULL;
+ sysconfig->ndomains = 0;
+ }
+
+ sysconfig->domains = ares__strsplit(str, ", ", &sysconfig->ndomains);
+ if (sysconfig->domains == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ /* Truncate if necessary */
+ if (max_domains && sysconfig->ndomains > max_domains) {
+ size_t i;
+ for (i = max_domains; i < sysconfig->ndomains; i++) {
+ ares_free(sysconfig->domains[i]);
+ sysconfig->domains[i] = NULL;
+ }
+ sysconfig->ndomains = max_domains;
+ }
+
+ return ARES_SUCCESS;
+}
+
+static ares_status_t buf_fetch_string(ares__buf_t *buf, char *str,
+ size_t str_len)
+{
+ ares_status_t status;
+ ares__buf_tag(buf);
+ ares__buf_consume(buf, ares__buf_len(buf));
+
+ status = ares__buf_tag_fetch_string(buf, str, str_len);
+ return status;
+}
+
+static ares_status_t config_lookup(ares_sysconfig_t *sysconfig,
+ ares__buf_t *buf, const char *separators)
+{
+ ares_status_t status;
+ char lookupstr[32];
+ size_t lookupstr_cnt = 0;
+ ares__llist_t *lookups = NULL;
+ ares__llist_node_t *node;
+ size_t separators_len = ares_strlen(separators);
+
+ status = ares__buf_split(buf, (const unsigned char *)separators,
+ separators_len, ARES_BUF_SPLIT_TRIM, 0, &lookups);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ memset(lookupstr, 0, sizeof(lookupstr));
+
+ for (node = ares__llist_node_first(lookups); node != NULL;
+ node = ares__llist_node_next(node)) {
+ char value[128];
+ char ch;
+ ares__buf_t *valbuf = ares__llist_node_val(node);
+
+ status = buf_fetch_string(valbuf, value, sizeof(value));
+ if (status != ARES_SUCCESS) {
+ continue;
+ }
+
+ if (strcasecmp(value, "dns") == 0 || strcasecmp(value, "bind") == 0 ||
+ strcasecmp(value, "resolv") == 0 || strcasecmp(value, "resolve") == 0) {
+ ch = 'b';
+ } else if (strcasecmp(value, "files") == 0 ||
+ strcasecmp(value, "file") == 0 ||
+ strcasecmp(value, "local") == 0) {
+ ch = 'f';
+ } else {
+ continue;
+ }
+
+ /* Look for a duplicate and ignore */
+ if (memchr(lookupstr, ch, lookupstr_cnt) == NULL) {
+ lookupstr[lookupstr_cnt++] = ch;
+ }
+ }
+
+ if (lookupstr_cnt) {
+ ares_free(sysconfig->lookups);
+ sysconfig->lookups = ares_strdup(lookupstr);
+ if (sysconfig->lookups == NULL) {
+ return ARES_ENOMEM;
+ }
+ }
+
+ status = ARES_SUCCESS;
+
+done:
+ if (status != ARES_ENOMEM) {
+ status = ARES_SUCCESS;
+ }
+ ares__llist_destroy(lookups);
+ return status;
+}
+
+static ares_status_t process_option(ares_sysconfig_t *sysconfig,
+ ares__buf_t *option)
+{
+ ares__llist_t *kv = NULL;
+ char key[32] = "";
+ char val[32] = "";
+ unsigned int valint = 0;
+ ares_status_t status;
+
+ /* Split on : */
+ status = ares__buf_split(option, (const unsigned char *)":", 1,
+ ARES_BUF_SPLIT_TRIM, 2, &kv);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ status = buf_fetch_string(ares__llist_first_val(kv), key, sizeof(key));
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ if (ares__llist_len(kv) == 2) {
+ status = buf_fetch_string(ares__llist_last_val(kv), val, sizeof(val));
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ valint = (unsigned int)strtoul(val, NULL, 10);
+ }
+
+ if (strcmp(key, "ndots") == 0) {
+ sysconfig->ndots = valint;
+ } else if (strcmp(key, "retrans") == 0 || strcmp(key, "timeout") == 0) {
+ if (valint == 0) {
+ return ARES_EFORMERR;
+ }
+ sysconfig->timeout_ms = valint * 1000;
+ } else if (strcmp(key, "retry") == 0 || strcmp(key, "attempts") == 0) {
+ if (valint == 0) {
+ return ARES_EFORMERR;
+ }
+ sysconfig->tries = valint;
+ } else if (strcmp(key, "rotate") == 0) {
+ sysconfig->rotate = ARES_TRUE;
+ } else if (strcmp(key, "use-vc") == 0 || strcmp(key, "usevc") == 0) {
+ sysconfig->usevc = ARES_TRUE;
+ }
+
+done:
+ ares__llist_destroy(kv);
+ return status;
+}
+
+static ares_status_t set_options(ares_sysconfig_t *sysconfig, const char *str)
+{
+ ares__buf_t *buf = NULL;
+ ares__llist_t *options = NULL;
+ ares_status_t status;
+ ares__llist_node_t *node;
+
+ buf = ares__buf_create_const((const unsigned char *)str, ares_strlen(str));
+ if (buf == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ status = ares__buf_split(buf, (const unsigned char *)" \t", 2,
+ ARES_BUF_SPLIT_TRIM, 0, &options);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ for (node = ares__llist_node_first(options); node != NULL;
+ node = ares__llist_node_next(node)) {
+ ares__buf_t *valbuf = ares__llist_node_val(node);
+
+ status = process_option(sysconfig, valbuf);
+ /* Out of memory is the only fatal condition */
+ if (status == ARES_ENOMEM) {
+ goto done;
+ }
+ }
+
+ status = ARES_SUCCESS;
+
+done:
+ ares__llist_destroy(options);
+ ares__buf_destroy(buf);
+ return status;
+}
+
+ares_status_t ares__init_by_environment(ares_sysconfig_t *sysconfig)
+{
+ const char *localdomain;
+ const char *res_options;
+ ares_status_t status;
+
+ localdomain = getenv("LOCALDOMAIN");
+ if (localdomain) {
+ char *temp = ares_strdup(localdomain);
+ if (temp == NULL) {
+ return ARES_ENOMEM;
+ }
+ status = config_search(sysconfig, temp, 1);
+ ares_free(temp);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+
+ res_options = getenv("RES_OPTIONS");
+ if (res_options) {
+ status = set_options(sysconfig, res_options);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+
+ return ARES_SUCCESS;
+}
+
+/* Configuration Files:
+ * /etc/resolv.conf
+ * - All Unix-like systems
+ * - Comments start with ; or #
+ * - Lines have a keyword followed by a value that is interpreted specific
+ * to the keyword:
+ * - Keywords:
+ * - nameserver - IP address of nameserver with optional port (using a :
+ * prefix). If using an ipv6 address and specifying a port, the ipv6
+ * address must be encapsulated in brackets. For link-local ipv6
+ * addresses, the interface can also be specified with a % prefix. e.g.:
+ * "nameserver [fe80::1]:1234%iface"
+ * This keyword may be specified multiple times.
+ * - search - whitespace separated list of domains
+ * - domain - obsolete, same as search except only a single domain
+ * - lookup / hostresorder - local, bind, file, files
+ * - sortlist - whitespace separated ip-address/netmask pairs
+ * - options - options controlling resolver variables
+ * - ndots:n - set ndots option
+ * - timeout:n (retrans:n) - timeout per query attempt in seconds
+ * - attempts:n (retry:n) - number of times resolver will send query
+ * - rotate - round-robin selection of name servers
+ * - use-vc / usevc - force tcp
+ * /etc/nsswitch.conf
+ * - Modern Linux, FreeBSD, HP-UX, Solaris
+ * - Search order set via:
+ * "hosts: files dns mdns4_minimal mdns4"
+ * - files is /etc/hosts
+ * - dns is dns
+ * - mdns4_minimal does mdns only if ending in .local
+ * - mdns4 does not limit to domains ending in .local
+ * /etc/netsvc.conf
+ * - AIX
+ * - Search order set via:
+ * "hosts = local , bind"
+ * - bind is dns
+ * - local is /etc/hosts
+ * /etc/svc.conf
+ * - Tru64
+ * - Same format as /etc/netsvc.conf
+ * /etc/host.conf
+ * - Early FreeBSD, Early Linux
+ * - Not worth supporting, format varied based on system, FreeBSD used
+ * just a line per search order, Linux used "order " and a comma
+ * delimited list of "bind" and "hosts"
+ */
+
+
+/* This function will only return ARES_SUCCESS or ARES_ENOMEM. Any other
+ * conditions are ignored. Users may mess up config files, but we want to
+ * process anything we can. */
+static ares_status_t parse_resolvconf_line(ares_sysconfig_t *sysconfig,
+ ares__buf_t *line)
+{
+ char option[32];
+ char value[512];
+ ares_status_t status = ARES_SUCCESS;
+
+ /* Ignore lines beginning with a comment */
+ if (ares__buf_begins_with(line, (const unsigned char *)"#", 1) ||
+ ares__buf_begins_with(line, (const unsigned char *)";", 1)) {
+ return ARES_SUCCESS;
+ }
+
+ ares__buf_tag(line);
+
+ /* Shouldn't be possible, but if it happens, ignore the line. */
+ if (ares__buf_consume_nonwhitespace(line) == 0) {
+ return ARES_SUCCESS;
+ }
+
+ status = ares__buf_tag_fetch_string(line, option, sizeof(option));
+ if (status != ARES_SUCCESS) {
+ return ARES_SUCCESS;
+ }
+
+ ares__buf_consume_whitespace(line, ARES_TRUE);
+
+ status = buf_fetch_string(line, value, sizeof(value));
+ if (status != ARES_SUCCESS) {
+ return ARES_SUCCESS;
+ }
+
+ ares__str_trim(value);
+ if (*value == 0) {
+ return ARES_SUCCESS;
+ }
+
+ /* At this point we have a string option and a string value, both trimmed
+ * of leading and trailing whitespace. Lets try to evaluate them */
+ if (strcmp(option, "domain") == 0) {
+ /* Domain is legacy, don't overwrite an existing config set by search */
+ if (sysconfig->domains == NULL) {
+ status = config_search(sysconfig, value, 1);
+ }
+ } else if (strcmp(option, "lookup") == 0 ||
+ strcmp(option, "hostresorder") == 0) {
+ ares__buf_tag_rollback(line);
+ status = config_lookup(sysconfig, line, " \t");
+ } else if (strcmp(option, "search") == 0) {
+ status = config_search(sysconfig, value, 0);
+ } else if (strcmp(option, "nameserver") == 0) {
+ status =
+ ares__sconfig_append_fromstr(&sysconfig->sconfig, value, ARES_TRUE);
+ } else if (strcmp(option, "sortlist") == 0) {
+ /* Ignore all failures except ENOMEM. If the sysadmin set a bad
+ * sortlist, just ignore the sortlist, don't cause an inoperable
+ * channel */
+ status =
+ ares__parse_sortlist(&sysconfig->sortlist, &sysconfig->nsortlist, value);
+ if (status != ARES_ENOMEM) {
+ status = ARES_SUCCESS;
+ }
+ } else if (strcmp(option, "options") == 0) {
+ status = set_options(sysconfig, value);
+ }
+
+ return status;
+}
+
+/* This function will only return ARES_SUCCESS or ARES_ENOMEM. Any other
+ * conditions are ignored. Users may mess up config files, but we want to
+ * process anything we can. */
+static ares_status_t parse_nsswitch_line(ares_sysconfig_t *sysconfig,
+ ares__buf_t *line)
+{
+ char option[32];
+ ares__buf_t *buf;
+ ares_status_t status = ARES_SUCCESS;
+ ares__llist_t *sects = NULL;
+
+ /* Ignore lines beginning with a comment */
+ if (ares__buf_begins_with(line, (const unsigned char *)"#", 1)) {
+ return ARES_SUCCESS;
+ }
+
+ /* database : values (space delimited) */
+ status = ares__buf_split(line, (const unsigned char *)":", 1,
+ ARES_BUF_SPLIT_TRIM, 2, &sects);
+
+ if (status != ARES_SUCCESS || ares__llist_len(sects) != 2) {
+ goto done;
+ }
+
+ buf = ares__llist_first_val(sects);
+ status = buf_fetch_string(buf, option, sizeof(option));
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ /* Only support "hosts:" */
+ if (strcmp(option, "hosts") != 0) {
+ goto done;
+ }
+
+ /* Values are space separated */
+ buf = ares__llist_last_val(sects);
+ status = config_lookup(sysconfig, buf, " \t");
+
+done:
+ ares__llist_destroy(sects);
+ if (status != ARES_ENOMEM) {
+ status = ARES_SUCCESS;
+ }
+ return status;
+}
+
+/* This function will only return ARES_SUCCESS or ARES_ENOMEM. Any other
+ * conditions are ignored. Users may mess up config files, but we want to
+ * process anything we can. */
+static ares_status_t parse_svcconf_line(ares_sysconfig_t *sysconfig,
+ ares__buf_t *line)
+{
+ char option[32];
+ ares__buf_t *buf;
+ ares_status_t status = ARES_SUCCESS;
+ ares__llist_t *sects = NULL;
+
+ /* Ignore lines beginning with a comment */
+ if (ares__buf_begins_with(line, (const unsigned char *)"#", 1)) {
+ return ARES_SUCCESS;
+ }
+
+ /* database = values (comma delimited)*/
+ status = ares__buf_split(line, (const unsigned char *)"=", 1,
+ ARES_BUF_SPLIT_TRIM, 2, &sects);
+
+ if (status != ARES_SUCCESS || ares__llist_len(sects) != 2) {
+ goto done;
+ }
+
+ buf = ares__llist_first_val(sects);
+ status = buf_fetch_string(buf, option, sizeof(option));
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ /* Only support "hosts=" */
+ if (strcmp(option, "hosts") != 0) {
+ goto done;
+ }
+
+ /* Values are comma separated */
+ buf = ares__llist_last_val(sects);
+ status = config_lookup(sysconfig, buf, ",");
+
+done:
+ ares__llist_destroy(sects);
+ if (status != ARES_ENOMEM) {
+ status = ARES_SUCCESS;
+ }
+ return status;
+}
+
+typedef ares_status_t (*line_callback_t)(ares_sysconfig_t *sysconfig,
+ ares__buf_t *line);
+
+/* Should only return:
+ * ARES_ENOTFOUND - file not found
+ * ARES_EFILE - error reading file (perms)
+ * ARES_ENOMEM - out of memory
+ * ARES_SUCCESS - file processed, doesn't necessarily mean it was a good
+ * file, but we're not erroring out if we can't parse
+ * something (or anything at all) */
+static ares_status_t process_config_lines(const char *filename,
+ ares_sysconfig_t *sysconfig,
+ line_callback_t cb)
+{
+ ares_status_t status = ARES_SUCCESS;
+ ares__llist_node_t *node;
+ ares__llist_t *lines = NULL;
+ ares__buf_t *buf = NULL;
+
+ buf = ares__buf_create();
+ if (buf == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ status = ares__buf_load_file(filename, buf);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ status = ares__buf_split(buf, (const unsigned char *)"\n", 1,
+ ARES_BUF_SPLIT_TRIM, 0, &lines);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ for (node = ares__llist_node_first(lines); node != NULL;
+ node = ares__llist_node_next(node)) {
+ ares__buf_t *line = ares__llist_node_val(node);
+
+ status = cb(sysconfig, line);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+
+done:
+ ares__buf_destroy(buf);
+ ares__llist_destroy(lines);
+
+ return status;
+}
+
+ares_status_t ares__init_sysconfig_files(const ares_channel_t *channel,
+ ares_sysconfig_t *sysconfig)
+{
+ ares_status_t status = ARES_SUCCESS;
+
+ /* Resolv.conf */
+ status = process_config_lines((channel->resolvconf_path != NULL)
+ ? channel->resolvconf_path
+ : PATH_RESOLV_CONF,
+ sysconfig, parse_resolvconf_line);
+ if (status != ARES_SUCCESS && status != ARES_ENOTFOUND) {
+ goto done;
+ }
+
+ /* Nsswitch.conf */
+ status =
+ process_config_lines("/etc/nsswitch.conf", sysconfig, parse_nsswitch_line);
+ if (status != ARES_SUCCESS && status != ARES_ENOTFOUND) {
+ goto done;
+ }
+
+ /* netsvc.conf */
+ status =
+ process_config_lines("/etc/netsvc.conf", sysconfig, parse_svcconf_line);
+ if (status != ARES_SUCCESS && status != ARES_ENOTFOUND) {
+ goto done;
+ }
+
+ /* svc.conf */
+ status = process_config_lines("/etc/svc.conf", sysconfig, parse_svcconf_line);
+ if (status != ARES_SUCCESS && status != ARES_ENOTFOUND) {
+ goto done;
+ }
+
+ status = ARES_SUCCESS;
+
+done:
+ return status;
+}
diff --git a/contrib/libs/c-ares/src/lib/ares_timeout.c b/contrib/libs/c-ares/src/lib/ares_timeout.c
index 7390ef9263..4e80580b5e 100644
--- a/contrib/libs/c-ares/src/lib/ares_timeout.c
+++ b/contrib/libs/c-ares/src/lib/ares_timeout.c
@@ -28,26 +28,39 @@
#include "ares_setup.h"
#ifdef HAVE_LIMITS_H
-#include <limits.h>
+# include <limits.h>
#endif
#include "ares.h"
#include "ares_private.h"
-/* return time offset between now and (future) check, in milliseconds */
-static long timeoffset(struct timeval *now, struct timeval *check)
+void ares__timeval_remaining(struct timeval *remaining,
+ const struct timeval *now,
+ const struct timeval *tout)
{
- return (check->tv_sec - now->tv_sec)*1000 +
- (check->tv_usec - now->tv_usec)/1000;
+ memset(remaining, 0, sizeof(*remaining));
+
+ /* Expired! */
+ if (tout->tv_sec < now->tv_sec ||
+ (tout->tv_sec == now->tv_sec && tout->tv_usec < now->tv_usec)) {
+ return;
+ }
+
+ remaining->tv_sec = tout->tv_sec - now->tv_sec;
+ if (tout->tv_usec < now->tv_usec) {
+ remaining->tv_sec -= 1;
+ remaining->tv_usec = (tout->tv_usec + 1000000) - now->tv_usec;
+ } else {
+ remaining->tv_usec = tout->tv_usec - now->tv_usec;
+ }
}
-struct timeval *ares_timeout(ares_channel channel, struct timeval *maxtv,
+struct timeval *ares_timeout(ares_channel_t *channel, struct timeval *maxtv,
struct timeval *tvbuf)
{
- struct query *query;
+ const struct query *query;
ares__slist_node_t *node;
struct timeval now;
- long offset;
/* The minimum timeout of all queries is always the first entry in
* channel->queries_by_timeout */
@@ -61,27 +74,24 @@ struct timeval *ares_timeout(ares_channel channel, struct timeval *maxtv,
now = ares__tvnow();
- offset = timeoffset(&now, &query->timeout);
- if (offset < 0)
- offset = 0;
- if (offset > (long)INT_MAX)
- offset = INT_MAX;
-
- tvbuf->tv_sec = offset / 1000;
- tvbuf->tv_usec = (offset % 1000) * 1000;
+ ares__timeval_remaining(tvbuf, &now, &query->timeout);
- if (maxtv == NULL)
+ if (maxtv == NULL) {
return tvbuf;
+ }
/* Return the minimum time between maxtv and tvbuf */
- if (tvbuf->tv_sec > maxtv->tv_sec)
+ if (tvbuf->tv_sec > maxtv->tv_sec) {
return maxtv;
- if (tvbuf->tv_sec < maxtv->tv_sec)
+ }
+ if (tvbuf->tv_sec < maxtv->tv_sec) {
return tvbuf;
+ }
- if (tvbuf->tv_usec > maxtv->tv_usec)
+ if (tvbuf->tv_usec > maxtv->tv_usec) {
return maxtv;
+ }
return tvbuf;
}
diff --git a/contrib/libs/c-ares/src/lib/ares_update_servers.c b/contrib/libs/c-ares/src/lib/ares_update_servers.c
new file mode 100644
index 0000000000..b8e26fcbae
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares_update_servers.c
@@ -0,0 +1,1195 @@
+/* MIT License
+ *
+ * Copyright (c) 1998 Massachusetts Institute of Technology
+ * Copyright (c) 2008 Daniel Stenberg
+ * Copyright (c) 2023 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#include "ares_setup.h"
+
+#ifdef HAVE_ARPA_INET_H
+# include <arpa/inet.h>
+#endif
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_SOCKET_H
+# include <sys/socket.h>
+#endif
+#ifdef HAVE_NET_IF_H
+# include <net/if.h>
+#endif
+
+#if defined(USE_WINSOCK)
+# if defined(HAVE_IPHLPAPI_H)
+# include <iphlpapi.h>
+# endif
+# if defined(HAVE_NETIOAPI_H)
+# include <netioapi.h>
+# endif
+#endif
+
+#include "ares.h"
+#include "ares_data.h"
+#include "ares_inet_net_pton.h"
+#include "ares_private.h"
+
+typedef struct {
+ struct ares_addr addr;
+ unsigned short tcp_port;
+ unsigned short udp_port;
+
+ char ll_iface[IF_NAMESIZE];
+ unsigned int ll_scope;
+} ares_sconfig_t;
+
+static ares_bool_t ares__addr_match(const struct ares_addr *addr1,
+ const struct ares_addr *addr2)
+{
+ if (addr1 == NULL && addr2 == NULL) {
+ return ARES_TRUE;
+ }
+
+ if (addr1 == NULL || addr2 == NULL) {
+ return ARES_FALSE;
+ }
+
+ if (addr1->family != addr2->family) {
+ return ARES_FALSE;
+ }
+
+ if (addr1->family == AF_INET && memcmp(&addr1->addr.addr4, &addr2->addr.addr4,
+ sizeof(addr1->addr.addr4)) == 0) {
+ return ARES_TRUE;
+ }
+
+ if (addr1->family == AF_INET6 &&
+ memcmp(&addr1->addr.addr6._S6_un._S6_u8, &addr2->addr.addr6._S6_un._S6_u8,
+ sizeof(addr1->addr.addr6._S6_un._S6_u8)) == 0) {
+ return ARES_TRUE;
+ }
+
+ return ARES_FALSE;
+}
+
+ares_bool_t ares__subnet_match(const struct ares_addr *addr,
+ const struct ares_addr *subnet,
+ unsigned char netmask)
+{
+ const unsigned char *addr_ptr;
+ const unsigned char *subnet_ptr;
+ size_t len;
+ size_t i;
+
+ if (addr == NULL || subnet == NULL) {
+ return ARES_FALSE;
+ }
+
+ if (addr->family != subnet->family) {
+ return ARES_FALSE;
+ }
+
+ if (addr->family == AF_INET) {
+ addr_ptr = (const unsigned char *)&addr->addr.addr4;
+ subnet_ptr = (const unsigned char *)&subnet->addr.addr4;
+ len = 4;
+
+ if (netmask > 32) {
+ return ARES_FALSE;
+ }
+ } else if (addr->family == AF_INET6) {
+ addr_ptr = (const unsigned char *)&addr->addr.addr6;
+ subnet_ptr = (const unsigned char *)&subnet->addr.addr6;
+ len = 16;
+
+ if (netmask > 128) {
+ return ARES_FALSE;
+ }
+ } else {
+ return ARES_FALSE;
+ }
+
+ for (i = 0; i < len && netmask > 0; i++) {
+ unsigned char mask = 0xff;
+ if (netmask < 8) {
+ mask <<= (8 - netmask);
+ netmask = 0;
+ } else {
+ netmask -= 8;
+ }
+
+ if ((addr_ptr[i] & mask) != (subnet_ptr[i] & mask)) {
+ return ARES_FALSE;
+ }
+ }
+
+ return ARES_TRUE;
+}
+
+ares_bool_t ares__addr_is_linklocal(const struct ares_addr *addr)
+{
+ struct ares_addr subnet;
+ const unsigned char subnetaddr[16] = { 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00 };
+
+ /* fe80::/10 */
+ subnet.family = AF_INET6;
+ memcpy(&subnet.addr.addr6, subnetaddr, 16);
+
+ return ares__subnet_match(addr, &subnet, 10);
+}
+
+static ares_bool_t ares_server_blacklisted(const struct ares_addr *addr)
+{
+ /* A list of blacklisted IPv6 subnets. */
+ const struct {
+ const unsigned char netbase[16];
+ unsigned char netmask;
+ } blacklist_v6[] = {
+ /* fec0::/10 was deprecated by [RFC3879] in September 2004. Formerly a
+ * Site-Local scoped address prefix. These are never valid DNS servers,
+ * but are known to be returned at least sometimes on Windows and Android.
+ */
+ {{ 0xfe, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00 },
+ 10}
+ };
+
+ size_t i;
+
+ if (addr->family != AF_INET6) {
+ return ARES_FALSE;
+ }
+
+ /* See if ipaddr matches any of the entries in the blacklist. */
+ for (i = 0; i < sizeof(blacklist_v6) / sizeof(*blacklist_v6); i++) {
+ struct ares_addr subnet;
+ subnet.family = AF_INET6;
+ memcpy(&subnet.addr.addr6, blacklist_v6[i].netbase, 16);
+ if (ares__subnet_match(addr, &subnet, blacklist_v6[i].netmask)) {
+ return ARES_TRUE;
+ }
+ }
+ return ARES_FALSE;
+}
+
+/* Parse address and port in these formats, either ipv4 or ipv6 addresses
+ * are allowed:
+ * ipaddr
+ * ipv4addr:port
+ * [ipaddr]
+ * [ipaddr]:port
+ *
+ * Modifiers: %iface
+ *
+ * TODO: #domain modifier
+ *
+ * If a port is not specified, will set port to 0.
+ *
+ * Will fail if an IPv6 nameserver as detected by
+ * ares_ipv6_server_blacklisted()
+ *
+ * Returns an error code on failure, else ARES_SUCCESS
+ */
+
+static ares_status_t parse_nameserver(ares__buf_t *buf, ares_sconfig_t *sconfig)
+{
+ ares_status_t status;
+ char ipaddr[INET6_ADDRSTRLEN] = "";
+ size_t addrlen;
+
+ memset(sconfig, 0, sizeof(*sconfig));
+
+ /* Consume any leading whitespace */
+ ares__buf_consume_whitespace(buf, ARES_TRUE);
+
+ /* pop off IP address. If it is in [ ] then it can be ipv4 or ipv6. If
+ * not, ipv4 only */
+ if (ares__buf_begins_with(buf, (const unsigned char *)"[", 1)) {
+ /* Consume [ */
+ ares__buf_consume(buf, 1);
+
+ ares__buf_tag(buf);
+
+ /* Consume until ] */
+ if (ares__buf_consume_until_charset(buf, (const unsigned char *)"]", 1,
+ ARES_TRUE) == 0) {
+ return ARES_EBADSTR;
+ }
+
+ status = ares__buf_tag_fetch_string(buf, ipaddr, sizeof(ipaddr));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Skip over ] */
+ ares__buf_consume(buf, 1);
+ } else {
+ size_t offset;
+
+ /* Not in [ ], see if '.' is in first 4 characters, if it is, then its ipv4,
+ * otherwise treat as ipv6 */
+ ares__buf_tag(buf);
+
+ offset = ares__buf_consume_until_charset(buf, (const unsigned char *)".", 1,
+ ARES_TRUE);
+ ares__buf_tag_rollback(buf);
+ ares__buf_tag(buf);
+
+ if (offset > 0 && offset < 4) {
+ /* IPv4 */
+ if (ares__buf_consume_charset(buf, (const unsigned char *)"0123456789.",
+ 11) == 0) {
+ return ARES_EBADSTR;
+ }
+ } else {
+ /* IPv6 */
+ const unsigned char ipv6_charset[] = "ABCDEFabcdef0123456789.:";
+ if (ares__buf_consume_charset(buf, ipv6_charset,
+ sizeof(ipv6_charset) - 1) == 0) {
+ return ARES_EBADSTR;
+ }
+ }
+
+ status = ares__buf_tag_fetch_string(buf, ipaddr, sizeof(ipaddr));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+
+ /* Convert ip address from string to network byte order */
+ sconfig->addr.family = AF_UNSPEC;
+ if (ares_dns_pton(ipaddr, &sconfig->addr, &addrlen) == NULL) {
+ return ARES_EBADSTR;
+ }
+
+ /* Pull off port */
+ if (ares__buf_begins_with(buf, (const unsigned char *)":", 1)) {
+ char portstr[6];
+
+ /* Consume : */
+ ares__buf_consume(buf, 1);
+
+ ares__buf_tag(buf);
+
+ /* Read numbers */
+ if (ares__buf_consume_charset(buf, (const unsigned char *)"0123456789",
+ 10) == 0) {
+ return ARES_EBADSTR;
+ }
+
+ status = ares__buf_tag_fetch_string(buf, portstr, sizeof(portstr));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ sconfig->udp_port = (unsigned short)atoi(portstr);
+ sconfig->tcp_port = sconfig->udp_port;
+ }
+
+ /* Pull off interface modifier */
+ if (ares__buf_begins_with(buf, (const unsigned char *)"%", 1)) {
+ const unsigned char iface_charset[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "abcdefghijklmnopqrstuvwxyz"
+ "0123456789.-_\\:{}";
+ /* Consume % */
+ ares__buf_consume(buf, 1);
+
+ ares__buf_tag(buf);
+
+ if (ares__buf_consume_charset(buf, iface_charset,
+ sizeof(iface_charset) - 1) == 0) {
+ return ARES_EBADSTR;
+ }
+
+ status = ares__buf_tag_fetch_string(buf, sconfig->ll_iface,
+ sizeof(sconfig->ll_iface));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+
+ /* Consume any trailing whitespace so we can bail out if there is something
+ * after we didn't read */
+ ares__buf_consume_whitespace(buf, ARES_TRUE);
+
+ if (ares__buf_len(buf) != 0) {
+ return ARES_EBADSTR;
+ }
+
+ return ARES_SUCCESS;
+}
+
+static ares_status_t ares__sconfig_linklocal(ares_sconfig_t *s,
+ const char *ll_iface)
+{
+ unsigned int ll_scope = 0;
+
+ if (ares_str_isnum(ll_iface)) {
+ char ifname[IF_NAMESIZE] = "";
+ ll_scope = (unsigned int)atoi(ll_iface);
+ if (ares__if_indextoname(ll_scope, ifname, sizeof(ifname)) == NULL) {
+ DEBUGF(fprintf(stderr, "Interface %s for ipv6 Link Local not found\n",
+ ll_iface));
+ return ARES_ENOTFOUND;
+ }
+ ares_strcpy(s->ll_iface, ifname, sizeof(s->ll_iface));
+ s->ll_scope = ll_scope;
+ return ARES_SUCCESS;
+ }
+
+ ll_scope = ares__if_nametoindex(ll_iface);
+ if (ll_scope == 0) {
+ DEBUGF(fprintf(stderr, "Interface %s for ipv6 Link Local not found\n",
+ ll_iface));
+ return ARES_ENOTFOUND;
+ }
+ ares_strcpy(s->ll_iface, ll_iface, sizeof(s->ll_iface));
+ s->ll_scope = ll_scope;
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares__sconfig_append(ares__llist_t **sconfig,
+ const struct ares_addr *addr,
+ unsigned short udp_port,
+ unsigned short tcp_port,
+ const char *ll_iface)
+{
+ ares_sconfig_t *s;
+ ares_status_t status;
+
+ if (sconfig == NULL || addr == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ /* Silently skip blacklisted IPv6 servers. */
+ if (ares_server_blacklisted(addr)) {
+ return ARES_SUCCESS;
+ }
+
+ s = ares_malloc_zero(sizeof(*s));
+ if (s == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ if (*sconfig == NULL) {
+ *sconfig = ares__llist_create(ares_free);
+ if (*sconfig == NULL) {
+ status = ARES_ENOMEM;
+ goto fail;
+ }
+ }
+
+ memcpy(&s->addr, addr, sizeof(s->addr));
+ s->udp_port = udp_port;
+ s->tcp_port = tcp_port;
+
+ /* Handle link-local enumeration */
+ if (ares_strlen(ll_iface) && ares__addr_is_linklocal(&s->addr)) {
+ status = ares__sconfig_linklocal(s, ll_iface);
+ /* Silently ignore this entry */
+ if (status != ARES_SUCCESS) {
+ status = ARES_SUCCESS;
+ goto fail;
+ }
+ }
+
+ if (ares__llist_insert_last(*sconfig, s) == NULL) {
+ status = ARES_ENOMEM;
+ goto fail;
+ }
+
+ return ARES_SUCCESS;
+
+fail:
+ ares_free(s);
+
+ return status;
+}
+
+/* Add the IPv4 or IPv6 nameservers in str (separated by commas or spaces) to
+ * the servers list, updating servers and nservers as required.
+ *
+ * If a nameserver is encapsulated in [ ] it may optionally include a port
+ * suffix, e.g.:
+ * [127.0.0.1]:59591
+ *
+ * The extended format is required to support OpenBSD's resolv.conf format:
+ * https://man.openbsd.org/OpenBSD-5.1/resolv.conf.5
+ * As well as MacOS libresolv that may include a non-default port number.
+ *
+ * This will silently ignore blacklisted IPv6 nameservers as detected by
+ * ares_ipv6_server_blacklisted().
+ *
+ * Returns an error code on failure, else ARES_SUCCESS.
+ */
+ares_status_t ares__sconfig_append_fromstr(ares__llist_t **sconfig,
+ const char *str,
+ ares_bool_t ignore_invalid)
+{
+ ares_status_t status = ARES_SUCCESS;
+ ares__buf_t *buf = NULL;
+ ares__llist_t *list = NULL;
+ ares__llist_node_t *node;
+
+ /* On Windows, there may be more than one nameserver specified in the same
+ * registry key, so we parse input as a space or comma separated list.
+ */
+ buf = ares__buf_create_const((const unsigned char *)str, ares_strlen(str));
+ if (buf == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ status = ares__buf_split(buf, (const unsigned char *)" ,", 2,
+ ARES_BUF_SPLIT_NONE, 0, &list);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ for (node = ares__llist_node_first(list); node != NULL;
+ node = ares__llist_node_next(node)) {
+ ares__buf_t *entry = ares__llist_node_val(node);
+ ares_sconfig_t s;
+
+ status = parse_nameserver(entry, &s);
+ if (status != ARES_SUCCESS) {
+ if (ignore_invalid) {
+ continue;
+ } else {
+ goto done;
+ }
+ }
+
+ status = ares__sconfig_append(sconfig, &s.addr, s.udp_port, s.tcp_port,
+ s.ll_iface);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+
+ status = ARES_SUCCESS;
+
+done:
+ ares__llist_destroy(list);
+ ares__buf_destroy(buf);
+ return status;
+}
+
+static unsigned short ares__sconfig_get_port(const ares_channel_t *channel,
+ const ares_sconfig_t *s,
+ ares_bool_t is_tcp)
+{
+ unsigned short port = is_tcp ? s->tcp_port : s->udp_port;
+
+ if (port == 0) {
+ port = is_tcp ? channel->tcp_port : channel->udp_port;
+ }
+
+ if (port == 0) {
+ port = 53;
+ }
+
+ return port;
+}
+
+static ares__slist_node_t *ares__server_find(ares_channel_t *channel,
+ const ares_sconfig_t *s)
+{
+ ares__slist_node_t *node;
+
+ for (node = ares__slist_node_first(channel->servers); node != NULL;
+ node = ares__slist_node_next(node)) {
+ const struct server_state *server = ares__slist_node_val(node);
+
+ if (!ares__addr_match(&server->addr, &s->addr)) {
+ continue;
+ }
+
+ if (server->tcp_port != ares__sconfig_get_port(channel, s, ARES_TRUE)) {
+ continue;
+ }
+
+ if (server->udp_port != ares__sconfig_get_port(channel, s, ARES_FALSE)) {
+ continue;
+ }
+
+ return node;
+ }
+ return NULL;
+}
+
+static ares_bool_t ares__server_isdup(const ares_channel_t *channel,
+ ares__llist_node_t *s)
+{
+ /* Scan backwards to see if this is a duplicate */
+ ares__llist_node_t *prev;
+ const ares_sconfig_t *server = ares__llist_node_val(s);
+
+ for (prev = ares__llist_node_prev(s); prev != NULL;
+ prev = ares__llist_node_prev(prev)) {
+ const ares_sconfig_t *p = ares__llist_node_val(prev);
+
+ if (!ares__addr_match(&server->addr, &p->addr)) {
+ continue;
+ }
+
+ if (ares__sconfig_get_port(channel, server, ARES_TRUE) !=
+ ares__sconfig_get_port(channel, p, ARES_TRUE)) {
+ continue;
+ }
+
+ if (ares__sconfig_get_port(channel, server, ARES_FALSE) !=
+ ares__sconfig_get_port(channel, p, ARES_FALSE)) {
+ continue;
+ }
+
+ return ARES_TRUE;
+ }
+
+ return ARES_FALSE;
+}
+
+static ares_status_t ares__server_create(ares_channel_t *channel,
+ const ares_sconfig_t *sconfig,
+ size_t idx)
+{
+ ares_status_t status;
+ struct server_state *server = ares_malloc_zero(sizeof(*server));
+
+ if (server == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ server->idx = idx;
+ server->channel = channel;
+ server->udp_port = ares__sconfig_get_port(channel, sconfig, ARES_FALSE);
+ server->tcp_port = ares__sconfig_get_port(channel, sconfig, ARES_TRUE);
+ server->addr.family = sconfig->addr.family;
+ server->next_retry_time.tv_sec = 0;
+ server->next_retry_time.tv_usec = 0;
+
+ if (sconfig->addr.family == AF_INET) {
+ memcpy(&server->addr.addr.addr4, &sconfig->addr.addr.addr4,
+ sizeof(server->addr.addr.addr4));
+ } else if (sconfig->addr.family == AF_INET6) {
+ memcpy(&server->addr.addr.addr6, &sconfig->addr.addr.addr6,
+ sizeof(server->addr.addr.addr6));
+ }
+
+ /* Copy over link-local settings */
+ if (ares_strlen(sconfig->ll_iface)) {
+ ares_strcpy(server->ll_iface, sconfig->ll_iface, sizeof(server->ll_iface));
+ server->ll_scope = sconfig->ll_scope;
+ }
+
+ server->tcp_parser = ares__buf_create();
+ if (server->tcp_parser == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ server->tcp_send = ares__buf_create();
+ if (server->tcp_send == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ server->connections = ares__llist_create(NULL);
+ if (server->connections == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ if (ares__slist_insert(channel->servers, server) == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ status = ARES_SUCCESS;
+
+done:
+ if (status != ARES_SUCCESS) {
+ ares__destroy_server(server);
+ }
+
+ return status;
+}
+
+static ares_bool_t ares__server_in_newconfig(const struct server_state *server,
+ ares__llist_t *srvlist)
+{
+ ares__llist_node_t *node;
+ const ares_channel_t *channel = server->channel;
+
+ for (node = ares__llist_node_first(srvlist); node != NULL;
+ node = ares__llist_node_next(node)) {
+ const ares_sconfig_t *s = ares__llist_node_val(node);
+
+ if (!ares__addr_match(&server->addr, &s->addr)) {
+ continue;
+ }
+
+ if (server->tcp_port != ares__sconfig_get_port(channel, s, ARES_TRUE)) {
+ continue;
+ }
+
+ if (server->udp_port != ares__sconfig_get_port(channel, s, ARES_FALSE)) {
+ continue;
+ }
+
+ return ARES_TRUE;
+ }
+
+ return ARES_FALSE;
+}
+
+static void ares__servers_remove_stale(ares_channel_t *channel,
+ ares__llist_t *srvlist)
+{
+ ares__slist_node_t *snode = ares__slist_node_first(channel->servers);
+
+ while (snode != NULL) {
+ ares__slist_node_t *snext = ares__slist_node_next(snode);
+ const struct server_state *server = ares__slist_node_val(snode);
+ if (!ares__server_in_newconfig(server, srvlist)) {
+ /* This will clean up all server state via the destruction callback and
+ * move any queries to new servers */
+ ares__slist_node_destroy(snode);
+ }
+ snode = snext;
+ }
+}
+
+static void ares__servers_trim_single(ares_channel_t *channel)
+{
+ while (ares__slist_len(channel->servers) > 1) {
+ ares__slist_node_destroy(ares__slist_node_last(channel->servers));
+ }
+}
+
+ares_status_t ares__servers_update(ares_channel_t *channel,
+ ares__llist_t *server_list,
+ ares_bool_t user_specified)
+{
+ ares__llist_node_t *node;
+ size_t idx = 0;
+ ares_status_t status;
+
+ if (channel == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ ares__channel_lock(channel);
+
+ /* NOTE: a NULL or zero entry server list is considered valid due to
+ * real-world people needing support for this for their test harnesses
+ */
+
+ /* Add new entries */
+ for (node = ares__llist_node_first(server_list); node != NULL;
+ node = ares__llist_node_next(node)) {
+ const ares_sconfig_t *sconfig = ares__llist_node_val(node);
+ ares__slist_node_t *snode;
+
+ /* Don't add duplicate servers! */
+ if (ares__server_isdup(channel, node)) {
+ continue;
+ }
+
+ snode = ares__server_find(channel, sconfig);
+ if (snode != NULL) {
+ struct server_state *server = ares__slist_node_val(snode);
+
+ /* Copy over link-local settings. Its possible some of this data has
+ * changed, maybe ... */
+ if (ares_strlen(sconfig->ll_iface)) {
+ ares_strcpy(server->ll_iface, sconfig->ll_iface,
+ sizeof(server->ll_iface));
+ server->ll_scope = sconfig->ll_scope;
+ }
+
+ if (server->idx != idx) {
+ server->idx = idx;
+ /* Index changed, reinsert node, doesn't require any memory
+ * allocations so can't fail. */
+ ares__slist_node_reinsert(snode);
+ }
+ } else {
+ status = ares__server_create(channel, sconfig, idx);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+
+ idx++;
+ }
+
+ /* Remove any servers that don't exist in the current configuration */
+ ares__servers_remove_stale(channel, server_list);
+
+ /* Trim to one server if ARES_FLAG_PRIMARY is set. */
+ if (channel->flags & ARES_FLAG_PRIMARY) {
+ ares__servers_trim_single(channel);
+ }
+
+ if (user_specified) {
+ /* Save servers as if they were passed in as an option */
+ channel->optmask |= ARES_OPT_SERVERS;
+ }
+
+ /* Clear any cached query results */
+ ares__qcache_flush(channel->qcache);
+
+ status = ARES_SUCCESS;
+
+done:
+ ares__channel_unlock(channel);
+ return status;
+}
+
+static ares_status_t
+ ares_addr_node_to_server_config_llist(const struct ares_addr_node *servers,
+ ares__llist_t **llist)
+{
+ const struct ares_addr_node *node;
+ ares__llist_t *s;
+
+ *llist = NULL;
+
+ s = ares__llist_create(ares_free);
+ if (s == NULL) {
+ goto fail;
+ }
+
+ for (node = servers; node != NULL; node = node->next) {
+ ares_sconfig_t *sconfig;
+
+ /* Invalid entry */
+ if (node->family != AF_INET && node->family != AF_INET6) {
+ continue;
+ }
+
+ sconfig = ares_malloc_zero(sizeof(*sconfig));
+ if (sconfig == NULL) {
+ goto fail;
+ }
+
+ sconfig->addr.family = node->family;
+ if (node->family == AF_INET) {
+ memcpy(&sconfig->addr.addr.addr4, &node->addr.addr4,
+ sizeof(sconfig->addr.addr.addr4));
+ } else if (sconfig->addr.family == AF_INET6) {
+ memcpy(&sconfig->addr.addr.addr6, &node->addr.addr6,
+ sizeof(sconfig->addr.addr.addr6));
+ }
+
+ if (ares__llist_insert_last(s, sconfig) == NULL) {
+ ares_free(sconfig);
+ goto fail;
+ }
+ }
+
+ *llist = s;
+ return ARES_SUCCESS;
+
+fail:
+ ares__llist_destroy(s);
+ return ARES_ENOMEM;
+}
+
+static ares_status_t ares_addr_port_node_to_server_config_llist(
+ const struct ares_addr_port_node *servers, ares__llist_t **llist)
+{
+ const struct ares_addr_port_node *node;
+ ares__llist_t *s;
+
+ *llist = NULL;
+
+ s = ares__llist_create(ares_free);
+ if (s == NULL) {
+ goto fail;
+ }
+
+ for (node = servers; node != NULL; node = node->next) {
+ ares_sconfig_t *sconfig;
+
+ /* Invalid entry */
+ if (node->family != AF_INET && node->family != AF_INET6) {
+ continue;
+ }
+
+ sconfig = ares_malloc_zero(sizeof(*sconfig));
+ if (sconfig == NULL) {
+ goto fail;
+ }
+
+ sconfig->addr.family = node->family;
+ if (node->family == AF_INET) {
+ memcpy(&sconfig->addr.addr.addr4, &node->addr.addr4,
+ sizeof(sconfig->addr.addr.addr4));
+ } else if (sconfig->addr.family == AF_INET6) {
+ memcpy(&sconfig->addr.addr.addr6, &node->addr.addr6,
+ sizeof(sconfig->addr.addr.addr6));
+ }
+
+ sconfig->tcp_port = (unsigned short)node->tcp_port;
+ sconfig->udp_port = (unsigned short)node->udp_port;
+
+ if (ares__llist_insert_last(s, sconfig) == NULL) {
+ ares_free(sconfig);
+ goto fail;
+ }
+ }
+
+ *llist = s;
+ return ARES_SUCCESS;
+
+fail:
+ ares__llist_destroy(s);
+ return ARES_ENOMEM;
+}
+
+ares_status_t ares_in_addr_to_server_config_llist(const struct in_addr *servers,
+ size_t nservers,
+ ares__llist_t **llist)
+{
+ size_t i;
+ ares__llist_t *s;
+
+ *llist = NULL;
+
+ s = ares__llist_create(ares_free);
+ if (s == NULL) {
+ goto fail;
+ }
+
+ for (i = 0; servers != NULL && i < nservers; i++) {
+ ares_sconfig_t *sconfig;
+
+ sconfig = ares_malloc_zero(sizeof(*sconfig));
+ if (sconfig == NULL) {
+ goto fail;
+ }
+
+ sconfig->addr.family = AF_INET;
+ memcpy(&sconfig->addr.addr.addr4, &servers[i],
+ sizeof(sconfig->addr.addr.addr4));
+
+ if (ares__llist_insert_last(s, sconfig) == NULL) {
+ goto fail;
+ }
+ }
+
+ *llist = s;
+ return ARES_SUCCESS;
+
+fail:
+ ares__llist_destroy(s);
+ return ARES_ENOMEM;
+}
+
+int ares_get_servers(ares_channel_t *channel, struct ares_addr_node **servers)
+{
+ struct ares_addr_node *srvr_head = NULL;
+ struct ares_addr_node *srvr_last = NULL;
+ struct ares_addr_node *srvr_curr;
+ ares_status_t status = ARES_SUCCESS;
+ ares__slist_node_t *node;
+
+ if (channel == NULL) {
+ return ARES_ENODATA;
+ }
+
+ ares__channel_lock(channel);
+
+ for (node = ares__slist_node_first(channel->servers); node != NULL;
+ node = ares__slist_node_next(node)) {
+ const struct server_state *server = ares__slist_node_val(node);
+
+ /* Allocate storage for this server node appending it to the list */
+ srvr_curr = ares_malloc_data(ARES_DATATYPE_ADDR_NODE);
+ if (!srvr_curr) {
+ status = ARES_ENOMEM;
+ break;
+ }
+ if (srvr_last) {
+ srvr_last->next = srvr_curr;
+ } else {
+ srvr_head = srvr_curr;
+ }
+ srvr_last = srvr_curr;
+
+ /* Fill this server node data */
+ srvr_curr->family = server->addr.family;
+ if (srvr_curr->family == AF_INET) {
+ memcpy(&srvr_curr->addr.addr4, &server->addr.addr.addr4,
+ sizeof(srvr_curr->addr.addr4));
+ } else {
+ memcpy(&srvr_curr->addr.addr6, &server->addr.addr.addr6,
+ sizeof(srvr_curr->addr.addr6));
+ }
+ }
+
+ if (status != ARES_SUCCESS) {
+ ares_free_data(srvr_head);
+ srvr_head = NULL;
+ }
+
+ *servers = srvr_head;
+
+ ares__channel_unlock(channel);
+
+ return (int)status;
+}
+
+int ares_get_servers_ports(ares_channel_t *channel,
+ struct ares_addr_port_node **servers)
+{
+ struct ares_addr_port_node *srvr_head = NULL;
+ struct ares_addr_port_node *srvr_last = NULL;
+ struct ares_addr_port_node *srvr_curr;
+ ares_status_t status = ARES_SUCCESS;
+ ares__slist_node_t *node;
+
+ if (channel == NULL) {
+ return ARES_ENODATA;
+ }
+
+ ares__channel_lock(channel);
+
+ for (node = ares__slist_node_first(channel->servers); node != NULL;
+ node = ares__slist_node_next(node)) {
+ const struct server_state *server = ares__slist_node_val(node);
+
+ /* Allocate storage for this server node appending it to the list */
+ srvr_curr = ares_malloc_data(ARES_DATATYPE_ADDR_PORT_NODE);
+ if (!srvr_curr) {
+ status = ARES_ENOMEM;
+ break;
+ }
+ if (srvr_last) {
+ srvr_last->next = srvr_curr;
+ } else {
+ srvr_head = srvr_curr;
+ }
+ srvr_last = srvr_curr;
+
+ /* Fill this server node data */
+ srvr_curr->family = server->addr.family;
+ srvr_curr->udp_port = server->udp_port;
+ srvr_curr->tcp_port = server->tcp_port;
+
+ if (srvr_curr->family == AF_INET) {
+ memcpy(&srvr_curr->addr.addr4, &server->addr.addr.addr4,
+ sizeof(srvr_curr->addr.addr4));
+ } else {
+ memcpy(&srvr_curr->addr.addr6, &server->addr.addr.addr6,
+ sizeof(srvr_curr->addr.addr6));
+ }
+ }
+
+ if (status != ARES_SUCCESS) {
+ ares_free_data(srvr_head);
+ srvr_head = NULL;
+ }
+
+ *servers = srvr_head;
+
+ ares__channel_unlock(channel);
+ return (int)status;
+}
+
+int ares_set_servers(ares_channel_t *channel,
+ const struct ares_addr_node *servers)
+{
+ ares__llist_t *slist;
+ ares_status_t status;
+
+ if (channel == NULL) {
+ return ARES_ENODATA;
+ }
+
+ status = ares_addr_node_to_server_config_llist(servers, &slist);
+ if (status != ARES_SUCCESS) {
+ return (int)status;
+ }
+
+ /* NOTE: lock is in ares__servers_update() */
+ status = ares__servers_update(channel, slist, ARES_TRUE);
+
+ ares__llist_destroy(slist);
+
+ return (int)status;
+}
+
+int ares_set_servers_ports(ares_channel_t *channel,
+ const struct ares_addr_port_node *servers)
+{
+ ares__llist_t *slist;
+ ares_status_t status;
+
+ if (channel == NULL) {
+ return ARES_ENODATA;
+ }
+
+ status = ares_addr_port_node_to_server_config_llist(servers, &slist);
+ if (status != ARES_SUCCESS) {
+ return (int)status;
+ }
+
+ /* NOTE: lock is in ares__servers_update() */
+ status = ares__servers_update(channel, slist, ARES_TRUE);
+
+ ares__llist_destroy(slist);
+
+ return (int)status;
+}
+
+/* Incoming string format: host[:port][,host[:port]]... */
+/* IPv6 addresses with ports require square brackets [fe80::1]:53 */
+static ares_status_t set_servers_csv(ares_channel_t *channel, const char *_csv)
+{
+ ares_status_t status;
+ ares__llist_t *slist = NULL;
+
+ if (channel == NULL) {
+ return ARES_ENODATA;
+ }
+
+ /* NOTE: lock is in ares__servers_update() */
+
+ if (ares_strlen(_csv) == 0) {
+ /* blank all servers */
+ return ares__servers_update(channel, NULL, ARES_TRUE);
+ }
+
+ status = ares__sconfig_append_fromstr(&slist, _csv, ARES_FALSE);
+ if (status != ARES_SUCCESS) {
+ ares__llist_destroy(slist);
+ return status;
+ }
+
+ /* NOTE: lock is in ares__servers_update() */
+ status = ares__servers_update(channel, slist, ARES_TRUE);
+
+ ares__llist_destroy(slist);
+
+ return status;
+}
+
+/* We'll go ahead and honor ports anyhow */
+int ares_set_servers_csv(ares_channel_t *channel, const char *_csv)
+{
+ /* NOTE: lock is in ares__servers_update() */
+ return (int)set_servers_csv(channel, _csv);
+}
+
+int ares_set_servers_ports_csv(ares_channel_t *channel, const char *_csv)
+{
+ /* NOTE: lock is in ares__servers_update() */
+ return (int)set_servers_csv(channel, _csv);
+}
+
+char *ares_get_servers_csv(ares_channel_t *channel)
+{
+ ares__buf_t *buf = NULL;
+ char *out = NULL;
+ ares__slist_node_t *node;
+
+ ares__channel_lock(channel);
+
+ buf = ares__buf_create();
+ if (buf == NULL) {
+ goto done;
+ }
+
+ for (node = ares__slist_node_first(channel->servers); node != NULL;
+ node = ares__slist_node_next(node)) {
+ ares_status_t status;
+ const struct server_state *server = ares__slist_node_val(node);
+ char addr[64];
+
+ if (ares__buf_len(buf)) {
+ status = ares__buf_append_byte(buf, ',');
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+
+ /* ipv4addr or [ipv6addr] */
+ if (server->addr.family == AF_INET6) {
+ status = ares__buf_append_byte(buf, '[');
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+
+ ares_inet_ntop(server->addr.family, &server->addr.addr, addr, sizeof(addr));
+
+ status = ares__buf_append_str(buf, addr);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ if (server->addr.family == AF_INET6) {
+ status = ares__buf_append_byte(buf, ']');
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+
+ /* :port */
+ status = ares__buf_append_byte(buf, ':');
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ status = ares__buf_append_num_dec(buf, server->udp_port, 0);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ /* %iface */
+ if (ares_strlen(server->ll_iface)) {
+ status = ares__buf_append_byte(buf, '%');
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ status = ares__buf_append_str(buf, server->ll_iface);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+ }
+
+ out = ares__buf_finish_str(buf, NULL);
+ buf = NULL;
+
+done:
+ ares__channel_unlock(channel);
+ ares__buf_destroy(buf);
+ return out;
+}
diff --git a/contrib/libs/c-ares/src/lib/ares_version.c b/contrib/libs/c-ares/src/lib/ares_version.c
index b6a62da86d..ca15fa77dc 100644
--- a/contrib/libs/c-ares/src/lib/ares_version.c
+++ b/contrib/libs/c-ares/src/lib/ares_version.c
@@ -29,8 +29,9 @@
const char *ares_version(int *version)
{
- if(version)
+ if (version) {
*version = ARES_VERSION;
+ }
return ARES_VERSION_STR;
}
diff --git a/contrib/libs/c-ares/src/lib/bitncmp.c b/contrib/libs/c-ares/src/lib/bitncmp.c
deleted file mode 100644
index 5a5a07f8ac..0000000000
--- a/contrib/libs/c-ares/src/lib/bitncmp.c
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
- * Copyright (c) 1996,1999 by 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.
- *
- * SPDX-License-Identifier: MIT
- */
-
-#ifndef HAVE_BITNCMP
-
-#include "ares_setup.h"
-#include "bitncmp.h"
-
-/*
- * int
- * bitncmp(l, r, n)
- * compare bit masks l and r, for n bits.
- * return:
- * <0, >0, or 0 in the libc tradition.
- * note:
- * network byte order assumed. this means 192.5.5.240/28 has
- * 0x11110000 in its fourth octet.
- * author:
- * Paul Vixie (ISC), June 1996
- */
-int ares__bitncmp(const void *l, const void *r, int n)
-{
- unsigned int lb, rb;
- int x, b;
-
- b = n / 8;
- x = memcmp(l, r, b);
- if (x || (n % 8) == 0)
- return (x);
-
- lb = ((const unsigned char *)l)[b];
- rb = ((const unsigned char *)r)[b];
- for (b = n % 8; b > 0; b--) {
- if ((lb & 0x80) != (rb & 0x80)) {
- if (lb & 0x80)
- return (1);
- return (-1);
- }
- lb <<= 1;
- rb <<= 1;
- }
- return (0);
-}
-#endif
diff --git a/contrib/libs/c-ares/src/lib/bitncmp.h b/contrib/libs/c-ares/src/lib/bitncmp.h
deleted file mode 100644
index 8e39eb510c..0000000000
--- a/contrib/libs/c-ares/src/lib/bitncmp.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/* MIT License
- *
- * Copyright (c) 2005 Dominick Meglio
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- * SPDX-License-Identifier: MIT
- */
-#ifndef __ARES_BITNCMP_H
-#define __ARES_BITNCMP_H
-
-#ifndef HAVE_BITNCMP
-int ares__bitncmp(const void *l, const void *r, int n);
-#else
-#define ares__bitncmp(x,y,z) bitncmp(x,y,z)
-#endif
-
-#endif /* __ARES_BITNCMP_H */
diff --git a/contrib/libs/c-ares/src/lib/config-win32.h b/contrib/libs/c-ares/src/lib/config-win32.h
index 94692d6c36..752e17afe6 100644
--- a/contrib/libs/c-ares/src/lib/config-win32.h
+++ b/contrib/libs/c-ares/src/lib/config-win32.h
@@ -42,7 +42,7 @@
/* Define if you have the <getopt.h> header file. */
#if defined(__MINGW32__) || defined(__POCC__)
-#define HAVE_GETOPT_H 1
+# define HAVE_GETOPT_H 1
#endif
/* Define if you have the <limits.h> header file. */
@@ -50,7 +50,7 @@
/* Define if you have the <process.h> header file. */
#ifndef __SALFORDC__
-#define HAVE_PROCESS_H 1
+# define HAVE_PROCESS_H 1
#endif
/* Define if you have the <signal.h> header file. */
@@ -64,8 +64,8 @@
/* Define if you have the <unistd.h> header file. */
#if defined(__MINGW32__) || defined(__WATCOMC__) || defined(__LCC__) || \
- defined(__POCC__)
-#define HAVE_UNISTD_H 1
+ defined(__POCC__)
+# define HAVE_UNISTD_H 1
#endif
/* Define if you have the <windows.h> header file. */
@@ -76,12 +76,29 @@
/* Define if you have the <winsock2.h> header file. */
#ifndef __SALFORDC__
-#define HAVE_WINSOCK2_H 1
+# define HAVE_WINSOCK2_H 1
#endif
/* Define if you have the <ws2tcpip.h> header file. */
#ifndef __SALFORDC__
-#define HAVE_WS2TCPIP_H 1
+# define HAVE_WS2TCPIP_H 1
+#endif
+
+/* Define if you have <iphlpapi.h> header file */
+#define HAVE_IPHLPAPI_H 1
+
+/* Define if you have <netioapi.h> header file */
+#ifndef __WATCOMC__
+# define HAVE_NETIOAPI_H 1
+#endif
+
+#define HAVE_SYS_TYPES_H 1
+#define HAVE_SYS_STAT_H 1
+
+/* If we are building with OpenWatcom, we need to specify that we have
+ * <stdint.h>. */
+#if defined(__WATCOMC__)
+# define HAVE_STDINT_H
#endif
/* Define to 1 if you have the <sys/uio.h> header file. */
@@ -94,15 +111,9 @@
/* OTHER HEADER INFO */
/* ---------------------------------------------------------------- */
-/* Define if sig_atomic_t is an available typedef. */
-#define HAVE_SIG_ATOMIC_T 1
-
/* Define if you have the ANSI C header files. */
#define STDC_HEADERS 1
-/* Define if you can safely include both <sys/time.h> and <time.h>. */
-/* #define TIME_WITH_SYS_TIME 1 */
-
/* ---------------------------------------------------------------- */
/* FUNCTIONS */
/* ---------------------------------------------------------------- */
@@ -202,38 +213,30 @@
/* Specifics for the Watt-32 tcp/ip stack. */
#ifdef WATT32
- #define SOCKET int
- #define NS_INADDRSZ 4
- #define HAVE_ARPA_NAMESER_H 1
- #define HAVE_ARPA_INET_H 1
- #define HAVE_NETDB_H 1
- #define HAVE_NETINET_IN_H 1
- #define HAVE_SYS_SOCKET_H 1
- #define HAVE_NETINET_TCP_H 1
- #define HAVE_AF_INET6 1
- #define HAVE_PF_INET6 1
- #define HAVE_STRUCT_IN6_ADDR 1
- #define HAVE_STRUCT_SOCKADDR_IN6 1
- #undef HAVE_WINSOCK_H
- #undef HAVE_WINSOCK2_H
- #undef HAVE_WS2TCPIP_H
+# define SOCKET int
+# define NS_INADDRSZ 4
+# define HAVE_ARPA_NAMESER_H 1
+# define HAVE_ARPA_INET_H 1
+# define HAVE_NETDB_H 1
+# define HAVE_NETINET_IN_H 1
+# define HAVE_SYS_SOCKET_H 1
+# define HAVE_NETINET_TCP_H 1
+# define HAVE_AF_INET6 1
+# define HAVE_PF_INET6 1
+# define HAVE_STRUCT_IN6_ADDR 1
+# define HAVE_STRUCT_SOCKADDR_IN6 1
+# undef HAVE_WINSOCK_H
+# undef HAVE_WINSOCK2_H
+# undef HAVE_WS2TCPIP_H
#endif
+/* Threading support enabled */
+#define CARES_THREADS 1
+
/* ---------------------------------------------------------------- */
/* TYPEDEF REPLACEMENTS */
/* ---------------------------------------------------------------- */
-/* Define if in_addr_t is not an available 'typedefed' type. */
-#define in_addr_t unsigned long
-
-/* Define to the return type of signal handlers (int or void). */
-#define RETSIGTYPE void
-
-#ifdef __cplusplus
-/* Compiling headers in C++ mode means bool is available */
-#define HAVE_BOOL_T
-#endif
-
/* ---------------------------------------------------------------- */
/* TYPE SIZES */
/* ---------------------------------------------------------------- */
@@ -247,7 +250,7 @@
/* Define if you have struct sockaddr_storage. */
#if !defined(__SALFORDC__) && !defined(__BORLANDC__)
-#define HAVE_STRUCT_SOCKADDR_STORAGE 1
+# define HAVE_STRUCT_SOCKADDR_STORAGE 1
#endif
/* Define if you have struct timeval. */
@@ -259,26 +262,22 @@
/* Define to avoid VS2005 complaining about portable C functions. */
#if defined(_MSC_VER) && (_MSC_VER >= 1400)
-# define _CRT_SECURE_NO_DEPRECATE 1
+# define _CRT_SECURE_NO_DEPRECATE 1
# define _CRT_NONSTDC_NO_DEPRECATE 1
#endif
-/* Set the Target to Vista. However, any symbols required above Win2000
- * should be loaded via LoadLibrary() */
+/* Set the Target to Win8 */
#if defined(_MSC_VER) && (_MSC_VER >= 1500)
-# define VS2008_MIN_TARGET 0x0600
+# define MSVC_MIN_TARGET 0x0602
#endif
-/* VS2008 default target settings and minimum build target check. */
+/* MSVC default target settings */
#if defined(_MSC_VER) && (_MSC_VER >= 1500)
# ifndef _WIN32_WINNT
-# define _WIN32_WINNT VS2008_MIN_TARGET
+# define _WIN32_WINNT MSVC_MIN_TARGET
# endif
# ifndef WINVER
-# define WINVER VS2008_MIN_TARGET
-# endif
-# if (_WIN32_WINNT < VS2008_MIN_TARGET) || (WINVER < VS2008_MIN_TARGET)
-# error VS2008 does not support Windows build targets prior to Windows 2000
+# define WINVER MSVC_MIN_TARGET
# endif
#endif
@@ -286,10 +285,10 @@
target is Windows Vista. */
#if defined(__POCC__) && (__POCC__ >= 500)
# ifndef _WIN32_WINNT
-# define _WIN32_WINNT 0x0600
+# define _WIN32_WINNT 0x0602
# endif
# ifndef WINVER
-# define WINVER 0x0600
+# define WINVER 0x0602
# endif
#endif
@@ -326,27 +325,38 @@
/* Define if you have address family AF_INET6. */
#ifdef HAVE_WINSOCK2_H
-#define HAVE_AF_INET6 1
+# define HAVE_AF_INET6 1
#endif
/* Define if you have protocol family PF_INET6. */
#ifdef HAVE_WINSOCK2_H
-#define HAVE_PF_INET6 1
+# define HAVE_PF_INET6 1
#endif
/* Define if you have struct in6_addr. */
#ifdef HAVE_WS2TCPIP_H
-#define HAVE_STRUCT_IN6_ADDR 1
+# define HAVE_STRUCT_IN6_ADDR 1
#endif
/* Define if you have struct sockaddr_in6. */
#ifdef HAVE_WS2TCPIP_H
-#define HAVE_STRUCT_SOCKADDR_IN6 1
+# define HAVE_STRUCT_SOCKADDR_IN6 1
#endif
/* Define if you have sockaddr_in6 with scopeid. */
#ifdef HAVE_WS2TCPIP_H
-#define HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID 1
+# define HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID 1
+#endif
+
+#if defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0600) && !defined(__WATCOMC__)
+/* Define if you have if_nametoindex() */
+# define HAVE_IF_NAMETOINDEX 1
+/* Define if you have if_indextoname() */
+# define HAVE_IF_INDEXTONAME 1
+/* Define to 1 if you have the `ConvertInterfaceIndexToLuid' function. */
+# define HAVE_CONVERTINTERFACEINDEXTOLUID 1
+/* Define to 1 if you have the `ConvertInterfaceLuidToNameA' function. */
+# define HAVE_CONVERTINTERFACELUIDTONAMEA 1
#endif
/* ---------------------------------------------------------------- */
@@ -360,10 +370,10 @@
*/
#if defined(_WIN32_WCE) && !defined(HAVE_ERRNO_H)
-# define ENOENT ERROR_FILE_NOT_FOUND
-# define ESRCH ERROR_PATH_NOT_FOUND
-# define ENOMEM ERROR_NOT_ENOUGH_MEMORY
-# define ENOSPC ERROR_INVALID_PARAMETER
+# define ENOENT ERROR_FILE_NOT_FOUND
+# define ESRCH ERROR_PATH_NOT_FOUND
+# define ENOMEM ERROR_NOT_ENOUGH_MEMORY
+# define ENOSPC ERROR_INVALID_PARAMETER
#endif
#endif /* HEADER_CARES_CONFIG_WIN32_H */
diff --git a/contrib/libs/c-ares/src/lib/inet_net_pton.c b/contrib/libs/c-ares/src/lib/inet_net_pton.c
index d3924c3767..19429f205d 100644
--- a/contrib/libs/c-ares/src/lib/inet_net_pton.c
+++ b/contrib/libs/c-ares/src/lib/inet_net_pton.c
@@ -31,11 +31,12 @@
#include "ares.h"
#include "ares_ipv6.h"
-#include "ares_nowarn.h"
#include "ares_inet_net_pton.h"
+#include "ares_private.h"
-const struct ares_in6_addr ares_in6addr_any = { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } } };
+const struct ares_in6_addr ares_in6addr_any = { { { 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0 } } };
/*
* static int
@@ -52,202 +53,233 @@ const struct ares_in6_addr ares_in6addr_any = { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,
* 0b11110000 in its fourth octet.
* note:
* On Windows we store the error in the thread errno, not
- * in the winsock error code. This is to avoid loosing the
+ * in the winsock error code. This is to avoid losing the
* actual last winsock error. So use macro ERRNO to fetch the
- * errno this funtion sets when returning (-1), not SOCKERRNO.
+ * errno this function sets when returning (-1), not SOCKERRNO.
* author:
* Paul Vixie (ISC), June 1996
*/
-static int
-ares_inet_net_pton_ipv4(const char *src, unsigned char *dst, size_t size)
+static int ares_inet_net_pton_ipv4(const char *src, unsigned char *dst,
+ size_t size)
{
- static const char xdigits[] = "0123456789abcdef";
- static const char digits[] = "0123456789";
- int n, ch, tmp = 0, dirty, bits;
+ static const char xdigits[] = "0123456789abcdef";
+ static const char digits[] = "0123456789";
+ int n;
+ int ch;
+ int tmp = 0;
+ int dirty;
+ int bits;
const unsigned char *odst = dst;
ch = *src++;
- if (ch == '0' && (src[0] == 'x' || src[0] == 'X')
- && ISASCII(src[1])
- && ISXDIGIT(src[1])) {
+ if (ch == '0' && (src[0] == 'x' || src[0] == 'X') && ISASCII(src[1]) &&
+ ISXDIGIT(src[1])) {
/* Hexadecimal: Eat nybble string. */
- if (!size)
+ if (!size) {
goto emsgsize;
+ }
dirty = 0;
- src++; /* skip x or X. */
+ src++; /* skip x or X. */
while ((ch = *src++) != '\0' && ISASCII(ch) && ISXDIGIT(ch)) {
- if (ISUPPER(ch))
+ if (ISUPPER(ch)) {
ch = tolower(ch);
- n = aresx_sztosi(strchr(xdigits, ch) - xdigits);
- if (dirty == 0)
+ }
+ n = (int)(strchr(xdigits, ch) - xdigits);
+ if (dirty == 0) {
tmp = n;
- else
+ } else {
tmp = (tmp << 4) | n;
+ }
if (++dirty == 2) {
- if (!size--)
+ if (!size--) {
goto emsgsize;
- *dst++ = (unsigned char) tmp;
- dirty = 0;
+ }
+ *dst++ = (unsigned char)tmp;
+ dirty = 0;
}
}
- if (dirty) { /* Odd trailing nybble? */
- if (!size--)
+ if (dirty) { /* Odd trailing nybble? */
+ if (!size--) {
goto emsgsize;
- *dst++ = (unsigned char) (tmp << 4);
+ }
+ *dst++ = (unsigned char)(tmp << 4);
}
} else if (ISASCII(ch) && ISDIGIT(ch)) {
/* Decimal: eat dotted digit string. */
for (;;) {
tmp = 0;
do {
- n = aresx_sztosi(strchr(digits, ch) - digits);
+ n = (int)(strchr(digits, ch) - digits);
tmp *= 10;
tmp += n;
- if (tmp > 255)
+ if (tmp > 255) {
goto enoent;
- } while ((ch = *src++) != '\0' &&
- ISASCII(ch) && ISDIGIT(ch));
- if (!size--)
+ }
+ } while ((ch = *src++) != '\0' && ISASCII(ch) && ISDIGIT(ch));
+ if (!size--) {
goto emsgsize;
- *dst++ = (unsigned char) tmp;
- if (ch == '\0' || ch == '/')
+ }
+ *dst++ = (unsigned char)tmp;
+ if (ch == '\0' || ch == '/') {
break;
- if (ch != '.')
+ }
+ if (ch != '.') {
goto enoent;
+ }
ch = *src++;
- if (!ISASCII(ch) || !ISDIGIT(ch))
+ if (!ISASCII(ch) || !ISDIGIT(ch)) {
goto enoent;
+ }
}
- } else
+ } else {
goto enoent;
+ }
bits = -1;
- if (ch == '/' && ISASCII(src[0]) &&
- ISDIGIT(src[0]) && dst > odst) {
+ if (ch == '/' && ISASCII(src[0]) && ISDIGIT(src[0]) && dst > odst) {
/* CIDR width specifier. Nothing can follow it. */
- ch = *src++; /* Skip over the /. */
+ ch = *src++; /* Skip over the /. */
bits = 0;
do {
- n = aresx_sztosi(strchr(digits, ch) - digits);
+ n = (int)(strchr(digits, ch) - digits);
bits *= 10;
bits += n;
- if (bits > 32)
+ if (bits > 32) {
goto enoent;
+ }
} while ((ch = *src++) != '\0' && ISASCII(ch) && ISDIGIT(ch));
- if (ch != '\0')
+ if (ch != '\0') {
goto enoent;
+ }
}
/* Firey death and destruction unless we prefetched EOS. */
- if (ch != '\0')
+ if (ch != '\0') {
goto enoent;
+ }
/* If nothing was written to the destination, we found no address. */
- if (dst == odst)
- goto enoent; /* LCOV_EXCL_LINE: all valid paths above increment dst */
+ if (dst == odst) {
+ goto enoent; /* LCOV_EXCL_LINE: all valid paths above increment dst */
+ }
/* If no CIDR spec was given, infer width from net class. */
if (bits == -1) {
- if (*odst >= 240) /* Class E */
+ if (*odst >= 240) { /* Class E */
bits = 32;
- else if (*odst >= 224) /* Class D */
+ } else if (*odst >= 224) { /* Class D */
bits = 8;
- else if (*odst >= 192) /* Class C */
+ } else if (*odst >= 192) { /* Class C */
bits = 24;
- else if (*odst >= 128) /* Class B */
+ } else if (*odst >= 128) { /* Class B */
bits = 16;
- else /* Class A */
+ } else { /* Class A */
bits = 8;
+ }
/* If imputed mask is narrower than specified octets, widen. */
- if (bits < ((dst - odst) * 8))
- bits = aresx_sztosi(dst - odst) * 8;
+ if (bits < ((dst - odst) * 8)) {
+ bits = (int)(dst - odst) * 8;
+ }
/*
* If there are no additional bits specified for a class D
* address adjust bits to 4.
*/
- if (bits == 8 && *odst == 224)
+ if (bits == 8 && *odst == 224) {
bits = 4;
+ }
}
/* Extend network to cover the actual mask. */
while (bits > ((dst - odst) * 8)) {
- if (!size--)
+ if (!size--) {
goto emsgsize;
+ }
*dst++ = '\0';
}
- return (bits);
+ return bits;
- enoent:
+enoent:
SET_ERRNO(ENOENT);
- return (-1);
+ return -1;
- emsgsize:
+emsgsize:
SET_ERRNO(EMSGSIZE);
- return (-1);
+ return -1;
}
-static int
-getbits(const char *src, int *bitsp)
+static int getbits(const char *src, size_t *bitsp)
{
static const char digits[] = "0123456789";
- int n;
- int val;
- char ch;
+ size_t n;
+ size_t val;
+ char ch;
val = 0;
- n = 0;
+ n = 0;
while ((ch = *src++) != '\0') {
const char *pch;
pch = strchr(digits, ch);
if (pch != NULL) {
- if (n++ != 0 && val == 0) /* no leading zeros */
- return (0);
+ if (n++ != 0 && val == 0) { /* no leading zeros */
+ return 0;
+ }
val *= 10;
- val += aresx_sztosi(pch - digits);
- if (val > 128) /* range */
- return (0);
+ val += (size_t)(pch - digits);
+ if (val > 128) { /* range */
+ return 0;
+ }
continue;
}
- return (0);
+ return 0;
+ }
+ if (n == 0) {
+ return 0;
}
- if (n == 0)
- return (0);
*bitsp = val;
- return (1);
+ return 1;
}
-
-static int
-ares_inet_pton6(const char *src, unsigned char *dst)
+static int ares_inet_pton6(const char *src, unsigned char *dst)
{
- static const char xdigits_l[] = "0123456789abcdef",
- xdigits_u[] = "0123456789ABCDEF";
- unsigned char tmp[NS_IN6ADDRSZ], *tp, *endp, *colonp;
- const char *xdigits, *curtok;
- int ch, saw_xdigit, count_xdigit;
- unsigned int val;
+ static const char xdigits_l[] = "0123456789abcdef";
+ static const char xdigits_u[] = "0123456789ABCDEF";
+ unsigned char tmp[NS_IN6ADDRSZ];
+ unsigned char *tp;
+ unsigned char *endp;
+ unsigned char *colonp;
+ const char *xdigits;
+ const char *curtok;
+ int ch;
+ int saw_xdigit;
+ int count_xdigit;
+ unsigned int val;
memset((tp = tmp), '\0', NS_IN6ADDRSZ);
- endp = tp + NS_IN6ADDRSZ;
+ endp = tp + NS_IN6ADDRSZ;
colonp = NULL;
/* Leading :: requires some special handling. */
- if (*src == ':')
- if (*++src != ':')
+ if (*src == ':') {
+ if (*++src != ':') {
goto enoent;
- curtok = src;
+ }
+ }
+ curtok = src;
saw_xdigit = count_xdigit = 0;
- val = 0;
+ val = 0;
while ((ch = *src++) != '\0') {
const char *pch;
- if ((pch = strchr((xdigits = xdigits_l), ch)) == NULL)
+ if ((pch = strchr((xdigits = xdigits_l), ch)) == NULL) {
pch = strchr((xdigits = xdigits_u), ch);
+ }
if (pch != NULL) {
- if (count_xdigit >= 4)
+ if (count_xdigit >= 4) {
goto enoent;
+ }
val <<= 4;
- val |= (unsigned int)(pch - xdigits);
- if (val > 0xffff)
+ val |= (unsigned int)(pch - xdigits);
+ if (val > 0xffff) {
goto enoent;
+ }
saw_xdigit = 1;
count_xdigit++;
continue;
@@ -255,35 +287,38 @@ ares_inet_pton6(const char *src, unsigned char *dst)
if (ch == ':') {
curtok = src;
if (!saw_xdigit) {
- if (colonp)
+ if (colonp) {
goto enoent;
+ }
colonp = tp;
continue;
} else if (*src == '\0') {
goto enoent;
}
- if (tp + NS_INT16SZ > endp)
+ if (tp + NS_INT16SZ > endp) {
goto enoent;
- *tp++ = (unsigned char) (val >> 8) & 0xff;
- *tp++ = (unsigned char) val & 0xff;
- saw_xdigit = 0;
+ }
+ *tp++ = (unsigned char)(val >> 8) & 0xff;
+ *tp++ = (unsigned char)val & 0xff;
+ saw_xdigit = 0;
count_xdigit = 0;
- val = 0;
+ val = 0;
continue;
}
if (ch == '.' && ((tp + NS_INADDRSZ) <= endp) &&
ares_inet_net_pton_ipv4(curtok, tp, NS_INADDRSZ) > 0) {
- tp += NS_INADDRSZ;
- saw_xdigit = 0;
- break; /* '\0' was seen by inet_pton4(). */
+ tp += NS_INADDRSZ;
+ saw_xdigit = 0;
+ break; /* '\0' was seen by inet_pton4(). */
}
goto enoent;
}
if (saw_xdigit) {
- if (tp + NS_INT16SZ > endp)
+ if (tp + NS_INT16SZ > endp) {
goto enoent;
- *tp++ = (unsigned char) (val >> 8) & 0xff;
- *tp++ = (unsigned char) val & 0xff;
+ }
+ *tp++ = (unsigned char)(val >> 8) & 0xff;
+ *tp++ = (unsigned char)val & 0xff;
}
if (colonp != NULL) {
/*
@@ -291,67 +326,71 @@ ares_inet_pton6(const char *src, unsigned char *dst)
* overlapping regions, we'll do the shift by hand.
*/
const int n = (int)(tp - colonp);
- int i;
+ int i;
- if (tp == endp)
+ if (tp == endp) {
goto enoent;
+ }
for (i = 1; i <= n; i++) {
- endp[- i] = colonp[n - i];
+ endp[-i] = colonp[n - i];
colonp[n - i] = 0;
}
tp = endp;
}
- if (tp != endp)
+ if (tp != endp) {
goto enoent;
+ }
memcpy(dst, tmp, NS_IN6ADDRSZ);
- return (1);
+ return 1;
enoent:
SET_ERRNO(ENOENT);
- return (-1);
+ return -1;
}
-static int
-ares_inet_net_pton_ipv6(const char *src, unsigned char *dst, size_t size)
+static int ares_inet_net_pton_ipv6(const char *src, unsigned char *dst,
+ size_t size)
{
struct ares_in6_addr in6;
int ret;
- int bits;
+ size_t bits;
size_t bytes;
char buf[INET6_ADDRSTRLEN + sizeof("/128")];
char *sep;
- if (strlen(src) >= sizeof buf) {
+ if (ares_strlen(src) >= sizeof buf) {
SET_ERRNO(EMSGSIZE);
- return (-1);
+ return -1;
}
- strncpy(buf, src, sizeof buf);
+ ares_strcpy(buf, src, sizeof buf);
sep = strchr(buf, '/');
- if (sep != NULL)
+ if (sep != NULL) {
*sep++ = '\0';
+ }
ret = ares_inet_pton6(buf, (unsigned char *)&in6);
- if (ret != 1)
- return (-1);
+ if (ret != 1) {
+ return -1;
+ }
- if (sep == NULL)
+ if (sep == NULL) {
bits = 128;
- else {
+ } else {
if (!getbits(sep, &bits)) {
SET_ERRNO(ENOENT);
- return (-1);
+ return -1;
}
}
bytes = (bits + 7) / 8;
if (bytes > size) {
SET_ERRNO(EMSGSIZE);
- return (-1);
+ return -1;
}
memcpy(dst, &in6, bytes);
- return (bits);
+ return (int)bits;
}
/*
@@ -366,42 +405,41 @@ ares_inet_net_pton_ipv6(const char *src, unsigned char *dst, size_t size)
* not a valid network specification.
* note:
* On Windows we store the error in the thread errno, not
- * in the winsock error code. This is to avoid loosing the
+ * in the winsock error code. This is to avoid losing the
* actual last winsock error. So use macro ERRNO to fetch the
- * errno this funtion sets when returning (-1), not SOCKERRNO.
+ * errno this function sets when returning (-1), not SOCKERRNO.
* author:
* Paul Vixie (ISC), June 1996
*/
-int
-ares_inet_net_pton(int af, const char *src, void *dst, size_t size)
+int ares_inet_net_pton(int af, const char *src, void *dst, size_t size)
{
switch (af) {
- case AF_INET:
- return (ares_inet_net_pton_ipv4(src, dst, size));
- case AF_INET6:
- return (ares_inet_net_pton_ipv6(src, dst, size));
- default:
- SET_ERRNO(EAFNOSUPPORT);
- return (-1);
+ case AF_INET:
+ return ares_inet_net_pton_ipv4(src, dst, size);
+ case AF_INET6:
+ return ares_inet_net_pton_ipv6(src, dst, size);
+ default:
+ SET_ERRNO(EAFNOSUPPORT);
+ return -1;
}
}
int ares_inet_pton(int af, const char *src, void *dst)
{
- int result;
+ int result;
size_t size;
- if (af == AF_INET)
+ if (af == AF_INET) {
size = sizeof(struct in_addr);
- else if (af == AF_INET6)
+ } else if (af == AF_INET6) {
size = sizeof(struct ares_in6_addr);
- else
- {
+ } else {
SET_ERRNO(EAFNOSUPPORT);
return -1;
}
result = ares_inet_net_pton(af, src, dst, size);
- if (result == -1 && ERRNO == ENOENT)
+ if (result == -1 && ERRNO == ENOENT) {
return 0;
- return (result > -1 ? 1 : -1);
+ }
+ return (result > -1) ? 1 : -1;
}
diff --git a/contrib/libs/c-ares/src/lib/inet_ntop.c b/contrib/libs/c-ares/src/lib/inet_ntop.c
index 246d630647..622befa995 100644
--- a/contrib/libs/c-ares/src/lib/inet_ntop.c
+++ b/contrib/libs/c-ares/src/lib/inet_ntop.c
@@ -30,6 +30,7 @@
#include "ares.h"
#include "ares_ipv6.h"
+#include "ares_private.h"
#ifndef HAVE_INET_NTOP
@@ -48,23 +49,23 @@ static const char *inet_ntop6(const unsigned char *src, char *dst, size_t size);
* pointer to presentation format address (`dst'), or NULL (see errno).
* note:
* On Windows we store the error in the thread errno, not
- * in the winsock error code. This is to avoid loosing the
+ * in the winsock error code. This is to avoid losing the
* actual last winsock error. So use macro ERRNO to fetch the
* errno this function sets when returning NULL, not SOCKERRNO.
* author:
* Paul Vixie, 1996.
*/
-const char *
-ares_inet_ntop(int af, const void *src, char *dst, ares_socklen_t size)
+const char *ares_inet_ntop(int af, const void *src, char *dst,
+ ares_socklen_t size)
{
switch (af) {
- case AF_INET:
- return (inet_ntop4(src, dst, (size_t)size));
- case AF_INET6:
- return (inet_ntop6(src, dst, (size_t)size));
- default:
- SET_ERRNO(EAFNOSUPPORT);
- return (NULL);
+ case AF_INET:
+ return (inet_ntop4(src, dst, (size_t)size));
+ case AF_INET6:
+ return (inet_ntop6(src, dst, (size_t)size));
+ default:
+ SET_ERRNO(EAFNOSUPPORT);
+ return (NULL);
}
/* NOTREACHED */
}
@@ -80,17 +81,17 @@ ares_inet_ntop(int af, const void *src, char *dst, ares_socklen_t size)
* author:
* Paul Vixie, 1996.
*/
-static const char *
-inet_ntop4(const unsigned char *src, char *dst, size_t size)
+static const char *inet_ntop4(const unsigned char *src, char *dst, size_t size)
{
static const char fmt[] = "%u.%u.%u.%u";
- char tmp[sizeof("255.255.255.255")];
+ char tmp[sizeof("255.255.255.255")];
- if ((size_t)snprintf(tmp, sizeof(tmp), fmt, src[0], src[1], src[2], src[3]) >= size) {
+ if ((size_t)snprintf(tmp, sizeof(tmp), fmt, src[0], src[1], src[2], src[3]) >=
+ size) {
SET_ERRNO(ENOSPC);
return (NULL);
}
- strcpy(dst, tmp);
+ ares_strcpy(dst, tmp, size);
return (dst);
}
@@ -100,8 +101,7 @@ inet_ntop4(const unsigned char *src, char *dst, size_t size)
* author:
* Paul Vixie, 1996.
*/
-static const char *
-inet_ntop6(const unsigned char *src, char *dst, size_t size)
+static const char *inet_ntop6(const unsigned char *src, char *dst, size_t size)
{
/*
* Note that int32_t and int16_t need only be "at least" large enough
@@ -110,11 +110,15 @@ inet_ntop6(const unsigned char *src, char *dst, size_t size)
* Keep this in mind if you think this function should have been coded
* to use pointer overlays. All the world's not a VAX.
*/
- char tmp[sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")];
+ char tmp[sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")];
char *tp;
- struct { int base, len; } best, cur;
+
+ struct {
+ int base, len;
+ } best, cur;
+
unsigned int words[NS_IN6ADDRSZ / NS_INT16SZ];
- int i;
+ int i;
/*
* Preprocess:
@@ -122,32 +126,37 @@ inet_ntop6(const unsigned char *src, char *dst, size_t size)
* Find the longest run of 0x00's in src[] for :: shorthanding.
*/
memset(words, '\0', sizeof(words));
- for (i = 0; i < NS_IN6ADDRSZ; i++)
- words[i / 2] |= (src[i] << ((1 - (i % 2)) << 3));
+ for (i = 0; i < NS_IN6ADDRSZ; i++) {
+ words[i / 2] |= (unsigned int)(src[i] << ((1 - (i % 2)) << 3));
+ }
best.base = -1;
- best.len = 0;
- cur.base = -1;
- cur.len = 0;
+ best.len = 0;
+ cur.base = -1;
+ cur.len = 0;
for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) {
if (words[i] == 0) {
- if (cur.base == -1)
+ if (cur.base == -1) {
cur.base = i, cur.len = 1;
- else
+ } else {
cur.len++;
+ }
} else {
if (cur.base != -1) {
- if (best.base == -1 || cur.len > best.len)
+ if (best.base == -1 || cur.len > best.len) {
best = cur;
+ }
cur.base = -1;
}
}
}
if (cur.base != -1) {
- if (best.base == -1 || cur.len > best.len)
+ if (best.base == -1 || cur.len > best.len) {
best = cur;
+ }
}
- if (best.base != -1 && best.len < 2)
+ if (best.base != -1 && best.len < 2) {
best.base = -1;
+ }
/*
* Format the result.
@@ -155,29 +164,33 @@ inet_ntop6(const unsigned char *src, char *dst, size_t size)
tp = tmp;
for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) {
/* Are we inside the best run of 0x00's? */
- if (best.base != -1 && i >= best.base &&
- i < (best.base + best.len)) {
- if (i == best.base)
+ if (best.base != -1 && i >= best.base && i < (best.base + best.len)) {
+ if (i == best.base) {
*tp++ = ':';
+ }
continue;
}
/* Are we following an initial run of 0x00s or any real hex? */
- if (i != 0)
+ if (i != 0) {
*tp++ = ':';
+ }
/* Is this address an encapsulated IPv4? */
- if (i == 6 && best.base == 0 && (best.len == 6 ||
- (best.len == 7 && words[7] != 0x0001) ||
- (best.len == 5 && words[5] == 0xffff))) {
- if (!inet_ntop4(src+12, tp, sizeof(tmp) - (tp - tmp)))
+ if (i == 6 && best.base == 0 &&
+ (best.len == 6 || (best.len == 7 && words[7] != 0x0001) ||
+ (best.len == 5 && words[5] == 0xffff))) {
+ if (!inet_ntop4(src + 12, tp, sizeof(tmp) - (size_t)(tp - tmp))) {
return (NULL);
- tp += strlen(tp);
+ }
+ tp += ares_strlen(tp);
break;
}
- tp += snprintf(tp, sizeof(tmp)-(tp-tmp), "%x", words[i]);
+ tp += snprintf(tp, sizeof(tmp) - (size_t)(tp - tmp), "%x", words[i]);
}
/* Was it a trailing run of 0x00's? */
- if (best.base != -1 && (best.base + best.len) == (NS_IN6ADDRSZ / NS_INT16SZ))
+ if (best.base != -1 &&
+ (best.base + best.len) == (NS_IN6ADDRSZ / NS_INT16SZ)) {
*tp++ = ':';
+ }
*tp++ = '\0';
/*
@@ -187,14 +200,14 @@ inet_ntop6(const unsigned char *src, char *dst, size_t size)
SET_ERRNO(ENOSPC);
return (NULL);
}
- strcpy(dst, tmp);
+ ares_strcpy(dst, tmp, size);
return (dst);
}
-#else /* HAVE_INET_NTOP */
+#else /* HAVE_INET_NTOP */
-const char *
-ares_inet_ntop(int af, const void *src, char *dst, ares_socklen_t size)
+const char *ares_inet_ntop(int af, const void *src, char *dst,
+ ares_socklen_t size)
{
/* just relay this to the underlying function */
return inet_ntop(af, src, dst, size);
diff --git a/contrib/libs/c-ares/src/lib/setup_once.h b/contrib/libs/c-ares/src/lib/setup_once.h
index 1e9c531a9d..38527ec442 100644
--- a/contrib/libs/c-ares/src/lib/setup_once.h
+++ b/contrib/libs/c-ares/src/lib/setup_once.h
@@ -48,47 +48,40 @@
#include <ctype.h>
#ifdef HAVE_ERRNO_H
-#include <errno.h>
+# include <errno.h>
#endif
#ifdef HAVE_SYS_TYPES_H
-#include <sys/types.h>
+# include <sys/types.h>
#endif
#ifdef NEED_MALLOC_H
-#include <malloc.h>
+# include <malloc.h>
#endif
#ifdef NEED_MEMORY_H
-#include <memory.h>
+# include <memory.h>
#endif
#ifdef HAVE_SYS_STAT_H
-#include <sys/stat.h>
+# include <sys/stat.h>
#endif
#ifdef HAVE_SYS_TIME_H
-#include <sys/time.h>
-#ifdef TIME_WITH_SYS_TIME
-#include <time.h>
+# include <sys/time.h>
#endif
-#else
+
#ifdef HAVE_TIME_H
-#include <time.h>
-#endif
+# include <time.h>
#endif
#ifdef WIN32
-#include <io.h>
-#include <fcntl.h>
-#endif
-
-#if defined(HAVE_STDBOOL_H) && defined(HAVE_BOOL_T)
-#include <stdbool.h>
+# include <io.h>
+# include <fcntl.h>
#endif
#ifdef HAVE_UNISTD_H
-#include <unistd.h>
+# include <unistd.h>
#endif
#ifdef __hpux
@@ -102,12 +95,8 @@
# endif
#endif
-#ifdef HAVE_SYS_RANDOM_H
-#include <sys/random.h>
-#endif
-
#ifdef HAVE_SYS_SOCKET_H
-#include <sys/socket.h>
+# include <sys/socket.h>
#endif
#ifdef __hpux
@@ -126,8 +115,8 @@
#ifndef HAVE_STRUCT_TIMEVAL
struct timeval {
- long tv_sec;
- long tv_usec;
+ long tv_sec;
+ long tv_usec;
};
#endif
@@ -138,17 +127,17 @@ struct timeval {
*/
#if defined(HAVE_MSG_NOSIGNAL) && defined(MSG_NOSIGNAL)
-#define SEND_4TH_ARG MSG_NOSIGNAL
+# define SEND_4TH_ARG MSG_NOSIGNAL
#else
-#define SEND_4TH_ARG 0
+# define SEND_4TH_ARG 0
#endif
#if defined(__minix)
/* Minix doesn't support recv on TCP sockets */
-#define sread(x,y,z) (ares_ssize_t)read((RECV_TYPE_ARG1)(x), \
- (RECV_TYPE_ARG2)(y), \
- (RECV_TYPE_ARG3)(z))
+# define sread(x, y, z) \
+ (ares_ssize_t) \
+ read((RECV_TYPE_ARG1)(x), (RECV_TYPE_ARG2)(y), (RECV_TYPE_ARG3)(z))
#elif defined(HAVE_RECV)
/*
@@ -173,97 +162,86 @@ struct timeval {
* SEND_TYPE_RETV must also be defined.
*/
-#if !defined(RECV_TYPE_ARG1) || \
- !defined(RECV_TYPE_ARG2) || \
- !defined(RECV_TYPE_ARG3) || \
- !defined(RECV_TYPE_ARG4) || \
+# if !defined(RECV_TYPE_ARG1) || !defined(RECV_TYPE_ARG2) || \
+ !defined(RECV_TYPE_ARG3) || !defined(RECV_TYPE_ARG4) || \
!defined(RECV_TYPE_RETV)
- /* */
- Error Missing_definition_of_return_and_arguments_types_of_recv
- /* */
-#else
-#define sread(x,y,z) (ares_ssize_t)recv((RECV_TYPE_ARG1)(x), \
- (RECV_TYPE_ARG2)(y), \
- (RECV_TYPE_ARG3)(z), \
- (RECV_TYPE_ARG4)(0))
-#endif
+/* */
+Error Missing_definition_of_return_and_arguments_types_of_recv
+/* */
+# else
+# define sread(x, y, z) \
+ (ares_ssize_t) recv((RECV_TYPE_ARG1)(x), (RECV_TYPE_ARG2)(y), \
+ (RECV_TYPE_ARG3)(z), (RECV_TYPE_ARG4)(0))
+# endif
#else /* HAVE_RECV */
-#ifndef sread
- /* */
- Error Missing_definition_of_macro_sread
- /* */
-#endif
+# ifndef sread
+/* */
+Error Missing_definition_of_macro_sread
+/* */
+# endif
#endif /* HAVE_RECV */
#if defined(__minix)
/* Minix doesn't support send on TCP sockets */
-#define swrite(x,y,z) (ares_ssize_t)write((SEND_TYPE_ARG1)(x), \
- (SEND_TYPE_ARG2)(y), \
- (SEND_TYPE_ARG3)(z))
+# define swrite(x, y, z) \
+ (ares_ssize_t) \
+ write((SEND_TYPE_ARG1)(x), (SEND_TYPE_ARG2)(y), (SEND_TYPE_ARG3)(z))
#elif defined(HAVE_SEND)
-#if !defined(SEND_TYPE_ARG1) || \
- !defined(SEND_QUAL_ARG2) || \
- !defined(SEND_TYPE_ARG2) || \
- !defined(SEND_TYPE_ARG3) || \
- !defined(SEND_TYPE_ARG4) || \
- !defined(SEND_TYPE_RETV)
+# if !defined(SEND_TYPE_ARG1) || !defined(SEND_QUAL_ARG2) || \
+ !defined(SEND_TYPE_ARG2) || !defined(SEND_TYPE_ARG3) || \
+ !defined(SEND_TYPE_ARG4) || !defined(SEND_TYPE_RETV)
/* */
Error Missing_definition_of_return_and_arguments_types_of_send
- /* */
-#else
-#define swrite(x,y,z) (ares_ssize_t)send((SEND_TYPE_ARG1)(x), \
- (SEND_TYPE_ARG2)(y), \
- (SEND_TYPE_ARG3)(z), \
- (SEND_TYPE_ARG4)(SEND_4TH_ARG))
-#endif
+/* */
+# else
+# define swrite(x, y, z) \
+ (ares_ssize_t) send((SEND_TYPE_ARG1)(x), (SEND_TYPE_ARG2)(y), \
+ (SEND_TYPE_ARG3)(z), (SEND_TYPE_ARG4)(SEND_4TH_ARG))
+# endif
#else /* HAVE_SEND */
-#ifndef swrite
+# ifndef swrite
/* */
Error Missing_definition_of_macro_swrite
- /* */
-#endif
+/* */
+# endif
#endif /* HAVE_SEND */
#if 0
-#if defined(HAVE_RECVFROM)
+# if defined(HAVE_RECVFROM)
/*
* Currently recvfrom is only used on udp sockets.
*/
-#if !defined(RECVFROM_TYPE_ARG1) || \
- !defined(RECVFROM_TYPE_ARG2) || \
- !defined(RECVFROM_TYPE_ARG3) || \
- !defined(RECVFROM_TYPE_ARG4) || \
- !defined(RECVFROM_TYPE_ARG5) || \
- !defined(RECVFROM_TYPE_ARG6) || \
- !defined(RECVFROM_TYPE_RETV)
+# if !defined(RECVFROM_TYPE_ARG1) || !defined(RECVFROM_TYPE_ARG2) || \
+ !defined(RECVFROM_TYPE_ARG3) || !defined(RECVFROM_TYPE_ARG4) || \
+ !defined(RECVFROM_TYPE_ARG5) || !defined(RECVFROM_TYPE_ARG6) || \
+ !defined(RECVFROM_TYPE_RETV)
/* */
Error Missing_definition_of_return_and_arguments_types_of_recvfrom
/* */
-#else
-#define sreadfrom(s,b,bl,f,fl) (ares_ssize_t)recvfrom((RECVFROM_TYPE_ARG1) (s), \
- (RECVFROM_TYPE_ARG2 *)(b), \
- (RECVFROM_TYPE_ARG3) (bl), \
- (RECVFROM_TYPE_ARG4) (0), \
- (RECVFROM_TYPE_ARG5 *)(f), \
- (RECVFROM_TYPE_ARG6 *)(fl))
-#endif
-#else /* HAVE_RECVFROM */
-#ifndef sreadfrom
+# else
+# define sreadfrom(s, b, bl, f, fl) \
+ (ares_ssize_t) \
+ recvfrom((RECVFROM_TYPE_ARG1)(s), (RECVFROM_TYPE_ARG2 *)(b), \
+ (RECVFROM_TYPE_ARG3)(bl), (RECVFROM_TYPE_ARG4)(0), \
+ (RECVFROM_TYPE_ARG5 *)(f), (RECVFROM_TYPE_ARG6 *)(fl))
+# endif
+# else /* HAVE_RECVFROM */
+# ifndef sreadfrom
/* */
Error Missing_definition_of_macro_sreadfrom
/* */
-#endif
-#endif /* HAVE_RECVFROM */
+# endif
+# endif /* HAVE_RECVFROM */
-#ifdef RECVFROM_TYPE_ARG6_IS_VOID
-# define RECVFROM_ARG6_T int
-#else
-# define RECVFROM_ARG6_T RECVFROM_TYPE_ARG6
-#endif
+# ifdef RECVFROM_TYPE_ARG6_IS_VOID
+# define RECVFROM_ARG6_T int
+# else
+# define RECVFROM_ARG6_T RECVFROM_TYPE_ARG6
+# endif
#endif /* if 0 */
@@ -272,13 +250,13 @@ struct timeval {
*/
#if defined(HAVE_CLOSESOCKET)
-# define sclose(x) closesocket((x))
+# define sclose(x) closesocket((x))
#elif defined(HAVE_CLOSESOCKET_CAMEL)
-# define sclose(x) CloseSocket((x))
+# define sclose(x) CloseSocket((x))
#elif defined(HAVE_CLOSE_S)
-# define sclose(x) close_s((x))
+# define sclose(x) close_s((x))
#else
-# define sclose(x) close((x))
+# define sclose(x) close((x))
#endif
@@ -287,73 +265,21 @@ struct timeval {
* avoid negative number inputs with argument byte codes > 127.
*/
-#define ISSPACE(x) (isspace((int) ((unsigned char)x)))
-#define ISDIGIT(x) (isdigit((int) ((unsigned char)x)))
-#define ISALNUM(x) (isalnum((int) ((unsigned char)x)))
-#define ISXDIGIT(x) (isxdigit((int) ((unsigned char)x)))
-#define ISGRAPH(x) (isgraph((int) ((unsigned char)x)))
-#define ISALPHA(x) (isalpha((int) ((unsigned char)x)))
-#define ISPRINT(x) (isprint((int) ((unsigned char)x)))
-#define ISUPPER(x) (isupper((int) ((unsigned char)x)))
-#define ISLOWER(x) (islower((int) ((unsigned char)x)))
-#define ISASCII(x) (isascii((int) ((unsigned char)x)))
-
-#define ISBLANK(x) (int)((((unsigned char)x) == ' ') || \
- (((unsigned char)x) == '\t'))
-
-#define TOLOWER(x) (tolower((int) ((unsigned char)x)))
-
-
-/*
- * 'bool' stuff compatible with HP-UX headers.
- */
-
-#if defined(__hpux) && !defined(HAVE_BOOL_T)
- typedef int bool;
-# define false 0
-# define true 1
-# define HAVE_BOOL_T
-#endif
-
-
-/*
- * 'bool' exists on platforms with <stdbool.h>, i.e. C99 platforms.
- * On non-C99 platforms there's no bool, so define an enum for that.
- * On C99 platforms 'false' and 'true' also exist. Enum uses a
- * global namespace though, so use bool_false and bool_true.
- */
-
-#ifndef HAVE_BOOL_T
- typedef enum {
- bool_false = 0,
- bool_true = 1
- } bool;
-
-/*
- * Use a define to let 'true' and 'false' use those enums. There
- * are currently no use of true and false in libcurl proper, but
- * there are some in the examples. This will cater for any later
- * code happening to use true and false.
- */
-# define false bool_false
-# define true bool_true
-# define HAVE_BOOL_T
-#endif
-
+#define ISSPACE(x) (isspace((int)((unsigned char)x)))
+#define ISDIGIT(x) (isdigit((int)((unsigned char)x)))
+#define ISALNUM(x) (isalnum((int)((unsigned char)x)))
+#define ISXDIGIT(x) (isxdigit((int)((unsigned char)x)))
+#define ISGRAPH(x) (isgraph((int)((unsigned char)x)))
+#define ISALPHA(x) (isalpha((int)((unsigned char)x)))
+#define ISPRINT(x) (isprint((int)((unsigned char)x)))
+#define ISUPPER(x) (isupper((int)((unsigned char)x)))
+#define ISLOWER(x) (islower((int)((unsigned char)x)))
+#define ISASCII(x) (((unsigned char)x) <= 127 ? 1 : 0)
-/*
- * Redefine TRUE and FALSE too, to catch current use. With this
- * change, 'bool found = 1' will give a warning on MIPSPro, but
- * 'bool found = TRUE' will not. Change tested on IRIX/MIPSPro,
- * AIX 5.1/Xlc, Tru64 5.1/cc, w/make test too.
- */
+#define ISBLANK(x) \
+ (int)((((unsigned char)x) == ' ') || (((unsigned char)x) == '\t'))
-#ifndef TRUE
-#define TRUE true
-#endif
-#ifndef FALSE
-#define FALSE false
-#endif
+#define TOLOWER(x) (tolower((int)((unsigned char)x)))
/*
@@ -361,60 +287,31 @@ struct timeval {
* avoiding compiler warnings. Mostly intended for other macro definitions.
*/
-#define WHILE_FALSE while(0)
+#define WHILE_FALSE while (0)
#if defined(_MSC_VER) && !defined(__POCC__)
# undef WHILE_FALSE
# if (_MSC_VER < 1500)
-# define WHILE_FALSE while(1, 0)
+# define WHILE_FALSE while (1, 0)
# else
-# define WHILE_FALSE \
-__pragma(warning(push)) \
-__pragma(warning(disable:4127)) \
-while(0) \
-__pragma(warning(pop))
+# define WHILE_FALSE \
+ __pragma(warning(push)) __pragma(warning(disable : 4127)) while (0) \
+ __pragma(warning(pop))
# endif
#endif
/*
- * Typedef to 'int' if sig_atomic_t is not an available 'typedefed' type.
- */
-
-#ifndef HAVE_SIG_ATOMIC_T
-typedef int sig_atomic_t;
-#define HAVE_SIG_ATOMIC_T
-#endif
-
-
-/*
- * Convenience SIG_ATOMIC_T definition
- */
-
-#ifdef HAVE_SIG_ATOMIC_T_VOLATILE
-#define SIG_ATOMIC_T static sig_atomic_t
-#else
-#define SIG_ATOMIC_T static volatile sig_atomic_t
-#endif
-
-
-/*
- * Default return type for signal handlers.
- */
-
-#ifndef RETSIGTYPE
-#define RETSIGTYPE void
-#endif
-
-
-/*
* Macro used to include code only in debug builds.
*/
#ifdef DEBUGBUILD
-#define DEBUGF(x) x
+# define DEBUGF(x) x
#else
-#define DEBUGF(x) do { } WHILE_FALSE
+# define DEBUGF(x) \
+ do { \
+ } \
+ WHILE_FALSE
#endif
@@ -423,9 +320,12 @@ typedef int sig_atomic_t;
*/
#if defined(DEBUGBUILD) && defined(HAVE_ASSERT_H)
-#define DEBUGASSERT(x) assert(x)
+# define DEBUGASSERT(x) assert(x)
#else
-#define DEBUGASSERT(x) do { } WHILE_FALSE
+# define DEBUGASSERT(x) \
+ do { \
+ } \
+ WHILE_FALSE
#endif
@@ -435,11 +335,11 @@ typedef int sig_atomic_t;
*/
#ifdef USE_WINSOCK
-#define SOCKERRNO ((int)WSAGetLastError())
-#define SET_SOCKERRNO(x) (WSASetLastError((int)(x)))
+# define SOCKERRNO ((int)WSAGetLastError())
+# define SET_SOCKERRNO(x) (WSASetLastError((int)(x)))
#else
-#define SOCKERRNO (errno)
-#define SET_SOCKERRNO(x) (errno = (x))
+# define SOCKERRNO (errno)
+# define SET_SOCKERRNO(x) (errno = (x))
#endif
@@ -449,11 +349,11 @@ typedef int sig_atomic_t;
*/
#if defined(WIN32) && !defined(WATT32)
-#define ERRNO ((int)GetLastError())
-#define SET_ERRNO(x) (SetLastError((DWORD)(x)))
+# define ERRNO ((int)GetLastError())
+# define SET_ERRNO(x) (SetLastError((DWORD)(x)))
#else
-#define ERRNO (errno)
-#define SET_ERRNO(x) (errno = (x))
+# define ERRNO (errno)
+# define SET_ERRNO(x) (errno = (x))
#endif
@@ -462,78 +362,78 @@ typedef int sig_atomic_t;
*/
#ifdef USE_WINSOCK
-#undef EBADF /* override definition in errno.h */
-#define EBADF WSAEBADF
-#undef EINTR /* override definition in errno.h */
-#define EINTR WSAEINTR
-#undef EINVAL /* override definition in errno.h */
-#define EINVAL WSAEINVAL
-#undef EWOULDBLOCK /* override definition in errno.h */
-#define EWOULDBLOCK WSAEWOULDBLOCK
-#undef EINPROGRESS /* override definition in errno.h */
-#define EINPROGRESS WSAEINPROGRESS
-#undef EALREADY /* override definition in errno.h */
-#define EALREADY WSAEALREADY
-#undef ENOTSOCK /* override definition in errno.h */
-#define ENOTSOCK WSAENOTSOCK
-#undef EDESTADDRREQ /* override definition in errno.h */
-#define EDESTADDRREQ WSAEDESTADDRREQ
-#undef EMSGSIZE /* override definition in errno.h */
-#define EMSGSIZE WSAEMSGSIZE
-#undef EPROTOTYPE /* override definition in errno.h */
-#define EPROTOTYPE WSAEPROTOTYPE
-#undef ENOPROTOOPT /* override definition in errno.h */
-#define ENOPROTOOPT WSAENOPROTOOPT
-#undef EPROTONOSUPPORT /* override definition in errno.h */
-#define EPROTONOSUPPORT WSAEPROTONOSUPPORT
-#define ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT
-#undef EOPNOTSUPP /* override definition in errno.h */
-#define EOPNOTSUPP WSAEOPNOTSUPP
-#define EPFNOSUPPORT WSAEPFNOSUPPORT
-#undef EAFNOSUPPORT /* override definition in errno.h */
-#define EAFNOSUPPORT WSAEAFNOSUPPORT
-#undef EADDRINUSE /* override definition in errno.h */
-#define EADDRINUSE WSAEADDRINUSE
-#undef EADDRNOTAVAIL /* override definition in errno.h */
-#define EADDRNOTAVAIL WSAEADDRNOTAVAIL
-#undef ENETDOWN /* override definition in errno.h */
-#define ENETDOWN WSAENETDOWN
-#undef ENETUNREACH /* override definition in errno.h */
-#define ENETUNREACH WSAENETUNREACH
-#undef ENETRESET /* override definition in errno.h */
-#define ENETRESET WSAENETRESET
-#undef ECONNABORTED /* override definition in errno.h */
-#define ECONNABORTED WSAECONNABORTED
-#undef ECONNRESET /* override definition in errno.h */
-#define ECONNRESET WSAECONNRESET
-#undef ENOBUFS /* override definition in errno.h */
-#define ENOBUFS WSAENOBUFS
-#undef EISCONN /* override definition in errno.h */
-#define EISCONN WSAEISCONN
-#undef ENOTCONN /* override definition in errno.h */
-#define ENOTCONN WSAENOTCONN
-#define ESHUTDOWN WSAESHUTDOWN
-#define ETOOMANYREFS WSAETOOMANYREFS
-#undef ETIMEDOUT /* override definition in errno.h */
-#define ETIMEDOUT WSAETIMEDOUT
-#undef ECONNREFUSED /* override definition in errno.h */
-#define ECONNREFUSED WSAECONNREFUSED
-#undef ELOOP /* override definition in errno.h */
-#define ELOOP WSAELOOP
-#ifndef ENAMETOOLONG /* possible previous definition in errno.h */
-#define ENAMETOOLONG WSAENAMETOOLONG
-#endif
-#define EHOSTDOWN WSAEHOSTDOWN
-#undef EHOSTUNREACH /* override definition in errno.h */
-#define EHOSTUNREACH WSAEHOSTUNREACH
-#ifndef ENOTEMPTY /* possible previous definition in errno.h */
-#define ENOTEMPTY WSAENOTEMPTY
-#endif
-#define EPROCLIM WSAEPROCLIM
-#define EUSERS WSAEUSERS
-#define EDQUOT WSAEDQUOT
-#define ESTALE WSAESTALE
-#define EREMOTE WSAEREMOTE
+# undef EBADF /* override definition in errno.h */
+# define EBADF WSAEBADF
+# undef EINTR /* override definition in errno.h */
+# define EINTR WSAEINTR
+# undef EINVAL /* override definition in errno.h */
+# define EINVAL WSAEINVAL
+# undef EWOULDBLOCK /* override definition in errno.h */
+# define EWOULDBLOCK WSAEWOULDBLOCK
+# undef EINPROGRESS /* override definition in errno.h */
+# define EINPROGRESS WSAEINPROGRESS
+# undef EALREADY /* override definition in errno.h */
+# define EALREADY WSAEALREADY
+# undef ENOTSOCK /* override definition in errno.h */
+# define ENOTSOCK WSAENOTSOCK
+# undef EDESTADDRREQ /* override definition in errno.h */
+# define EDESTADDRREQ WSAEDESTADDRREQ
+# undef EMSGSIZE /* override definition in errno.h */
+# define EMSGSIZE WSAEMSGSIZE
+# undef EPROTOTYPE /* override definition in errno.h */
+# define EPROTOTYPE WSAEPROTOTYPE
+# undef ENOPROTOOPT /* override definition in errno.h */
+# define ENOPROTOOPT WSAENOPROTOOPT
+# undef EPROTONOSUPPORT /* override definition in errno.h */
+# define EPROTONOSUPPORT WSAEPROTONOSUPPORT
+# define ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT
+# undef EOPNOTSUPP /* override definition in errno.h */
+# define EOPNOTSUPP WSAEOPNOTSUPP
+# define EPFNOSUPPORT WSAEPFNOSUPPORT
+# undef EAFNOSUPPORT /* override definition in errno.h */
+# define EAFNOSUPPORT WSAEAFNOSUPPORT
+# undef EADDRINUSE /* override definition in errno.h */
+# define EADDRINUSE WSAEADDRINUSE
+# undef EADDRNOTAVAIL /* override definition in errno.h */
+# define EADDRNOTAVAIL WSAEADDRNOTAVAIL
+# undef ENETDOWN /* override definition in errno.h */
+# define ENETDOWN WSAENETDOWN
+# undef ENETUNREACH /* override definition in errno.h */
+# define ENETUNREACH WSAENETUNREACH
+# undef ENETRESET /* override definition in errno.h */
+# define ENETRESET WSAENETRESET
+# undef ECONNABORTED /* override definition in errno.h */
+# define ECONNABORTED WSAECONNABORTED
+# undef ECONNRESET /* override definition in errno.h */
+# define ECONNRESET WSAECONNRESET
+# undef ENOBUFS /* override definition in errno.h */
+# define ENOBUFS WSAENOBUFS
+# undef EISCONN /* override definition in errno.h */
+# define EISCONN WSAEISCONN
+# undef ENOTCONN /* override definition in errno.h */
+# define ENOTCONN WSAENOTCONN
+# define ESHUTDOWN WSAESHUTDOWN
+# define ETOOMANYREFS WSAETOOMANYREFS
+# undef ETIMEDOUT /* override definition in errno.h */
+# define ETIMEDOUT WSAETIMEDOUT
+# undef ECONNREFUSED /* override definition in errno.h */
+# define ECONNREFUSED WSAECONNREFUSED
+# undef ELOOP /* override definition in errno.h */
+# define ELOOP WSAELOOP
+# ifndef ENAMETOOLONG /* possible previous definition in errno.h */
+# define ENAMETOOLONG WSAENAMETOOLONG
+# endif
+# define EHOSTDOWN WSAEHOSTDOWN
+# undef EHOSTUNREACH /* override definition in errno.h */
+# define EHOSTUNREACH WSAEHOSTUNREACH
+# ifndef ENOTEMPTY /* possible previous definition in errno.h */
+# define ENOTEMPTY WSAENOTEMPTY
+# endif
+# define EPROCLIM WSAEPROCLIM
+# define EUSERS WSAEUSERS
+# define EDQUOT WSAEDQUOT
+# define ESTALE WSAESTALE
+# define EREMOTE WSAEREMOTE
#endif
@@ -541,9 +441,9 @@ typedef int sig_atomic_t;
* Actually use __32_getpwuid() on 64-bit VMS builds for getpwuid()
*/
-#if defined(__VMS) && \
- defined(__INITIAL_POINTER_SIZE) && (__INITIAL_POINTER_SIZE == 64)
-#define getpwuid __32_getpwuid
+#if defined(__VMS) && defined(__INITIAL_POINTER_SIZE) && \
+ (__INITIAL_POINTER_SIZE == 64)
+# define getpwuid __32_getpwuid
#endif
@@ -552,9 +452,9 @@ typedef int sig_atomic_t;
*/
#ifdef __VMS
-#define argv_item_t __char_ptr32
+# define argv_item_t __char_ptr32
#else
-#define argv_item_t char *
+# define argv_item_t char *
#endif
diff --git a/contrib/libs/c-ares/src/lib/windows_port.c b/contrib/libs/c-ares/src/lib/windows_port.c
index 5977b8493e..d5f0ad3abf 100644
--- a/contrib/libs/c-ares/src/lib/windows_port.c
+++ b/contrib/libs/c-ares/src/lib/windows_port.c
@@ -13,18 +13,17 @@
*/
#if (defined(WIN32) || defined(WATT32)) && !defined(MSDOS)
-#ifdef __WATCOMC__
+# ifdef __WATCOMC__
/*
* Watcom needs a DllMain() in order to initialise the clib startup code.
*/
-BOOL
-WINAPI DllMain (HINSTANCE hnd, DWORD reason, LPVOID reserved)
+BOOL WINAPI DllMain(HINSTANCE hnd, DWORD reason, LPVOID reserved)
{
- (void) hnd;
- (void) reason;
- (void) reserved;
+ (void)hnd;
+ (void)reason;
+ (void)reserved;
return (TRUE);
}
-#endif
+# endif
#endif /* WIN32 builds only */