diff --git a/deps/cares/CHANGES b/deps/cares/CHANGES index 6523436d3af31d..04945fa35d40f6 100644 --- a/deps/cares/CHANGES +++ b/deps/cares/CHANGES @@ -1,5 +1,852 @@ Changelog for the c-ares project. Generated with git2changes.pl +Version 1.23.0 (28 Nov 2023) + +GitHub (28 Nov 2023) +- [Brad House brought this change] + + 1.23.0 release prep (#641) + +Brad House (28 Nov 2023) +- add missing manpage to distribution list + +- clang-format + +- remove a simply + +- fix doc typo + +- ares_init_options with ARES_OPT_UDP_PORT wrong byte order + + Regression from c-ares 1.19.1, ARES_OPT_UDP_PORT and ARES_OPT_TCP_PORT are + specified from the user in host-byte order, but there was a regression that + caused it to be read as if it was network byte order. + + Fixes Bug: #640 + Reported By: @Flow86 + Fix By: Brad House (@bradh352) + +- fix ares_threadsafety() prototype + +GitHub (28 Nov 2023) +- [Brad House brought this change] + + Basic Thread Safety (#636) + + c-ares does not have any concept of thread-safety. It has always been 100% up to the implementor to ensure they never call c-ares from more than one thread at a time. This patch adds basic thread-safety support, which can be disabled at compile time if not desired. It uses a single recursive mutex per channel, which should be extremely quick when uncontested so overhead should be minimal. + + Fixes Bug: #610 + + Also sets the stage to implement #611 + + Fix By: Brad House (@bradh352) + +- [petrvh brought this change] + + ares_getaddrinfo(): do not use search domains if ARES_FLAG_NOSEARCH is set (#638) + + c-ares init options defines a flag ARES_FLAG_NOSEARCH that is supposed to prevent search using configured domain suffixes, however when using ares_getaddrinfo() the flag was ignored and domain suffixes were used anyway. + + Configuring zero domains to search also does not work (if ndomains == 0 default domain search list is loaded regardless of the flag ARES_OPT_DOMAINS being set). + + This change adds a check for the ARES_FLAG_NOSEARCH in as_is_only() function that is used by ares_getaddrinfo() to decide if to try to query next possible name ( next_dns_lookup() ) + + Fix By: @petrvh + +Brad House (25 Nov 2023) +- Fix MacOS version test + + It appears that the Issue #454 wasn't really fixed for some reason. This commit should fix the detection. + + Fix By: Brad House (@bradh352) + +Daniel Stenberg (24 Nov 2023) +- CI: codespell + + Closes #635 + +GitHub (24 Nov 2023) +- [Christian Clauss brought this change] + + Fix typos discovered by codespell (#634) + + % `codespell --ignore-words-list="aas,aci,acter,atleast,contentss,firey,fo,sais,seh,statics"` + * https://pypi.org/project/codespell + + Fix By: Christian Clauss (@cclauss) + +Brad House (22 Nov 2023) +- environment is meant as an override for sysconfig + +GitHub (22 Nov 2023) +- [Ignat brought this change] + + Support attempts and timeout options from resolv.conf (#632) + + c-ares parses only antique version of options for timeout and number of retries from resolv.conf (`retrans` and `retry` are missing in modern documentation https://man7.org/linux/man-pages/man5/resolv.conf.5.html). + + I add support of `attempts` and `timeout` options + + Fix By: Ignat (@Kontakter) + +- [Brad House brought this change] + + more precise timeout calculation (#633) + + The timeout calculation was occurring with millisecond precision, but on some systems, there is microsecond precision which could mean we'd tell a user a timeout time prior to the actual timeout. + + Fixes Bug: #631 + Fix By: Brad House (@bradh352) + +- [Christian Clauss brought this change] + + INSTALL.md: Fix typo (#630) + + Fix By: Christian Clauss (@cclauss) + +Brad House (19 Nov 2023) +- SonarCloud: fix minor codesmells + +- fix test case regression due to missing parens + +- now that warnings are enabled on test cases, clear a bunch of warnings + +- CMake: CXXFLAGS environment wasn't being read because C++ compiler was enabled after settings warnings. + +- fix additional windows test warnings + +- cleanup some Windows warnings in test + +- clang-format + +GitHub (19 Nov 2023) +- [Brad House brought this change] + + Fix Windows UWP (Store) building and add to CI/CD (#627) + + When building for UWP (WindowsStore), additional headers are needed and some functions are not available. This also adds AppVeyor CI/CD support to catch these issues in the future. + + Fix By: Deal (@halx99) and Brad House (@bradh352) + +Brad House (19 Nov 2023) +- ares_set_servers_*() should allow an empty server list + + For historic reasons, we have users depending on ares_set_servers_*() + to return ARES_SUCCESS when passing no servers and actually *clear* + the server list. It appears they do this for test cases to simulate + DNS unavailable or similar. Presumably they could achieve the same + effect in other ways (point to localhost on a port that isn't in use). + But it seems like this might be wide-spread enough to cause headaches + so we just will document and test for this behavior, clearly it hasn't + caused "issues" for anyone with the old behavior. + + See: https://github.com/nodejs/node/pull/50800 + + Fix By: Brad House (@bradh352) + +GitHub (19 Nov 2023) +- [Brad House brought this change] + + Query Cache support (#625) + + This PR implements a query cache at the lowest possible level, the actual dns request and response messages. Only successful and `NXDOMAIN` responses are cached. The lowest TTL in the response message determines the cache validity period for the response, and is capped at the configuration value for `qcache_max_ttl`. For `NXDOMAIN` responses, the SOA record is evaluated. + + For a query to match the cache, the opcode, flags, and each question's class, type, and name are all evaluated. This is to prevent matching a cached entry for a subtly different query (such as if the RD flag is set on one request and not another). + + For things like ares_getaddrinfo() or ares_search() that may spawn multiple queries, each individual message received is cached rather than the overarching response. This makes it possible for one query in the sequence to be purged from the cache while others still return cached results which means there is no chance of ever returning stale data. + + We have had a lot of user requests to return TTLs on all the various parsers like `ares_parse_caa_reply()`, and likely this is because they want to implement caching mechanisms of their own, thus this PR should solve those issues as well. + + Due to the internal data structures we have these days, this PR is less than 500 lines of new code. + + Fixes #608 + + Fix By: Brad House (@bradh352) + +Version 1.22.1 (17 Nov 2023) + +GitHub (17 Nov 2023) +- [Brad House brought this change] + + 1.22.1 release prep (#624) + +Brad House (17 Nov 2023) +- ares__htable_strvp should be case-insensitive + +- optimize: large /etc/hosts files reading + + profiling found some hot paths that could be optimized to reduce + insert times into the cache. + + Fix By: Brad House (@bradh352) + +- Fix /etc/hosts processing performance with all entries using same IP address + + Some users use blacklist files like https://github.com/StevenBlack/hosts which + can contain 200k+ host entries all pointing to 0.0.0.0. Due to the merge + logic in the new hosts processor, all those entries will be associated as + aliases for the same ip address. + + The first issue is that it attempts to check the status of all the hosts for + the merged entry, when it should only be checking the new hosts added to the + merged entry, so this caused exponential time as the entries got longer. + + The next issue is if searching for one of those hosts, it would append all + the matches as cnames/aliases, but there is zero use for 200k aliases + being appended to a lookup, so we are artificially capping this to 100. + + Bug report reference: https://bugs.gentoo.org/917400 + + Fix By: Brad House (@bradh352) + +- new badges + +- OpenWatcom: time_t is unsigned, change math using time_t to promote to a 64bit signed integer + +- fix more docs + +GitHub (15 Nov 2023) +- [Gregor Jasny brought this change] + + Fix typos and man page whatis entry (#619) + + Those issues were detected by lintian. + + Fix By: Gregor Jasny (@gjasny) + +- [Douglas R. Reno brought this change] + + Fix building c-ares-1.22.0 and higher under Watcom. (#623) + + Update config-win32.h to define HAVE_STDINT_H when OpenWatcom is in use. + + Fix By: Douglas R. Reno (@renodr) + +Brad House (15 Nov 2023) +- OpenWatcom: fix PR building + +- CI/CD: Add OpenWatcom + +- CI/CD: Add OpenWatcom + +- CI/CD: Add OpenWatcom + +- CI/CD: Add OpenWatcom + +- CI/CD: Add OpenWatcom + +- CI/CD: Add OpenWatcom + +- CI/CD: Add OpenWatcom + +- warnings: try to prevent warnings due to automatic integer promotion + +- only push to coverity weekly or on explicit coverity_scan branch commits + +- try to cleanup bogus compiler warnings + +- try to cleanup bogus compiler warnings + +- additional test coverage + +- Coverity: omit tests + +- Coverity: more + +- Coverity: silence false positives + +Version 1.22.0 (14 Nov 2023) + +Brad House (14 Nov 2023) +- fix workflow + +- try a different coverity workflow + +GitHub (14 Nov 2023) +- [Brad House brought this change] + + coverity workflow (#618) + +Brad House (14 Nov 2023) +- typos + +- getaddrinfo ESERVICE + +GitHub (14 Nov 2023) +- [Brad House brought this change] + + Release 1.22.0 (#616) + +Brad House (13 Nov 2023) +- SonarCloud: minor codesmells + +- clang-format + +- Extended RCODE in OPT RR PsuedoRecord should not be exposed directly, it should be presented as part of the normal rcode + +- Slight fixes for PR #615 + + 1. the maxtimeout must come at the end of the structure + 2. fix comment form to be C style + 3. fix timeplus randomness if statement + +GitHub (13 Nov 2023) +- [Brad House brought this change] + + Add DNS record manpages (#615) + + The new DNS record parser and writer needs manpages. This PR implements those. + + Fix By: Brad House (@bradh352) + +- [Ignat brought this change] + + Randomize retry penalties to prevent thundering herd type issues (#606) + + The retry timeout values were using a fixed calculation which could cause multiple simultaneous queries to timeout and retry at the exact same time. If a DNS server is throttling requests, this could cause the issue to never self-resolve due to all requests recurring at the same instance again. + + This PR also creates a maximum timeout option to make sure the random value selected does not exceed this value. + + Fix By: Ignat (@Kontakter) + +Brad House (13 Nov 2023) +- fix typos + +- some simplification and better error handling + +- SonarCloud: fix some minor codesmells + +GitHub (12 Nov 2023) +- [Brad House brought this change] + + Implement ares_reinit() to reload system configuration into existing channel (#614) + + This PR implements ares_reinit() to safely reload a channel's configuration even if there are existing queries. This function can be called when system configuration is detected to be changed, however since c-ares isn't thread aware, care must be taken to ensure no other c-ares calls are in progress at the time this function is called. Also, this function may update the open file descriptor list so care must also be taken to wake any event loops and reprocess the list of file descriptors. + + Fixes Bug #301 + + Fix By: Brad House (@bradh352) + +Brad House (11 Nov 2023) +- test case ensures tag for caa is not blank + +- 0-length strings are ok + +- SonarCloud: fix up codesmells + +GitHub (11 Nov 2023) +- [Brad House brought this change] + + rewrite adig using new helpers (#607) + + adig previously performed manual parsing of the DNS records. Now it can focus strictly on formatting of output data for printing. It simply iterates across the parsed DNS packet and queries for the RRs, parameters for each RR, and the datatypes for each parameter. adig will now automatically pick up new RRs from the c-ares library due to the dynamic nature. + + The adig format also now more closely resembles that of BIND's `dig` output. + + A few more helpers needed to be added to the c-ares library that were missing. There ware a couple of minor bugs and enhancements also needed. + + Example: + ``` + ./adig -t ANY www.google.com + + ; <<>> c-ares DiG 1.21.0 <<>> www.google.com + ;; Got answer: + ;; ->>HEADER<<- opcode: QUERY, status: RCODE, id: 23913 + ;; flags: qr rd ra; QUERY: 1, ANSWER: 11, AUTHORITY: 0, ADDITIONAL: 1 + + ;; OPT PSEUDOSECTION: + ; EDNS: version: 0, flags: 0; udp: 512 + ;; QUESTION SECTION: + ;www.google.com. IN ANY + + ;; ANSWER SECTION: + www.google.com. 162 IN A 142.251.107.99 + www.google.com. 162 IN A 142.251.107.105 + www.google.com. 162 IN A 142.251.107.103 + www.google.com. 162 IN A 142.251.107.147 + www.google.com. 162 IN A 142.251.107.104 + www.google.com. 162 IN A 142.251.107.106 + www.google.com. 162 IN AAAA 2607:f8b0:400c:c32::93 + www.google.com. 162 IN AAAA 2607:f8b0:400c:c32::69 + www.google.com. 162 IN AAAA 2607:f8b0:400c:c32::68 + www.google.com. 162 IN AAAA 2607:f8b0:400c:c32::6a + www.google.com. 21462 IN HTTPS 1 . alpn="h2,h3" + + ;; MSG SIZE rcvd: 276 + ``` + + Fix By: Brad House (@bradh352) + +- [Brad House brought this change] + + make dns parser/writer public (#604) + + This PR makes the c-ares parser introduced in 1.21, and the new writer, along with associated helpers public. These helpers are contained in a new public header of `ares_dns_record.h` which should _**not**_ be included directly, instead simply including `ares.h` is sufficient. This will address #587, as well as #470. + + A follow-up PR will be made which will transform `adig` to use the new parsers and helpers. + + This PR does not currently add man pages for these public functions, that will be in a follow-up PR once the `adig` migration is done which may expose additional needed helpers. + + The two aforementioned PRs will be done before the 1.22 release. + + Fix By: Brad House (@bradh352) + +Brad House (9 Nov 2023) +- options helpers: fix dereference to properly return params + +- clang-format + +GitHub (9 Nov 2023) +- [Brad House brought this change] + + Add SVCB and HTTPS RR (RFC 9460) (#603) + + This PR adds parsing and writing support for SVCB and HTTPS RRs as defined in RFC 9460. + + This should fix #566 + + Fix By: Brad House (@bradh352) + +- [Brad House brought this change] + + OPT RR should support parsing key/value options (#602) + + The OPT RR record has some seldom used options with a 16bit key and a binary value. The current parser and writer was not supporting this. This PR adds support. The same format is also used for SVCB/HTTPS records, so getting this in there is necessary to support that RR type. + + Also, we split the Binary record format into BIN and BINP, where BINP is an indicator that the binary data is _likely_ printable and will guarantee a NULL terminator. This is helpful for those attempting to print RRs. + + Fix By: Brad House (@bradh352) + +Brad House (8 Nov 2023) +- SonarCloud: fix some easy codesmells + +- clang-format + +- Mark a couple of parameters as const in the public API + +GitHub (7 Nov 2023) +- [Brad House brought this change] + + Add TLSA record support (#600) + + As per #470, c-ares is missing a parser for the TLSA record format (RFC 6698). This PR introduces that parser. + + Once the new parser interface becomes public and this PR is merged, then #470 can be closed. + + Fix By: Brad House (@bradh352) + +Brad House (7 Nov 2023) +- memory leak in test case + +- fix bad variable reference + +- DNS Write: fix name compression + +- SonarCloud: fix codesmells + +- Coverage: add tests for writing and parsing various record formats + +GitHub (7 Nov 2023) +- [Brad House brought this change] + + DNS Record Write (#598) + + The `ares_dns_record_t` data structure created in the prior release is capable of holding a complete parsed DNS message and also provides all helpers in order to fill in the data structure. This PR adds write capabilities for this data structure to form a complete message and supports features such as DNS name compression as defined in RFC1035. Though this message writing capability goes further than c-ares internally needs, external users may find it useful ... and we may find it useful for test validation as well. + + This also replaces the existing message writing code in `ares_create_query()`, as well rewriting the request message without EDNS in ares_process.c's `process_answer()`. + + Fix By: Brad House (@bradh352) + +Brad House (6 Nov 2023) +- PATH_RESOLV_CONF: use empty string instead of NULL to prevent warnings + +- build fix + +- const: fix some usecases + +- remove tests that depend on randomness + +GitHub (5 Nov 2023) +- [Brad House brought this change] + + Use EDNS by default (#596) + + All DNS servers support EDNS, by using this by default, it will allow larger responses without the need to switch to TCP. If by chance a DNS server is hit that doesn't support EDNS, this is detected due to the lack of the OPT RR in the response and will be automatically retried without EDNS. + + Fix By: Brad House (@bradh352) + +- [Brad House brought this change] + + `ares_channel` -> `ares_channel_t *`: don't bury the pointer (#595) + + `ares_channel` is defined as `typedef struct ares_channeldata *ares_channel;`. The problem with this, is it embeds the pointer into the typedef, which means an `ares_channel` can never be declared as `const` as if you write `const ares_channel channel`, that expands to `struct ares_channeldata * const ares_channel` and not `const struct ares_channeldata *channel`. + + We will now typedef `ares_channel_t` as `typedef struct ares_channeldata ares_channel_t;`, so if you write `const ares_channel_t *channel`, it properly expands to `const struct ares_channeldata *channel`. + + We are maintaining the old typedef for API compatibility with existing integrations, and due to typedef expansion this should not even cause any compiler warnings for existing code. There are no ABI implications with this change. I could be convinced to keep existing public functions as `ares_channel` if a sufficient argument exists, but internally we really need make this change for modern best practices. + + This change will allow us to internally use `const ares_channel_t *` where appropriate. Whether or not we decide to change any public interfaces to use `const` may require further discussion on if there might be ABI implications (I don't think so, but I'm also not 100% sure what a compiler internally does with `const` when emitting machine code ... I think more likely ABI implications would occur going the opposite direction). + + FYI, This PR was done via a combination of sed and clang-format, the only manual code change was the addition of the new typedef, and a couple doc fixes :) + + Fix By: Brad House (@bradh352) + +Brad House (4 Nov 2023) +- win32 warnings look good, remove commented out block + +- more msvc warnings + +- fix + +- docs: document setting servers can be done live + +- SonarCloud: more easy codesmells + +- clang-format + +- SonarCloud: fix up codesmells + +GitHub (3 Nov 2023) +- [Brad House brought this change] + + Dynamic Server List (#594) + + This PR makes the server list a dynamic sorted list of servers. The sort order is [ consecutive failures, system config index ]. The server list can be updated via ares_set_servers_*(). Any queries currently directed to servers that are no longer in the list will be automatically re-queued to a different server. + + Also, any time a failure occurs on the server, the sort order of the servers will be updated so that the one with the fewest consecutive failures is chosen for the next query that goes on the wire, this way bad or non-responsive servers are automatically isolated. + + Since the server list is now dynamic, the tracking of query failures per server has been removed and instead is relying on the server sort order as previously described. This simplifies the logic while also reducing the amount of memory required per query. However, because of this dynamic nature, it may not be easy to determine the server attempt order for enqueued queries if there have been any failures. + + If using the ARES_OPT_ROTATE, this is now implemented to be a random selection of the configured servers. Since the server list is dynamic, its not possible to go to the next server as configuration could have changed between queries or attempts for the same query. + + Finally, this PR moved some existing functions into new files to logically separate them. + + This should address issues #550 and #440, while also setting the framework to implement #301. #301 needs a little more effort since it configures things other than the servers themselves (domains, search, sortlist, lookups), which need to make sure they can be safely updated. + + Fix By: Brad House (@bradh352) + +Brad House (1 Nov 2023) +- no reason to run LSAN, ASAN already does it + +GitHub (31 Oct 2023) +- [Brad House brought this change] + + AppVeyor: update compiler versions, use Msys2, and Windows fixes (#593) + + AppVeyor was using Visual Studio 2015 along with old versions of MinGW. Update to the latest AppVeyor provides and also add an MSYS2 build test using MinGW which will use the bleeding edge version. + + When researching #590 this also uncovered a bug in cmake not properly detecting if_indextoname() on windows. This has been corrected as well as the underlying issue reported in #590. + + Fix By: Brad House (@bradh352) and Jonas Kvinge (@jonaski) + +Brad House (31 Oct 2023) +- Coverage: add some code misuse test cases + +- hosts file parsing should set success at end of loop + +- fix windows localhost for ares_gethostbyname_file() when /etc/hosts doesn't have an entry + +- SonarCloud: fix up codesmells (const, unneeded casts, reduce complexity) + +GitHub (30 Oct 2023) +- [Brad House brought this change] + + Replace hosts parser, add caching capabilities (#591) + + 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 (or 60s if there is no implemented stat() capability). + + 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 (both ips have the fqdn of host.example.com). It is + unlikely this will matter in the real world. + + + Fix By: Brad House (@bradh352) + +- [Brad House brought this change] + + cleanups: split functions out into different files, rename some to be more logical (#589) + +Brad House (27 Oct 2023) +- fix comment + +- recursive git attributes + +Version 1.21.0 (26 Oct 2023) + +Brad House (26 Oct 2023) +- SonarCloud: reduce reported complexity that exists for no reason. + +- SonarCloud: fix some #undef codesmells + +- formatting + +- document ARES_RR_* records + +- no reason to limit on truncation + +- linguist fixes + +- don't use test cases to determine language of c-ares + +- fix grammar + +- fix count + +GitHub (25 Oct 2023) +- [Brad House brought this change] + + 1.21.0 release prep (#585) + +Brad House (25 Oct 2023) +- fix build warning + +GitHub (25 Oct 2023) +- [Brad House brought this change] + + SonarCloud: clean up more codesmells (#584) + +Brad House (25 Oct 2023) +- resolve reported memory leaks + +- add test vector said to cause a memory leak + +GitHub (25 Oct 2023) +- [Brad House brought this change] + + sonarcloud: fix more codesmells (#583) + +- [Brad House brought this change] + + sonarcloud easy codesmells (#582) + + Fix By: Brad House (@bradh352) + +- [Brad House brought this change] + + Modernization: replace multiple hand-parsers with new memory-safe parser (#581) + + New DNS record parsing code. The old code was basically just some helper macros and functions for parsing an entire DNS message. The caller had to know the RFCs to use the parsers, except for some pre-made exceptions. The new parsing code parses the entire DNS message into an opaque data structure in a memory safe manner with various accessors for reading and manipulating the data. + + The existing parser helpers for the various record types were reimplemented as wrappers around the new parser. + + The accessors allow easy iteration across the DNS record datastructure, and can be used to easily create dig-like output without needing to know anything about the various record types and formats as dynamic helpers are provided for enumeration of values and data types of those values. + + At some point in the future, this new DNS record structure, accessors, and parser will be exposed publicly. This is not done at this point as we don't want to do that until the API is completely stable. Likely a write() function to output the DNS record back into an actual message buffer will be introduced with the stable API as well. + + Some subtle bugs in the existing code were uncovered, some which had test cases which turned out to be bogus. Validation with third-party implementations (e.g. BIND9) were performed to validate such cases were indeed bugs. + + Adding additional RR parsers such as for TLSA (#470) or SVCB/HTTPS (#566) are trivial now since focus can be put on only parsing the data within the RR, not the entire message. That said, as the new parser is not yet public, it isn't clear the best way to expose any new RRs (probably best to wait for the new parser to be public rather than hacking in another legacy function). + + Some additional RRs that are part of DNS RFC1035 or EDNS RFC6891 that didn't have previously implemented parsers are now also implemented (e.g. HINFO, OPT). Any unrecognized RRs are encapsulated into a "RAW_RR" as binary data which can be inserted or extracted, but are otherwise not interpreted in any way. + + Fix By: Brad House (@bradh352) + +- [Gregor Jasny brought this change] + + feat: use CMake to control symbol visibility (#574) + + In contrast to #572 this solution does not need any extra headers. But it is also limited to GCC-like compilers. + + Fix By: Gregor Jasny (@gjasny) + +- [Brad House brought this change] + + remove ares_nowarn helpers #580 + + Now that the code internally is using proper datatypes, there is no longer a need for ares_nowarn helpers. Remove them. + + Fix By: Brad House (@bradh352) + +Brad House (16 Oct 2023) +- clang-format: fix structure alignment + + It appears the structure alignment chosen just doesn't work right. + Switch to 'left', it appears to be mostly correct. + + Fix By: Brad House (@bradh352) + +GitHub (15 Oct 2023) +- [Brad House brought this change] + + Reformat code using clang-format (#579) + + c-ares uses multiple code styles, standardize on one. Talking with @bagder he feels strongly about maintaining an 80 column limit, but feels less strongly about things I feel strongly about (like alignment). + + Can re-run the formatter on the codebase via: + ``` + clang-format -i */*.c */*.h */*/*.c */*/*.h + ``` + + Fix By: Brad House (@bradh352) + +Brad House (15 Oct 2023) +- inet_ntop requires ares_private.h + +- SonarCloud: Fix additional code smells + + Fix By: Brad House (@bradh352) + +- SonarCloud: Ignore codesmells c89 doesn't support + + C89 doesn't support iterator declaration in for loop, kill warning. + + Fix By: Brad House (@bradh352) + +GitHub (15 Oct 2023) +- [Brad House brought this change] + + set compiler standard to ISO C90/ANSI C89 (#577) + + SonarCloud is outputting some code smells for things that aren't possible for C89. Hopefully setting the code standard to C89/C90 properly will fix those bogus warnings. + + Fix By: Brad House (@bradh352) + +Brad House (15 Oct 2023) +- fix new ares_strcpy to ensure null termination + +- build fix + +GitHub (15 Oct 2023) +- [Brad House brought this change] + + SonarCloud: Fix up codesmells due to strlen(), strcpy(), and strncpy() (#576) + + Create ares_strlen() and ares_strcpy() in order to resolve SonarCloud codesmells related to their use. + + ares_strlen() just becomes null-safe. + + ares_strcpy() is equivalent to strlcpy(), so unlike strncpy() it guarantees NULL termination. + + Fix By: Brad House (@bradh352) + +Brad House (15 Oct 2023) +- SonarCloud: try to appease it better + +- SonarCloud: Fix reported bugs + + SonarCloud reported a few bugs, this commit should fix those reports. + + Fix By: Brad House (@bradh352) + +GitHub (15 Oct 2023) +- [Brad House brought this change] + + Fix internal datatype usage and warnings (#573) + + PR #568 increased the warning levels and c-ares code emitted a bunch of warnings. This PR fixes those warnings and starts transitioning internal data types into more proper forms (e.g. data lengths should be size_t not int). It does, however, have to manually cast back to what the public API needs due to API and ABI compliance (we aren't looking to break integrations, just clean up internals). + + Fix By: Brad House (@bradh352) + +Brad House (15 Oct 2023) +- SonarCloud: exclude tests + +- fix source directories + +GitHub (15 Oct 2023) +- [Brad House brought this change] + + Sonarcloud (#575) + +- [Brad House brought this change] + + Increase compiler warnings by default (#568) + + c-ares was missing a couple of common compiler warnings during building that are widely recognized as a best practice. This PR makes no code changes, only build system changes to increase warning levels. + + This PR does cause some new warnings to be emitted, a follow-up PR will address those. + + Fix By: Brad House (@bradh352) + +- [Brad House brought this change] + + introduce ares_bool_t datatype (#570) + + c-ares currently uses int for boolean, which can be confusing as there are some functions which return int but use '0' as the success condition. Some internal variable usage is similar. Lets try to identify the boolean use cases and split them out into their own data type of ares_bool_t. Since we're trying to keep C89 compatibility, we can't rely on stdbool.h or the _Bool C99 data type, so we'll define our own. + + Also, chose using an enum rather than say unsigned char or int because of the type safety benefits it provides. Compilers should warn if you try to pass, ARES_TRUE on to a ares_status_t enum (or similar) since they are different enums. + + Fix By: Brad House (@bradh352) + +Brad House (12 Oct 2023) +- Socket callbacks were passed SOCK_STREAM instead of SOCK_DGRAM on udp + + A regression was introduced in 1.20.0 that would pass SOCK_STREAM on udp + connections due to code refactoring. If a client application validated this + data, it could cause issues as seen in gRPC. + + Fixes Issue: #571 + Fix By: Brad House (@bradh352) + +- Enhance test of ares_getsock() + + In an attempt to see if ares_getsock() was broken as per #571, do + further sanity checks of the results of ares_getsock(). It seems + as though ares_getsock() is fine. + + Fix By: Brad House (@bradh352) + +GitHub (10 Oct 2023) +- [Brad House brought this change] + + Tool: STAYOPEN flag could make tools not terminate (#569) + + If a flag is set to keep the connections to the DNS servers open even if there are no queries, the tools would not exit until the remote server closed the connection due to the user of ares_fds() to determine if there are any active queries. Instead, rely on ares_timeout() returning NULL if there are no active queries (technically this returns the value passed to max_tv in ares_timeout(), but in our use case, that is always NULL). + + Fixes Issue: #452 + Fix By: Brad House (@bradh352) + +- [Brad House brought this change] + + ares_status_t enum for status codes (#567) + + The list of possible error codes in c-ares was a #define list. This not only doesn't provide for any sort of type safety but it also lacks clarification on what a function may return or what it takes, as an int could be an ares status, a boolean, or possibly even a length in the current code. + + We are not changing any public APIs as though the C standard states the underlying size and type of an enum is int, there are compiler attributes to override this as well as compiler flags like -fshort-enums. GCC in particular is known to expand an enum's width based on the data values (e.g., it can emit a 64bit integer enum). + + All internal usages should be changed by this PR, but of course, there may be some I missed. + + Fix By: Brad House (@bradh352) + +Daniel Stenberg (9 Oct 2023) +- docs: provide better man page references + + When referring to another c-ares function use \fI function(3) \fP to let + the webpage rendering find and cross-link them appropriately. + + SEE ALSO references should be ".BR name (3),", with a space before the + open parenthesis. This helps the manpage to HTML renderer. + + Closes #565 + Version 1.20.1 (8 Oct 2023) GitHub (8 Oct 2023) @@ -5116,592 +5963,3 @@ Yang Tse (27 Sep 2011) - ares_process.c: fix compiler warning - fix MSVC compiler warning 'conditional expression is constant' - -- setup_once.h cleanup and sync - -- [Denis Bilenko brought this change] - - ares_getnameinfo: fix random results with c-ares 1.7.5 - - In ares_getnameinfo memcpy did not copy enough bytes, causing - it to return arbitrary memory contents as a result. - -- warnings: fix another 'conversion may lose significant bits' compiler warning - -- ares_dns.h: adjust DNS__16BIT and DNS__32BIT macro definitions - - Fixing compiler warnings existing definitions triggered on these. - -- ares_destroy.c: fix segfault in ares_destroy_options() - -Daniel Stenberg (21 Aug 2011) -- ares_parse_srv_reply: silence compiler warnings - - ... by adding ugly typecasts. - -- CHANGES: generate from script - - The CHANGES file is now generated automatically with 'git2changes.pl', - invoked by the maketgz script which is used to build release archives. - - The former human edited CHANGES file was renamed to CHANGES.0 in git. - -Yang Tse (21 Aug 2011) -- Makefile.netware: SIZEOF_SHORT definition - -- warnings: fix some 'conversion may lose significant bits' compiler warnings - -- configure: fix symbol hiding usability check - - A more thorough test is done now in order to determine visibility attribute - usability, given that some compilers don't support visibility attribute on - all configurations. - -Daniel Stenberg (16 Aug 2011) -- 1.7.6: start working... - -Version 1.7.5 (16 Aug 2011) - -Daniel Stenberg (16 Aug 2011) -- CHANGES: synced for 1.7.5 release - -- RELEASE-NOTES: synced with bb4096effef7f000 - -Jakub Hrozek (15 Aug 2011) -- Only fall back to AF_INET searches when looking for AF_UNSPEC addresses - -Yang Tse (10 Aug 2011) -- [Gisle Vanem brought this change] - - ares_iphlpapi.h: Watcom C fix - - Added "!defined(_WS2DEF_)" since Watcom doesn't have - a per type guard for the typedefs 'CSADDR_INFO' (that MingW has) or - 'SOCKET_ADDRESS' (that MSVC has). But we can use the header-guard for - instead. - -- [Gisle Vanem brought this change] - - Makefile.Watcom: - * The 'NTDDI_VERSION' needs to be raised to 0x05010000 - in order for SOCKADDR_STORAGE etc. to be typedefed. - * Replaced '-dUSE_WATT32' with '-dWATT32'. - * Added $(DEMOS) to the 'all' target and removed the 'demos' - target to be consistent with e.g. Makefile.msvc etc. - * 'ENABLE_IPV6' is no longer used. Hence removed the '%use_ipv6' construct. - * object-file order seems to be important (Watcom v.19). Hence - 'ares_getopt.obj' must be put after the .obj that references getopt(). - -- cares-compilers.m4: CARES_CONVERT_INCLUDE_TO_ISYSTEM adjustments - - Add CARES_CHECK_COMPILER as a requirement. - - Ensure macro does nothing unless GNU_C or CLANG compiler is used. - - This should allow usage of this macro in unforeseen placements. - -- config-win32.h: comments adjustments - followup - -- config-win32.h: comments adjustments - -Daniel Stenberg (5 Aug 2011) -- [Tom Hughes brought this change] - - ares_parse_a_reply: fix memleak - -Yang Tse (29 Jul 2011) -- cares-functions.m4 serial # bump - -- Revert "configure: additional flag checks for fcntl() and socket()" - - This reverts commit 5f2a3b0e48f26d24cb1fefea0dccb92d417dcbf7. - -- configure: additional flag checks for fcntl() and socket() - -- xc-translit.m4 fix quoting - -- configure: avoid direct usage of AS_TR_* macros - -- xc-translit.m4 provides transliteration macros with well defined behavior. - -Jakub Hrozek (15 Jun 2011) -- Revert "Only fall back to AF_INET searches when looking for AF_UNSPEC addresses" - - This reverts commit b5823d65706af687c0e5110af8f0cfdcd068997d. - - This patch was not reviewed properly before pushing - -- Revert "Do not use sized constants in public headers" - - This reverts commit 22c01e96f7b2ae9923e1baa50bfe3c0d22297a7d. - - This is a Red Hat specific patch that does not belong into upstream - -- Use correct sizeof in ares_getnameinfo() - -- Do not leak rr_name on failures inside ares_parse_ptr_reply - -- Do not leak rr_name on failures inside ares_parse_a_reply - -- Do not leak rr_name on failures inside ares_parse_aaaa_reply - -- Do not leak rr_name on failures inside ares_parse_ns_reply - -- Fix incorrect sizeof() in ares_save_options - -- Fix incorrect allocation in ares_parse_ptr_reply() - -- Only fall back to AF_INET searches when looking for AF_UNSPEC addresses - -- Do not use sized constants in public headers - -Daniel Stenberg (13 Jun 2011) -- [Jakub Hrozek brought this change] - - ares_free_hostent(NULL) should be a noop - -Yang Tse (8 Jun 2011) -- configure: fix recvfrom 5th arg type qualifier detection (followup) - -- configure: fix recvfrom 5th arg type qualifier detection - - Additionally remove whitespace from EOL - -Daniel Stenberg (4 Jun 2011) -- strlen: use size_t to receive the return - -Yang Tse (4 Jun 2011) -- xlc: avoid preprocessor definition usage when linking - -- ares_nowarn: icc 9.1 workaround - -- ares_nowarn: header inclusion fix - -- ares_init: make ares_private.h last included header again - -- compiler warning: fix - - Fix compiler warning: conversion may lose significant bits - -- compiler warning: fix - - Fix compiler warning: variable was set but never used - - Fix compiler warning: clobber ignored - -- ares_iphlpapi: fix compiler warnings - -- winsock: compilation fixes - - Provide winsock iphlpapi alternative definitions to prevent compilation - failures when using a variety of winsock header implementations. - -Daniel Stenberg (17 May 2011) -- [David Stuart brought this change] - - IPv6-on-windows: find DNS servers correctly - -- man pages: docs for the c-ares utility programs - -- ares_parse_ns_reply.c: remove CVSism - -Yang Tse (27 Mar 2011) -- build: fix header inclusion - -- getservbyport replacement for Win CE - -- renamed getplatform() to ares__getplatform() to avoid namespace pollution - -- configure: fix libtool warning - - Recent versions of libtool are now tracing usage of AC_CONFIG_MACRO_DIR - macro and warn heavily when not used in configure script along with - ACLOCAL_AMFLAGS in Makefile.am. So in order to make libtool happy - while keeping backwards compatibility this is added. - -- adig: RFC4034 resource record type detection - - Can be tested with: adig -s 8.8.8.8 -t ANY example.com - -- nameser.h: RFC4034 resource record type definitions - -- build: move platform stuff to ares_platform.c and ares_platform.h - -- build: find out windows platform using GetVersionEx() - -- build: use getenv() replacement function for systems which lack it - -- setup_once: system error codes for Windows CE - -- ares_search: use ERRNO macro for portability sake - -- System's errno.h inclusion cleanup follow-up. - - System's errno.h is conditionally included from setup_once.h - -- Windows CE specific adjustment - - All versions of Windows CE support Winsock 1.1 - -- System's errno.h inclusion cleanup. - - System's errno.h is conditionally included from setup_once.h - -- ares_init: fix gethostname error detection on winsock platforms - -- configure: r-enable temporarily disabled detection of system's inet_ntop() - - Detection was temporarily disabled in commit 674e044ccb21f2f63537da53565fce868f - -Daniel Stenberg (15 Mar 2011) -- configure: stop using the deprecated AM_INIT_AUTOMAKE syntax - -- [Gisle Vanem brought this change] - - Watt-32: use errno - - Make sure Watt-32 programs use 'errno' even on Win32 targets - -Guenter Knauf (18 Feb 2011) -- Removed commented CLFAGS no longer needed. - -- Fixed CFLAGS for NetWare. - - Added -m32 to enable compilation with x86_64 compilers; - added conditional to set -fpcc-struct-return only for gcc compiler. - -Daniel Stenberg (18 Feb 2011) -- [Gisle Vanem brought this change] - - Watt32: fix server init - - Somewhere in the process, programs using the Watt-32 tcp/ip stack - stopped working. - -- [Dima Tisnek brought this change] - - config_sortlist: (win32) missing else - - Without an else there, contents of "pat" that could have been - successfully set just above, may be clobbered by successive unsuccessful - calls to "xxx_pton" or "ip_addr". - -Yang Tse (17 Jan 2011) -- Makefile.msvc: add a couple of VS version strings - -- Makefile.msvc: add a couple of VS version strings - -- build: add install target to Makefile.msvc - -Daniel Stenberg (27 Dec 2010) -- ares_set_servers_csv: remove unused variables - -- init_by_resolv_conf: fix compiler warnings - - The code received the return codes in the 'status' variable without - using it. Instead we just ignore those particular errors. - -- getv4: Value stored to 'dst' is never read - -- advance_tcp_send_queue: avoid NULL ptr dereference - - If given a too large 'num_bytes' value, it would cause a NULL ptr - dereference. Instead the code will now break out of the loop at the end - of the list. - -- [Peter Pentchev brought this change] - - configure: fix a bashism - -- cleanup: avoid unsafe typecasts - - Avoid the risk of reading 16bit data from an unaligned address by using - a macro that is adapted for this. - -- [Stefan Bühler brought this change] - - ares_expand_name: Fix encoded length for indirect root - -Yang Tse (18 Dec 2010) -- build: add some explicit file references to VS project files - -- config-win32: provide HAVE_ASSERT_H definition - -- build: include ares_nowarn in sample program VS project files - -- build: include ares_nowarn among SAMPLESOURCES and SAMPLEHEADERS - -- configure: temporarily disable detection of system's inet_ntop() - - This is done to allow compilation of ares_inet_ntop() by some daily - builds picky compilers that otherwise do not need this function. - -- changes: mention last fix - -- ares_inet_ntop: remove definition and usage of macro SPRINTF - - Existing definition of SPRINTF always resulted in sprintf() being used, - and sprintf() returning 'int' is already used throughout the library. - -- ares_inet_ntop: reapply changes from previous c-ares version (III) - - - Replace 'u_char' with 'unsigned char'. - - Replace 'u_int' with 'unsigned int'. - - use macros ERRNO and SET_ERRNO() for errno handling. - -- ares_inet_ntop: reapply changes from previous c-ares version (II) - - - Remove rcsid. - - Adjust header file inclusions. - - ares_inet_ntop used only on systems without a proper inet_ntop function. - -- ares_inet_ntop: reapply changes from previous c-ares version (I) - - - Replace tabs with spaces. - - Use ANSI C style for function declarations and definitions. - - Use sizeof with parentheses. - -- ares_inet_ntop: fix off by one error triggering out of bounds write - - ares_inet_ntop would trigger an out of bounds write when the representation - of the address required 15 characters, due to not taking in account null - termination character. - - Full import of inet_ntop.c from bind-9.5.3rc1 to pull additional fixes. - -- ares_nowarn: add conditional inclusion of assert.h header - -- fix compiler warning: conversion may lose significant bits - -- ares_inet_net_pton: fix non-rejection of some malformed literals - - ares_inet_net_pton would return wrong values when excessively large, - and invalid, netmasks are used. Fixes are from bind-9.5.3rc1, - issue also described in the WLB-2008080064 advisory. - -- setup_once: provide ISASCII macro - -- configure: inet_net_pton function check adjustments - - Define HAVE_INET_NET_PTON only when system's inet_net_pton function is IPv6 - capable and is not affected by the WLB-2008080064 advisory. - - HAVE_INET_NET_PTON_IPV6 is no longer defined nor used. - -- ares_init: fix detection of semicolon comments in resolv.conf - - File resolv.conf may either use a hash '#' or a semicolon ';' character as an - indication that the rest of the line is a comment. This fixes not recognizing - the semicolon as a valid comment indicator in resolv.conf. - -- version: start working on 1.7.5 - -Version 1.7.4 (8 Dec 2010) - -Daniel Stenberg (8 Dec 2010) -- release-preps: CHANGES and RELEASE-NOTES synced - -- ares_set_local_*: added in 1.7.4, not before - -Yang Tse (3 Dec 2010) -- build: provide SIZEOF_SIZE_T definition for non-configure builds - -- build: config.dos renamed to config-dos.h - -- build: provide SIZEOF_SIZE_T netware definition - -- ares_gethostbyaddr: fix compiler warning: conversion may lose significant bits - -- configure: undo using autobuilds to temporarily verify strict aliasing warnings. - -- fix compiler warning: rounding, sign extension, or loss of accuracy may result - -Daniel Stenberg (2 Dec 2010) -- [Ben Noordhuis brought this change] - - ares_parse_a_reply: fix CNAME response parsing - - Reply to a CNAME query doesn't contain addresses, causing - ares_parse_a_reply() to bail out with ARES_ENODATA - - Bug: http://groups.google.com/group/nodejs/browse_thread/thread/a1268c9ea5e9ad9b - -Yang Tse (1 Dec 2010) -- fix compiler warning: conversion may lose significant bits - -- atoi: remove atoi usage - -- ares_init: fix compiler warning: conversion may lose significant bits - -- configure: fix autoconf warning - -- inet_pton: fix compiler warning - -- configure: use autobuilds to temporarily verify strict aliasing warnings. - - Temporarily, When cross-compiling with gcc 3.0 or later, enable strict aliasing - rules and warnings. Given that cross-compiled targets autobuilds do not run the - test-suite, there is no risk of running code that violates strict aliasing rules - -- ares_getnameinfo: Partially revert commit 85520d66e0ac7ac73411bc25e98769a88b2f - - Upon socket address family and length validation failure return ARES_ENOTIMP - in callback again, this is the error code documented in man page and used - mostly all over the library. - -- ares_getnameinfo: Validate socket address family and length. - - Validate socket address family and that the socket address length is appropriate - for the specified family. Failure is reported with ARES_EBADFAMILY in callback. - -- ares_getnameinfo: fix two compiler warnings - -- Added another VS10 version string - -- Fix GCC 4 compiler warning 'dereferencing type-punned pointer might break strict-aliasing rules'. - -- Revert commit 494274e653936335c255a47599970de3df21e7c4 - -- configure: fix autoconf 2.68 warning: no AC_LANG_SOURCE call detected in body - -- Fix compiler warning: array subscript has type 'char' - -- Fix GCC 4 compiler warning 'dereferencing type-punned pointer might break strict-aliasing rules'. - -- Revert following commits: - 07bc7ea79509bcc9ef6e09151e81766ed00d3392 - 3392a50ea3f8573ea4b7a9d82b9833dab60cb0e9 - 9912637d32c9987719a1ea12db591aee2941891c - - The purpose of the whole patch was to silence a compiler warning triggered - with GCC 4 on file ares_process.c The specific compiler warning was - 'dereferencing type-punned pointer might break strict-aliasing rules'. - - A simpler patch will follow to equally silence the warning. - -- ares_options: reorder header inclusions to make inclusion of - ares_private.h the last included one again. - -Daniel Stenberg (12 Nov 2010) -- [Patrik Thunstrom brought this change] - - adig: fix NAPTR parsing - - I ran across a small "issue" in your adig example. - - It is simply the last part of the NAPTR record, the replacement element, - which is not a string, as currently handled in adig, but a domain name. - -- ares_save_options: assignments instead of memcpy - -- init_by_options: don't copy an empty sortlist - - If there aren't any sort items to copy, don't bother. Without this - little precaution it would do a malloc(0) which causes undefined - behaviors and is frowned upon by curl's memdebug-system. - -Guenter Knauf (3 Oct 2010) -- Minor Watcom makefile tweaks. - -Daniel Stenberg (30 Sep 2010) -- [Mike Crowe brought this change] - - Fix lookup with HOSTALIASES set. - - ares__read_line returns ARES_EOF when it reaches the end of the - file. This will happen every time when reading to the end of the - HOSTALIASES file. Unfortunately single_domain treats this error as - being fatal. - - Signed-off-by: Mike Crowe - -Ben Greear (24 Aug 2010) -- Add missing break that caused get_ares_servers to fail. - - Reported-by: Ning Dong - Signed-off-by: Ben Greear - -Yang Tse (11 Aug 2010) -- configure: werror related adjustments - -Guenter Knauf (8 Aug 2010) -- Added copyright string to ares_version.h and make use of it in other files. - -- Block created ares_build.h for NetWare to avoid usage from other platforms. - -- Fix to overwrite default libname. - -- Some more Watcom makefile massage ... - -- Some more Watcom makefile massage ... - -Ben Greear (4 Aug 2010) -- sock-addr-storage: Detect and deal with lack of .ss_family member. - - AIX, at least, does not have sockaddr_storage.ss_family member. - Detect this in the configure logic and use proper #ifdefs in the - ares_process logic. - - Signed-off-by: Ben Greear - Tested-by: Tor Arntsen - -Guenter Knauf (3 Aug 2010) -- Added Watcom makefile based on libcurl's Makefile.Watcom. - -Ben Greear (31 Jul 2010) -- typo: Fix compile bug for platforms that don't have sockaddr_storage. - - Bug was introduced by me in previous commit. - - Signed-off-by: Ben Greear - -- Fix aliasing warning in gcc 4.4.4 (at least). - - Should be no functional change, though the code gets a bit - ugglier. - - Signed-off-by: Ben Greear - -Daniel Stenberg (31 Jul 2010) -- ares_set_servers_csv: use ISDIGIT - - The IS*() set of macros are preferred to the regular is*() functions as - they help us avoid the most common pitfalls. - -Ben Greear (30 Jul 2010) -- cast arg to isdigit to int - - Looks like it might silence a warning on Netware build. - - Signed-off-by: Ben Greear - -- remove all uses of uint32_t - - Previous fix forgot a few. - - Signed-off-by: Ben Greear - -- fix signed v/s unsigned casts warning in ares_gethostbyaddr.c - - Signed-off-by: Ben Greear - -- local-bind-fixup: Fix inet_pton warning. - - Conditionally include for inet_pton - headers. - - Signed-off-by: Ben Greear - -- build: Enable compiling with -Werror. - - This helps find compile warnings because they simply break - the build. - - To use: - ./configure --enable-warnings --enable-werror - - Signed-off-by: Ben Greear - -- ipv6: Fix some build issues related to the local-bind feature. - - Signed-off-by: Ben Greear diff --git a/deps/cares/CMakeLists.txt b/deps/cares/CMakeLists.txt index bd901733626678..d1d0200ee51703 100644 --- a/deps/cares/CMakeLists.txt +++ b/deps/cares/CMakeLists.txt @@ -1,6 +1,8 @@ # Copyright (C) The c-ares project and its contributors # SPDX-License-Identifier: MIT -CMAKE_MINIMUM_REQUIRED (VERSION 3.1.0) +CMAKE_MINIMUM_REQUIRED (VERSION 3.5.0) + +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/") INCLUDE (CheckIncludeFiles) INCLUDE (CheckTypeSize) @@ -10,10 +12,10 @@ INCLUDE (CheckCSourceCompiles) INCLUDE (CheckStructHasMember) INCLUDE (CheckLibraryExists) -PROJECT (c-ares LANGUAGES C VERSION "1.20.1" ) +PROJECT (c-ares LANGUAGES C VERSION "1.23.0" ) # Set this version before release -SET (CARES_VERSION "1.20.1") +SET (CARES_VERSION "1.23.0") INCLUDE (GNUInstallDirs) # include this *AFTER* PROJECT(), otherwise paths are wrong. @@ -28,26 +30,38 @@ INCLUDE (GNUInstallDirs) # include this *AFTER* PROJECT(), otherwise paths are w # For example, a version of 4:0:2 would generate output such as: # libname.so -> libname.so.2 # libname.so.2 -> libname.so.2.2.0 -SET (CARES_LIB_VERSIONINFO "9:1:7") +SET (CARES_LIB_VERSIONINFO "11:0:9") -OPTION (CARES_STATIC "Build as a static library" OFF) -OPTION (CARES_SHARED "Build as a shared library" ON) -OPTION (CARES_INSTALL "Create installation targets (chain builders may want to disable this)" ON) -OPTION (CARES_STATIC_PIC "Build the static library as PIC (position independent)" OFF) -OPTION (CARES_BUILD_TESTS "Build and run tests" OFF) +OPTION (CARES_STATIC "Build as a static library" OFF) +OPTION (CARES_SHARED "Build as a shared library" ON) +OPTION (CARES_INSTALL "Create installation targets (chain builders may want to disable this)" ON) +OPTION (CARES_STATIC_PIC "Build the static library as PIC (position independent)" OFF) +OPTION (CARES_BUILD_TESTS "Build and run tests" OFF) OPTION (CARES_BUILD_CONTAINER_TESTS "Build and run container tests (implies CARES_BUILD_TESTS, Linux only)" OFF) -OPTION (CARES_BUILD_TOOLS "Build tools" ON) +OPTION (CARES_BUILD_TOOLS "Build tools" ON) +OPTION (CARES_SYMBOL_HIDING "Hide private symbols in shared libraries" OFF) +OPTION (CARES_THREADS "Build with thread-safety support" ON) SET (CARES_RANDOM_FILE "/dev/urandom" CACHE STRING "Suitable File / Device Path for entropy, such as /dev/urandom") +# Tests require a C++ compiler +IF (CARES_BUILD_TESTS OR CARES_BUILD_CONTAINER_TESTS) + set(CMAKE_CXX_STANDARD 11) + set(CMAKE_CXX_STANDARD_REQUIRED TRUE) + set(CMAKE_CXX_EXTENSIONS FALSE) + enable_language(CXX) +ENDIF () + # Tests require static to be enabled on Windows to be able to access otherwise hidden symbols -IF (CARES_BUILD_TESTS AND (NOT CARES_STATIC) AND WIN32) +IF ((CARES_BUILD_TESTS OR CARES_BUILD_CONTAINER_TESTS) AND (NOT CARES_STATIC) AND WIN32) SET (CARES_STATIC ON) SET (CARES_STATIC_PIC ON) - MESSAGE (WARNING "Static building was requested be disabled, but reenabled to support tests") + MESSAGE (WARNING "Static building was requested be disabled, but re-enabled to support tests") ENDIF () +INCLUDE (EnableWarnings) + # allow linking against the static runtime library in msvc IF (MSVC) OPTION (CARES_MSVC_STATIC_RUNTIME "Link against the static runtime library" OFF) @@ -70,6 +84,21 @@ IF (MSVC) ENDIF () ENDIF () +IF (CARES_SYMBOL_HIDING) + IF (CMAKE_VERSION VERSION_LESS 3.12) + MESSAGE (FATAL_ERROR "Hiding symbols requires CMake 3.12") + ENDIF () + CMAKE_POLICY (SET CMP0063 NEW) + SET (CARES_SYMBOL_SCOPE_EXTERN [=[__attribute__ ((visibility("default")))]=]) + CHECK_C_SOURCE_COMPILES (" + ${CARES_SYMBOL_SCOPE_EXTERN} int somefunc() { return 0; } + int main() { return somefunc(); } + " HAVE_VISIBILITY_ATTRIBUTE) + IF (NOT HAVE_VISIBILITY_ATTRIBUTE) + MESSAGE (FATAL_ERROR "C compiler does not accept visibility attribute") + ENDIF () +ENDIF () + # Keep build organized. SET (CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}") SET (CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}") @@ -199,7 +228,6 @@ CHECK_INCLUDE_FILES (sys/uio.h HAVE_SYS_UIO_H) CHECK_INCLUDE_FILES (time.h HAVE_TIME_H) CHECK_INCLUDE_FILES (dlfcn.h HAVE_DLFCN_H) CHECK_INCLUDE_FILES (unistd.h HAVE_UNISTD_H) - # On OpenBSD, you must include sys/types.h before netinet/tcp.h IF (HAVE_SYS_TYPES_H) CHECK_INCLUDE_FILES ("sys/types.h;netinet/tcp.h" HAVE_NETINET_TCP_H) @@ -213,6 +241,8 @@ ENDIF () IF (WIN32) CHECK_INCLUDE_FILES ("winsock2.h;windows.h" HAVE_WINSOCK2_H) CHECK_INCLUDE_FILES ("winsock2.h;ws2tcpip.h;windows.h" HAVE_WS2TCPIP_H) +CHECK_INCLUDE_FILES ("winsock2.h;iphlpapi.h;windows.h" HAVE_IPHLPAPI_H) +CHECK_INCLUDE_FILES ("winsock2.h;netioapi.h;windows.h" HAVE_NETIOAPI_H) CHECK_INCLUDE_FILES ("winsock.h;windows.h" HAVE_WINSOCK_H) CHECK_INCLUDE_FILES (windows.h HAVE_WINDOWS_H) ENDIF () @@ -229,7 +259,7 @@ ELSEIF (CMAKE_SYSTEM_NAME STREQUAL "AIX") ELSEIF (CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") # Don't define _XOPEN_SOURCE on FreeBSD, it actually reduces visibility instead of increasing it ELSEIF (WIN32) - LIST (APPEND SYSFLAGS -DWIN32_LEAN_AND_MEAN -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -D_WIN32_WINNT=0x0600) + LIST (APPEND SYSFLAGS -DWIN32_LEAN_AND_MEAN -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -D_WIN32_WINNT=0x0602) ENDIF () ADD_DEFINITIONS(${SYSFLAGS}) @@ -289,12 +319,14 @@ CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_SELECT_H sys/select.h) CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_SOCKET_H sys/socket.h) CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_SOCKIO_H sys/sockio.h) CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_TIME_H sys/time.h) +CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_STAT_H sys/stat.h) CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_UIO_H sys/uio.h) CARES_EXTRAINCLUDE_IFSET (HAVE_TIME_H time.h) CARES_EXTRAINCLUDE_IFSET (HAVE_FCNTL_H fcntl.h) CARES_EXTRAINCLUDE_IFSET (HAVE_UNISTD_H unistd.h) CARES_EXTRAINCLUDE_IFSET (HAVE_WINSOCK2_H winsock2.h) CARES_EXTRAINCLUDE_IFSET (HAVE_WS2TCPIP_H ws2tcpip.h) +CARES_EXTRAINCLUDE_IFSET (HAVE_IPHLPAPI_H iphlpapi.h) CARES_EXTRAINCLUDE_IFSET (HAVE_WINDOWS_H windows.h) # Check Types @@ -399,7 +431,7 @@ CHECK_SYMBOL_EXISTS (strncmpi "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_STRNCMP CHECK_SYMBOL_EXISTS (strnicmp "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_STRNICMP) CHECK_SYMBOL_EXISTS (writev "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_WRITEV) CHECK_SYMBOL_EXISTS (arc4random_buf "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_ARC4RANDOM_BUF) - +CHECK_SYMBOL_EXISTS (stat "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_STAT) # On Android, the system headers may define __system_property_get(), but excluded # from libc. We need to perform a link test instead of a header/symbol test. @@ -411,6 +443,43 @@ SET (CMAKE_REQUIRED_DEFINITIONS) SET (CMAKE_REQUIRED_LIBRARIES) +################################################################################ +# Threading Support +# +IF (CARES_THREADS) + IF (WIN32) + # Do nothing, always has threads + ELSE () + # Need to prefer pthreads on platforms that may have more threading choices + # (e.g. Solaris) + SET (CMAKE_THREAD_PREFER_PTHREAD TRUE) + FIND_PACKAGE (Threads) + + IF (Threads_FOUND) + # Fix solaris9 bug due to libc having pthread_create() stubs that always fail. CMake + # doesn't realize that the real pthread functions aren't in libc, so sets the pthread + # library CAKE_THREAD_LIBS_INIT variable to blank instead of to the correct "-lpthread". + IF (CMAKE_SYSTEM_NAME STREQUAL "SunOS" AND NOT CMAKE_THREAD_LIBS_INIT) + SET (CMAKE_THREAD_LIBS_INIT "-lpthread") + ENDIF () + + # PThread functions. + CHECK_INCLUDE_FILES (pthread.h HAVE_PTHREAD_H) + CHECK_INCLUDE_FILES (pthread_np.h HAVE_PTHREAD_NP_H) + CARES_EXTRAINCLUDE_IFSET (HAVE_PTHREAD_H pthread.h) + CARES_EXTRAINCLUDE_IFSET (HAVE_PTHREAD_NP_H pthread_np.h) + CHECK_SYMBOL_EXISTS (pthread_init "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_PTHREAD_INIT) + # Make sure libcares.pc.cmake knows about thread libraries on static builds + LIST (APPEND CARES_DEPENDENT_LIBS ${CMAKE_THREAD_LIBS_INIT}) + ELSE () + MESSAGE (WARNING "Threading support not found, disabling...") + SET (CARES_THREADS OFF) + ENDIF () + ENDIF () +ENDIF () + + + ################################################################################ # recv, recvfrom, send, getnameinfo, gethostname # ARGUMENTS AND RETURN VALUES diff --git a/deps/cares/INSTALL.md b/deps/cares/INSTALL.md index 9b2f847be8cbe2..738375ec86690a 100644 --- a/deps/cares/INSTALL.md +++ b/deps/cares/INSTALL.md @@ -244,7 +244,7 @@ Ninja ----- Ninja is the next-generation build system meant for generators like CMake that -heavily parallize builds. Its use is very similar to the normal build: +heavily parallelize builds. Its use is very similar to the normal build: ```sh cd /path/to/cmake/source diff --git a/deps/cares/Makefile.Watcom b/deps/cares/Makefile.Watcom index 6ea10e532bc4a4..fddba58eed0224 100644 --- a/deps/cares/Makefile.Watcom +++ b/deps/cares/Makefile.Watcom @@ -41,8 +41,8 @@ MD = mkdir RD = rmdir /q /s 2>NUL CP = copy -CFLAGS = -3r -mf -hc -zff -zgf -zq -zm -zc -s -fr=con -w2 -fpi -oilrtfm -aa & - -wcd=201 -bt=nt -d+ -dWIN32 -dCARES_BUILDING_LIBRARY & +CFLAGS = -3r -mf -hc -zff -zgf -zq -zm -zc -s -fr=con -w2 -fpi -oilrtfm -aa & + -wcd=201 -bt=nt -d+ -dWIN32 -dCARES_BUILDING_LIBRARY & -dNTDDI_VERSION=0x06000000 -I. -I.\include -I.\src\lib $(SYS_INCL) LFLAGS = option quiet, map, caseexact, eliminate @@ -55,7 +55,7 @@ LFLAGS += debug all CFLAGS += -d0 !endif -CFLAGS += -d_WIN32_WINNT=0x0600 +CFLAGS += -d_WIN32_WINNT=0x0602 # # Change to suite. diff --git a/deps/cares/Makefile.am b/deps/cares/Makefile.am index cc22ac13b31b96..d1ab53cb3407bd 100644 --- a/deps/cares/Makefile.am +++ b/deps/cares/Makefile.am @@ -30,8 +30,8 @@ EXTRA_DIST = AUTHORS CHANGES README.cares $(man_MANS) RELEASE-NOTES \ c-ares-config.cmake.in libcares.pc.cmake libcares.pc.in buildconf get_ver.awk \ maketgz TODO README.msvc $(MSVCFILES) INSTALL.md README.md LICENSE.md \ CMakeLists.txt Makefile.dj Makefile.m32 Makefile.netware Makefile.msvc \ - Makefile.Watcom AUTHORS CONTRIBUTING.md SECURITY.md TODO - + Makefile.Watcom AUTHORS CONTRIBUTING.md SECURITY.md TODO \ + cmake/EnableWarnings.cmake CLEANFILES = $(PDFPAGES) $(HTMLPAGES) diff --git a/deps/cares/Makefile.in b/deps/cares/Makefile.in index 271369e15a67cd..32f61b59fda1c0 100644 --- a/deps/cares/Makefile.in +++ b/deps/cares/Makefile.in @@ -115,11 +115,15 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ $(top_srcdir)/m4/ax_ac_print_to_file.m4 \ $(top_srcdir)/m4/ax_add_am_macro_static.m4 \ $(top_srcdir)/m4/ax_am_macros_static.m4 \ + $(top_srcdir)/m4/ax_append_compile_flags.m4 \ + $(top_srcdir)/m4/ax_append_flag.m4 \ + $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_check_gnu_make.m4 \ $(top_srcdir)/m4/ax_code_coverage.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ $(top_srcdir)/m4/ax_file_escapes.m4 \ + $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_require_defined.m4 \ $(top_srcdir)/m4/cares-compilers.m4 \ $(top_srcdir)/m4/cares-confopts.m4 \ @@ -229,7 +233,7 @@ am__define_uniq_tagged_files = \ done | $(am__uniquify_input)` am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/libcares.pc.in \ AUTHORS INSTALL.md NEWS README.md TODO compile config.guess \ - config.sub depcomp install-sh ltmain.sh missing + config.sub install-sh ltmain.sh missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) @@ -357,6 +361,10 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_CXX = @PTHREAD_CXX@ +PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -376,6 +384,7 @@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ +ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ @@ -430,7 +439,8 @@ EXTRA_DIST = AUTHORS CHANGES README.cares $(man_MANS) RELEASE-NOTES \ c-ares-config.cmake.in libcares.pc.cmake libcares.pc.in buildconf get_ver.awk \ maketgz TODO README.msvc $(MSVCFILES) INSTALL.md README.md LICENSE.md \ CMakeLists.txt Makefile.dj Makefile.m32 Makefile.netware Makefile.msvc \ - Makefile.Watcom AUTHORS CONTRIBUTING.md SECURITY.md TODO + Makefile.Watcom AUTHORS CONTRIBUTING.md SECURITY.md TODO \ + cmake/EnableWarnings.cmake CLEANFILES = $(PDFPAGES) $(HTMLPAGES) DISTCLEANFILES = include/ares_build.h diff --git a/deps/cares/Makefile.m32 b/deps/cares/Makefile.m32 index e51e64b3f938ae..a01fe235d1311c 100644 --- a/deps/cares/Makefile.m32 +++ b/deps/cares/Makefile.m32 @@ -19,7 +19,7 @@ RANLIB = $(CROSSPREFIX)ranlib #RM = rm -f CP = cp -afv -CFLAGS = $(CARES_CFLAG_EXTRAS) -O2 -Wall -I./include -I./src/lib -D_WIN32_WINNT=0x0600 +CFLAGS = $(CARES_CFLAG_EXTRAS) -O2 -Wall -I./include -I./src/lib -D_WIN32_WINNT=0x0602 CFLAGS += -DCARES_STATICLIB LDFLAGS = $(CARES_LDFLAG_EXTRAS) -s LIBS = -lws2_32 -liphlpapi @@ -63,6 +63,7 @@ install: chmod u-w ${DESTDIR}${libdir}/$(LIB) ${INSTALL} -m 444 ${srcdir}/include/ares.h ${DESTDIR}${includedir} ${INSTALL} -m 444 ${srcdir}/include/ares_build.h ${DESTDIR}${includedir} + ${INSTALL} -m 444 ${srcdir}/include/ares_dns_record.h ${DESTDIR}${includedir} ${INSTALL} -m 444 ${srcdir}/include/ares_rules.h ${DESTDIR}${includedir} ${INSTALL} -m 444 ${srcdir}/include/ares_version.h ${DESTDIR}${includedir} (for man in $(MANPAGES); do \ diff --git a/deps/cares/Makefile.msvc b/deps/cares/Makefile.msvc index 17daa0c8c0cad6..0e774fbf33af6e 100644 --- a/deps/cares/Makefile.msvc +++ b/deps/cares/Makefile.msvc @@ -437,6 +437,7 @@ install: @copy /y $(SRCDIR)\include\ares_build.h "$(INSTALL_DIR_INC)" >NUL @copy /y $(SRCDIR)\include\ares_rules.h "$(INSTALL_DIR_INC)" >NUL @copy /y $(SRCDIR)\include\ares_version.h "$(INSTALL_DIR_INC)" >NUL + @copy /y $(SRCDIR)\include\ares_dns_record.h "$(INSTALL_DIR_INC)" >NUL @echo Installed c-ares $(CFG) !ENDIF diff --git a/deps/cares/Makefile.netware b/deps/cares/Makefile.netware index 790b17a8e0196a..5ebbc76207dcfd 100644 --- a/deps/cares/Makefile.netware +++ b/deps/cares/Makefile.netware @@ -92,7 +92,7 @@ ifeq ($(LIBARCH),LIBC) CFLAGS += -align 4 else # PRELUDE = $(SDK_CLIB)/imports/clibpre.o - # to avoid the __init_* / __deinit_* whoes dont use prelude from NDK + # to avoid the __init_* / __deinit_* whose dont use prelude from NDK PRELUDE = "$(MWCW_PATH)/libraries/runtime/prelude.obj" # CFLAGS += -include "$(MWCW_PATH)/headers/nlm_clib_prefix.h" CFLAGS += -align 1 @@ -114,7 +114,7 @@ ifeq ($(LIBARCH),LIBC) PRELUDE = $(SDK_LIBC)/imports/libcpre.gcc.o else # PRELUDE = $(SDK_CLIB)/imports/clibpre.gcc.o - # to avoid the __init_* / __deinit_* whoes dont use prelude from NDK + # to avoid the __init_* / __deinit_* whose dont use prelude from NDK # http://www.gknw.net/development/mk_nlm/gcc_pre.zip PRELUDE = $(NDK_ROOT)/pre/prelude.o CFLAGS += -include $(NDKBASE)/nlmconv/genlm.h diff --git a/deps/cares/README.md b/deps/cares/README.md index 40d3c08114eaaa..29788a8a2dff1a 100644 --- a/deps/cares/README.md +++ b/deps/cares/README.md @@ -6,6 +6,8 @@ c-ares [![Coverage Status](https://coveralls.io/repos/github/c-ares/c-ares/badge.svg)](https://coveralls.io/github/c-ares/c-ares) [![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/291/badge)](https://bestpractices.coreinfrastructure.org/projects/291) [![Fuzzing Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/c-ares.svg)](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:c-ares) +[![Bugs](https://sonarcloud.io/api/project_badges/measure?project=c-ares_c-ares&metric=bugs)](https://sonarcloud.io/summary/new_code?id=c-ares_c-ares) +[![Coverity Scan Status](https://scan.coverity.com/projects/c-ares/badge.svg)](https://scan.coverity.com/projects/c-ares) This is c-ares, an asynchronous resolver library. It is intended for applications which need to perform DNS queries without blocking, or need to @@ -21,7 +23,7 @@ If you find bugs, correct flaws, have questions or have comments in general in regard to c-ares (or by all means the original ares too), get in touch with us on the c-ares mailing list: https://lists.haxx.se/listinfo/c-ares -c-ares is distributed the MIT license. +c-ares is distributed under the MIT license. You'll find all c-ares details and news here: https://c-ares.org/ diff --git a/deps/cares/RELEASE-NOTES b/deps/cares/RELEASE-NOTES index 169a39fcb33b4e..cc80ccdcc1a542 100644 --- a/deps/cares/RELEASE-NOTES +++ b/deps/cares/RELEASE-NOTES @@ -1,74 +1,59 @@ -c-ares version 1.20.1 - -This release resolves a significant issue in the 1.20.0 release. - -Bug fixes: - o Resolve use-after-free issue when TCP connection is terminated before a - response is returned [17] - o Reduce number of queries for a load test case to prevent overloading some - build systems - o Fix fuzz test build target [18] - - -c-ares 1.20.0 notes below: - -This is a feature and bugfix release with some significant internal changes. - -Changes: - o Update from 1989 MIT license text to modern MIT license text [1] - o Remove acountry from built tools as nerd.dk is gone [3] - o Add new ARES_OPT_UDP_MAX_QUERIES configuration option to limit the number of - queries that can be made from a single ephemeral port [7] - o Default per-query timeout has been reduced to 2s with a 3x retry count [8] - o Modernization: start implementing some common data structures that are easy - to use and hard to misuse. This will make code refactoring easier and remove - some varied implementations in use. This change also makes ares_timeout() - more efficient [9] - o Use SPDX identifiers and a REUSE CI job to verify [12] - o rand: add support for getrandom() [14] - -Bug fixes: - o TCP back to back queries were broken [2] - o Ensure queries for ares_getaddrinfo() are not requeued during destruction [4] - o ares_getaddrinfo() should not retry other address classes if one address - class has already been returned [5] - o Avoid production ill-formed result when qualifying a name with the root - domain [6] - o Fix missing prefix for CMake generated libcares.pc [10] - o DNS server ports will now be read from system configuration instead of - defaulting to port 53 [11] - o Remove some unreachable code [13] - o Replace usages of sprintf with snprintf [15] - o Fix Watcom instructions and update Windows URLs [16] +c-ares version 1.23.0 + +This is a feature and bugfix release. + +Features: + o Introduce optional (but on by default) thread-safety for the c-ares + library. This has no API nor ABI implications. [2] + o resolv.conf in modern systems uses attempts and timeouts options instead + of the old retrans and retry options. [6] + o Query caching support based on TTL of responses. Can be enabled via + ares_init_options() with ARES_OPT_QUERY_CACHE. [12] + +Bug Fixes: + o ares_init_options() for ARES_OPT_UDP_PORT and ARES_OPT_TCP_PORT accept the + port in host byte order, but it was reading it as network byte order. + Regression introduced in 1.20.0. [1] + o ares_init_options() for ARES_FLAG_NOSEARCH was not being honored for + ares_getaddrinfo() or ares_gethostbyname(). Regression introduced in + 1.16.0. [3] + o Autotools MacOS and iOS version check was failing [4] + o Environment variables passed to c-ares are meant to be an override for + system configuration. Regression introduced in 1.22.0. [5] + o Spelling fixes as detected by codespell. [7] + o The timeout returned by ares_timeout() was truncated to milliseconds but + validated to microseconds which could cause a user to attempt to process + timeouts prior to the timeout actually expiring. [8] + o CMake was not honoring CXXFLAGS passed in via the environment which could + cause compile and link errors with distribution hardening flags during + packaging. [9] + o Fix Windows UWP and Cygwin compilation. [10] + o ares_set_servers_*() for legacy reasons needs to accept an empty server list + and zero out all servers. This results in an inoperable channel and thus is + only used in simulation testing, but we don't want to break users. + Regression introduced in 1.21.0. [11] Thanks go to these friendly people for their efforts and contributions: - Alexey A Tikhonov (@alexey-tikhonov) - Ben Noordhuis (@bnoordhuis) Brad House (@bradh352) - @Chilledheart + Christian Clauss (@cclauss) Daniel Stenberg (@bagder) - Douglas R. Reno (@renodr) - Jérôme Duval (@korli) - Sam Morris (@yrro) - Tim Wojtulewicz (@timwoj) -(9 contributors) + Deal (@halx99) + Ignat (@Kontakter) + @petrvh +(6 contributors) References to bug reports and discussions on issues: - [1] = https://github.com/c-ares/c-ares/pull/556 - [2] = https://github.com/c-ares/c-ares/pull/552 - [3] = https://github.com/c-ares/c-ares/pull/554 - [4] = https://github.com/c-ares/c-ares/pull/553 - [5] = https://github.com/c-ares/c-ares/pull/551 - [6] = https://github.com/c-ares/c-ares/pull/546 - [7] = https://github.com/c-ares/c-ares/pull/549 - [8] = https://github.com/c-ares/c-ares/pull/542 - [9] = https://github.com/c-ares/c-ares/pull/540 - [10] = https://github.com/c-ares/c-ares/pull/530 - [11] = https://github.com/c-ares/c-ares/pull/534 - [12] = https://github.com/c-ares/c-ares/commit/c1b00c41 - [13] = https://github.com/c-ares/c-ares/pull/527 - [14] = https://github.com/c-ares/c-ares/pull/526 - [15] = https://github.com/c-ares/c-ares/pull/525 - [16] = https://github.com/c-ares/c-ares/pull/524 - [17] = https://github.com/c-ares/c-ares/pull/562 - [18] = https://github.com/c-ares/c-ares/pull/559 + [1] = https://github.com/c-ares/c-ares/commit/fb52c3f + [2] = https://github.com/c-ares/c-ares/pull/636 + [3] = https://github.com/c-ares/c-ares/pull/638 + [4] = https://github.com/c-ares/c-ares/commit/f4d8c9a + [5] = https://github.com/c-ares/c-ares/commit/b674abd + [6] = https://github.com/c-ares/c-ares/pull/632 + [7] = https://github.com/c-ares/c-ares/pull/634 + [8] = https://github.com/c-ares/c-ares/pull/633 + [9] = https://github.com/c-ares/c-ares/commit/33ee6c0 + [10] = https://github.com/c-ares/c-ares/pull/627 + [11] = https://github.com/c-ares/c-ares/commit/320cefe + [12] = https://github.com/c-ares/c-ares/pull/625 + + diff --git a/deps/cares/TODO b/deps/cares/TODO index fa31cea6fb79b4..3b200926e352de 100644 --- a/deps/cares/TODO +++ b/deps/cares/TODO @@ -1,23 +1,4 @@ TODO ==== -ares_reinit() - -- To allow an app to force a re-read of /etc/resolv.conf etc, pretty much - like the res_init() resolver function offers - -ares_gethostbyname - -- When built to support IPv6, it needs to also support PF_UNSPEC or similar, - so that an application can ask for any protocol and then c-ares would return - all known resolves and not just explicitly IPv4 _or_ IPv6 resolves. - -ares_process - -- Upon next ABI breakage ares_process() should be changed to return 'int' - and return ARES_ENOTINITIALIZED if ares_library_init() has not been called. - -ares_process_fd - -- Upon next ABI breakage ares_process_fd() should be changed to return - 'int' and return ARES_ENOTINITIALIZED if library has not been initialized. +Please see https://github.com/c-ares/c-ares/issues diff --git a/deps/cares/aclocal.m4 b/deps/cares/aclocal.m4 index ef2987bfa003df..49403387854f82 100644 --- a/deps/cares/aclocal.m4 +++ b/deps/cares/aclocal.m4 @@ -1188,11 +1188,15 @@ m4_include([m4/ax_ac_append_to_file.m4]) m4_include([m4/ax_ac_print_to_file.m4]) m4_include([m4/ax_add_am_macro_static.m4]) m4_include([m4/ax_am_macros_static.m4]) +m4_include([m4/ax_append_compile_flags.m4]) +m4_include([m4/ax_append_flag.m4]) +m4_include([m4/ax_check_compile_flag.m4]) m4_include([m4/ax_check_gnu_make.m4]) m4_include([m4/ax_code_coverage.m4]) m4_include([m4/ax_cxx_compile_stdcxx.m4]) m4_include([m4/ax_cxx_compile_stdcxx_11.m4]) m4_include([m4/ax_file_escapes.m4]) +m4_include([m4/ax_pthread.m4]) m4_include([m4/ax_require_defined.m4]) m4_include([m4/cares-compilers.m4]) m4_include([m4/cares-confopts.m4]) diff --git a/deps/cares/aminclude_static.am b/deps/cares/aminclude_static.am index d35c73b8f4bf68..2348e33451100c 100644 --- a/deps/cares/aminclude_static.am +++ b/deps/cares/aminclude_static.am @@ -1,6 +1,6 @@ # aminclude_static.am generated automatically by Autoconf -# from AX_AM_MACROS_STATIC on Sun Oct 8 23:23:39 CEST 2023 +# from AX_AM_MACROS_STATIC on Thu Nov 30 13:40:06 CET 2023 # Code coverage diff --git a/deps/cares/cares.gyp b/deps/cares/cares.gyp index 9797a3216ae882..ffa8769f00d9ae 100644 --- a/deps/cares/cares.gyp +++ b/deps/cares/cares.gyp @@ -11,21 +11,24 @@ 'src/lib/ares__buf.c', 'src/lib/ares__buf.h', 'src/lib/ares__close_sockets.c', + 'src/lib/ares__hosts_file.c', 'src/lib/ares__htable.c', 'src/lib/ares__htable.h', 'src/lib/ares__htable_asvp.c', 'src/lib/ares__htable_asvp.h', - 'src/lib/ares__htable_stvp.c', - 'src/lib/ares__htable_stvp.h', + 'src/lib/ares__htable_strvp.c', + 'src/lib/ares__htable_strvp.h', + 'src/lib/ares__htable_szvp.c', + 'src/lib/ares__htable_szvp.h', 'src/lib/ares__llist.c', 'src/lib/ares__llist.h', - 'src/lib/ares__get_hostent.c', 'src/lib/ares__parse_into_addrinfo.c', 'src/lib/ares__read_line.c', - 'src/lib/ares__readaddrinfo.c', 'src/lib/ares__slist.c', 'src/lib/ares__slist.h', + 'src/lib/ares__socket.c', 'src/lib/ares__sortaddrinfo.c', + 'src/lib/ares__threads.c', 'src/lib/ares__timeval.c', 'src/lib/ares_android.c', 'src/lib/ares_cancel.c', @@ -33,6 +36,12 @@ 'src/lib/ares_data.c', 'src/lib/ares_data.h', 'src/lib/ares_destroy.c', + 'src/lib/ares_dns_mapping.c', + 'src/lib/ares_dns_name.c', + 'src/lib/ares_dns_parse.c', + 'src/lib/ares_dns_record.c', + 'src/lib/ares_dns_private.h', + 'src/lib/ares_dns_write.c', 'src/lib/ares_expand_name.c', 'src/lib/ares_expand_string.c', 'src/lib/ares_fds.c', @@ -49,9 +58,8 @@ 'src/lib/ares_init.c', 'src/lib/ares_ipv6.h', 'src/lib/ares_library_init.c', + 'src/lib/ares_math.c', 'src/lib/ares_mkquery.c', - 'src/lib/ares_nowarn.c', - 'src/lib/ares_nowarn.h', 'src/lib/ares_options.c', 'src/lib/ares_parse_a_reply.c', 'src/lib/ares_parse_aaaa_reply.c', @@ -67,6 +75,7 @@ 'src/lib/ares_platform.h', 'src/lib/ares_private.h', 'src/lib/ares_process.c', + 'src/lib/ares_qcache.c', 'src/lib/ares_query.c', 'src/lib/ares_rand.c', 'src/lib/ares_search.c', @@ -74,11 +83,14 @@ 'src/lib/ares_setup.h', 'src/lib/ares_strcasecmp.c', 'src/lib/ares_strcasecmp.h', - 'src/lib/ares_strdup.c', - 'src/lib/ares_strdup.h', + 'src/lib/ares_str.c', + 'src/lib/ares_str.h', 'src/lib/ares_strerror.c', 'src/lib/ares_strsplit.c', + 'src/lib/ares_sysconfig.c', + 'src/lib/ares_sysconfig_files.c', 'src/lib/ares_timeout.c', + 'src/lib/ares_update_servers.c', 'src/lib/ares_version.c', 'src/lib/bitncmp.c', 'src/lib/bitncmp.h', diff --git a/deps/cares/cmake/EnableWarnings.cmake b/deps/cares/cmake/EnableWarnings.cmake new file mode 100644 index 00000000000000..a394a8721f79b3 --- /dev/null +++ b/deps/cares/cmake/EnableWarnings.cmake @@ -0,0 +1,399 @@ +# Copyright (c) Monetra Technologies LLC +# SPDX-License-Identifier: MIT + +# EnableWarnings.cmake +# +# Checks for and turns on a large number of warning C flags. +# +# Adds the following helper functions: +# +# remove_warnings(... list of warnings ...) +# Turn off given list of individual warnings for all targets and subdirectories added after this. +# +# remove_all_warnings() +# Remove all warning flags, add -w to suppress built-in warnings. +# +# remove_all_warnings_from_targets(... list of targets ...) +# Suppress warnings for the given targets only. +# +# push_warnings() +# Save current warning flags by pushing them onto an internal stack. Note that modifications to the internal +# stack are only visible in the current CMakeLists.txt file and its children. +# +# Note: changing warning flags multiple times in the same directory only affects add_subdirectory() calls. +# Targets in the directory will always use the warning flags in effect at the end of the CMakeLists.txt +# file - this is due to really weird and annoying legacy behavior of CMAKE_C_FLAGS. +# +# pop_warnings() +# Restore the last set of flags that were saved with push_warnings(). Note that modifications to the internal +# stack are only visible in the current CMakeLists.txt file and its children. +# + +if (_internal_enable_warnings_already_run) + return() +endif () +set(_internal_enable_warnings_already_run TRUE) + +include(CheckCCompilerFlag) +include(CheckCXXCompilerFlag) + +get_property(languages GLOBAL PROPERTY ENABLED_LANGUAGES) + +# internal helper: _int_enable_warnings_set_flags_ex(langs_var configs_var [warnings flags]) +function(_int_enable_warnings_set_flags_ex langs_var configs_var) + if (NOT ARGN) + return() + endif () + + if (NOT ${configs_var}) + set(${configs_var} "NONE") + endif () + string(TOUPPER "${${configs_var}}" ${configs_var}) + + foreach(_flag ${ARGN}) + string(MAKE_C_IDENTIFIER "HAVE_${_flag}" varname) + + if ("C" IN_LIST ${langs_var}) + check_c_compiler_flag(${_flag} ${varname}) + if (${varname}) + foreach (config IN LISTS ${configs_var}) + if (config STREQUAL "NONE") + set(config) + else () + set(config "_${config}") + endif () + string(APPEND CMAKE_C_FLAGS${config} " ${_flag}") + endforeach () + endif () + endif () + + if ("CXX" IN_LIST ${langs_var}) + string(APPEND varname "_CXX") + check_cxx_compiler_flag(${_flag} ${varname}) + if (${varname}) + foreach (config IN LISTS ${configs_var}) + if (config STREQUAL "NONE") + set(config) + else () + set(config "_${config}") + endif () + string(APPEND CMAKE_CXX_FLAGS${config} " ${_flag}") + endforeach () + endif () + endif () + endforeach() + + foreach(lang C CXX) + foreach (config IN LISTS ${configs_var}) + string(TOUPPER "${config}" config) + if (config STREQUAL "NONE") + set(config) + else () + set(config "_${config}") + endif () + string(STRIP "${CMAKE_${lang}_FLAGS${config}}" CMAKE_${lang}_FLAGS${config}) + set(CMAKE_${lang}_FLAGS${config} "${CMAKE_${lang}_FLAGS${config}}" PARENT_SCOPE) + endforeach () + endforeach() +endfunction() + +# internal helper: _int_enable_warnings_set_flags(langs_var [warnings flags]) +macro(_int_enable_warnings_set_flags langs_var) + set(configs "NONE") + _int_enable_warnings_set_flags_ex(${langs_var} configs ${ARGN}) +endmacro() + +set(_flags_C) +set(_flags_CXX) +set(_debug_flags_C) +set(_debug_flags_CXX) + +if (MSVC) + # Visual Studio uses a completely different nomenclature for warnings than gcc/mingw/clang, so none of the + # "-W[name]" warnings will work. + + # W4 would be better but it produces unnecessary warnings like: + # * warning C4706: assignment within conditional expression + # Triggered when doing "while(1)" + # * warning C4115: 'timeval' : named type definition in parentheses + # * warning C4201: nonstandard extension used : nameless struct/union + # Triggered by system includes (commctrl.h, shtypes.h, Shlobj.h) + set(_flags + /W3 + /we4013 # Treat "function undefined, assuming extern returning int" warning as an error. https://docs.microsoft.com/en-us/cpp/error-messages/compiler-warnings/compiler-warning-level-3-c4013 + ) + + list(APPEND _flags_C ${_flags}) + list(APPEND _flags_CXX ${_flags}) + +elseif (CMAKE_C_COMPILER_ID MATCHES "Intel") + # Intel's compiler warning flags are more like Visual Studio than GCC, though the numbers aren't the same. + set(_flags + # Use warning level 3, quite wordy. + -w3 + # Disable warnings we don't care about (add more as they are encountered). + -wd383 # Spammy warning about initializing from a temporary object in C++ (which is done all the time ...). + -wd11074 # Diagnostic related to inlining. + -wd11076 # Diagnostic related to inlining. + ) + + list(APPEND _flags_C ${_flags}) + list(APPEND _flags_CXX ${_flags}) + +elseif (CMAKE_C_COMPILER_ID MATCHES "XL") + set (_flags + -qwarn64 + -qformat=all + -qflag=i:i + ) + list(APPEND _flags_C ${_flags}) + list(APPEND _flags_CXX ${_flags}) + +else () + # If we're compiling with GCC / Clang / MinGW (or anything else besides Visual Studio or Intel): + # C Flags: + list(APPEND _flags_C + -Wall + -Wextra + + # Enable additional warnings not covered by Wall and Wextra. + -Wcast-align + -Wconversion + -Wdeclaration-after-statement + -Wdouble-promotion + -Wfloat-equal + -Wformat-security + -Winit-self + -Wjump-misses-init + -Wlogical-op + -Wmissing-braces + -Wmissing-declarations + -Wmissing-format-attribute + -Wmissing-include-dirs + -Wmissing-prototypes + -Wnested-externs + -Wno-coverage-mismatch + -Wold-style-definition + -Wpacked + -Wpointer-arith + -Wredundant-decls + -Wshadow + -Wsign-conversion + -Wstrict-overflow + -Wstrict-prototypes + -Wtrampolines + -Wundef + -Wunused + -Wvariadic-macros + -Wvla + -Wwrite-strings + + # On Windows MinGW I think implicit fallthrough enabled by -Wextra must not default to 3 + -Wimplicit-fallthrough=3 + + # Treat implicit variable typing and implicit function declarations as errors. + -Werror=implicit-int + -Werror=implicit-function-declaration + + # Make MacOSX honor -mmacosx-version-min + -Werror=partial-availability + + # Some clang versions might warn if an argument like "-I/path/to/headers" is unused, + # silence these. + -Qunused-arguments + ) + + # C++ flags: + list(APPEND _flags_CXX + -Wall + -Wextra + + # Enable additional warnings not covered by Wall and Wextra. + -Wcast-align + -Wformat-security + -Wmissing-declarations + -Wmissing-format-attribute + -Wpacked-bitfield-compat + -Wredundant-decls + -Wvla + + # Turn off unused parameter warnings with C++ (they happen often in C++ and Qt). + -Wno-unused-parameter + + # Some clang versions might warn if an argument like "-I/path/to/headers" is unused, + # silence these. + -Qunused-arguments + ) + + # Note: when cross-compiling to Windows from Cygwin, the Qt Mingw packages have a bunch of + # noisy type-conversion warnings in headers. So, only enable those warnings if we're + # not building that configuration. + if (NOT (WIN32 AND (CMAKE_HOST_SYSTEM_NAME MATCHES "CYGWIN"))) + list(APPEND _flags_CXX + -Wconversion + -Wfloat-equal + -Wsign-conversion + ) + endif () + + # Add flags to force colored output even when output is redirected via pipe. + if (CMAKE_GENERATOR MATCHES "Ninja") + set(color_default TRUE) + else () + set(color_default FALSE) + endif () + option(FORCE_COLOR "Force compiler to always colorize, even when output is redirected." ${color_default}) + mark_as_advanced(FORCE FORCE_COLOR) + if (FORCE_COLOR) + set(_flags + -fdiagnostics-color=always # GCC + -fcolor-diagnostics # Clang + ) + list(APPEND _flags_C ${_flags}) + list(APPEND _flags_CXX ${_flags}) + endif () + + # Add -fno-omit-frame-pointer (and optionally -fno-inline) to make debugging and stack dumps nicer. + set(_flags + -fno-omit-frame-pointer + ) + option(M_NO_INLINE "Disable function inlining for RelWithDebInfo and Debug configurations?" FALSE) + if (M_NO_INLINE) + list(APPEND _flags + -fno-inline + ) + endif () + list(APPEND _debug_flags_C ${_flags}) + list(APPEND _debug_flags_CXX ${_flags}) +endif () + +# Check and set compiler flags. +set(_debug_configs + RelWithDebInfo + Debug +) +foreach(_lang ${languages}) + _int_enable_warnings_set_flags(_lang ${_flags_${_lang}}) + _int_enable_warnings_set_flags_ex(_lang _debug_configs ${_debug_flags_${_lang}}) + + # Ensure pure Debug builds are NOT optimized (not possible on Visual Studio). + # Any optimization of a Debug build will prevent debuggers like lldb from + # fully displaying backtraces and stepping. + if (NOT MSVC) + set(_config Debug) + _int_enable_warnings_set_flags_ex(_lang _config -O0) + endif () +endforeach() + + + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +# Helper functions + + +# This function can be called in subdirectories, to prune out warnings that they don't want. +# vararg: warning flags to remove from list of enabled warnings. All "no" flags after EXPLICIT_DISABLE +# will be added to C flags. +# +# Ex.: remove_warnings(-Wall -Wdouble-promotion -Wcomment) prunes those warnings flags from the compile command. +function(remove_warnings) + get_property(languages GLOBAL PROPERTY ENABLED_LANGUAGES) + set(langs C) + if ("CXX" IN_LIST languages) + list(APPEND langs CXX) + endif () + + foreach(lang ${langs}) + set(toadd) + set(in_explicit_disable FALSE) + foreach (flag ${ARGN}) + if (flag STREQUAL "EXPLICIT_DISABLE") + set(in_explicit_disable TRUE) + elseif (in_explicit_disable) + list(APPEND toadd "${flag}") + else () + string(REGEX REPLACE "${flag}([ \t]+|$)" "" CMAKE_${lang}_FLAGS "${CMAKE_${lang}_FLAGS}") + endif () + endforeach () + _int_enable_warnings_set_flags(lang ${toadd}) + string(STRIP "${CMAKE_${lang}_FLAGS}" CMAKE_${lang}_FLAGS) + set(CMAKE_${lang}_FLAGS "${CMAKE_${lang}_FLAGS}" PARENT_SCOPE) + endforeach() +endfunction() + + +# Explicitly suppress all warnings. As long as this flag is the last warning flag, warnings will be +# suppressed even if earlier flags enabled warnings. +function(remove_all_warnings) + get_property(languages GLOBAL PROPERTY ENABLED_LANGUAGES) + set(langs C) + if ("CXX" IN_LIST languages) + list(APPEND langs CXX) + endif () + + foreach(lang ${langs}) + string(REGEX REPLACE "[-/][Ww][^ \t]*([ \t]+|$)" "" CMAKE_${lang}_FLAGS "${CMAKE_${lang}_FLAGS}") + if (MSVC) + string(APPEND CMAKE_${lang}_FLAGS " /w") + else () + string(APPEND CMAKE_${lang}_FLAGS " -w") + endif () + string(STRIP "${CMAKE_${lang}_FLAGS}" CMAKE_${lang}_FLAGS) + set(CMAKE_${lang}_FLAGS "${CMAKE_${lang}_FLAGS}" PARENT_SCOPE) + endforeach() +endfunction() + + +function(remove_all_warnings_from_targets) + foreach (target ${ARGN}) + if (MSVC) + target_compile_options(${target} PRIVATE "/w") + else () + target_compile_options(${target} PRIVATE "-w") + endif () + endforeach() +endfunction() + + +# Save the current warning settings to an internal variable. +function(push_warnings) + get_property(languages GLOBAL PROPERTY ENABLED_LANGUAGES) + set(langs C) + if ("CXX" IN_LIST languages) + list(APPEND langs CXX) + endif () + + foreach(lang ${langs}) + if (CMAKE_${lang}_FLAGS MATCHES ";") + message(AUTHOR_WARNING "Cannot push warnings for ${lang}, CMAKE_${lang}_FLAGS contains semicolons") + continue() + endif () + # Add current flags to end of internal list. + list(APPEND _enable_warnings_internal_${lang}_flags_stack "${CMAKE_${lang}_FLAGS}") + # Propagate results up to caller's scope. + set(_enable_warnings_internal_${lang}_flags_stack "${_enable_warnings_internal_${lang}_flags_stack}" PARENT_SCOPE) + endforeach() +endfunction() + + +# Restore the current warning settings from an internal variable. +function(pop_warnings) + get_property(languages GLOBAL PROPERTY ENABLED_LANGUAGES) + set(langs C) + if ("CXX" IN_LIST languages) + list(APPEND langs CXX) + endif () + + foreach(lang ${langs}) + if (NOT _enable_warnings_internal_${lang}_flags_stack) + continue() + endif () + # Pop flags off of end of list, overwrite current flags with whatever we popped off. + list(GET _enable_warnings_internal_${lang}_flags_stack -1 CMAKE_${lang}_FLAGS) + list(REMOVE_AT _enable_warnings_internal_${lang}_flags_stack -1) + # Propagate results up to caller's scope. + set(_enable_warnings_internal_${lang}_flags_stack "${_enable_warnings_internal_${lang}_flags_stack}" PARENT_SCOPE) + string(STRIP "${CMAKE_${lang}_FLAGS}" CMAKE_${lang}_FLAGS) + set(CMAKE_${lang}_FLAGS "${CMAKE_${lang}_FLAGS}" PARENT_SCOPE) + endforeach() +endfunction() diff --git a/deps/cares/configure b/deps/cares/configure index ebaa43c2df287f..481483327bb835 100755 --- a/deps/cares/configure +++ b/deps/cares/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.71 for c-ares 1.20.1. +# Generated by GNU Autoconf 2.71 for c-ares 1.23.0. # # Report bugs to . # @@ -855,8 +855,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='c-ares' PACKAGE_TARNAME='c-ares' -PACKAGE_VERSION='1.20.1' -PACKAGE_STRING='c-ares 1.20.1' +PACKAGE_VERSION='1.23.0' +PACKAGE_STRING='c-ares 1.23.0' PACKAGE_BUGREPORT='c-ares mailing list: http://lists.haxx.se/listinfo/c-ares' PACKAGE_URL='' @@ -905,6 +905,11 @@ CARES_PRIVATE_LIBS CFLAG_CARES_SYMBOL_HIDING DOING_CARES_SYMBOL_HIDING_FALSE DOING_CARES_SYMBOL_HIDING_TRUE +PTHREAD_CFLAGS +PTHREAD_LIBS +PTHREAD_CXX +PTHREAD_CC +ax_pthread_config CARES_RANDOM_FILE DOING_NATIVE_WINDOWS_FALSE DOING_NATIVE_WINDOWS_TRUE @@ -1086,6 +1091,7 @@ enable_libtool_lock enable_libgcc with_random enable_nonblocking +enable_cares_threads enable_tests ' ac_precious_vars='build_alias @@ -1650,7 +1656,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures c-ares 1.20.1 to adapt to many kinds of systems. +\`configure' configures c-ares 1.23.0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1721,7 +1727,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of c-ares 1.20.1:";; + short | recursive ) echo "Configuration of c-ares 1.23.0:";; esac cat <<\_ACEOF @@ -1763,6 +1769,7 @@ Optional Features: --enable-libgcc use libgcc when linking --enable-nonblocking Enable non-blocking communications --disable-nonblocking Disable non-blocking communications + --disable-cares-threads Disable building of thread safety support --enable-tests build test suite Optional Packages: @@ -1861,7 +1868,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -c-ares configure 1.20.1 +c-ares configure 1.23.0 generated by GNU Autoconf 2.71 Copyright (C) 2021 Free Software Foundation, Inc. @@ -2453,7 +2460,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by c-ares $as_me 1.20.1, which was +It was created by c-ares $as_me 1.23.0, which was generated by GNU Autoconf 2.71. Invocation command line was $ $0$ac_configure_args_raw @@ -3426,7 +3433,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu -CARES_VERSION_INFO="9:1:7" +CARES_VERSION_INFO="11:0:9" @@ -3563,20 +3570,17 @@ printf "%s\n" "yes" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable strict compiler warnings" >&5 printf %s "checking whether to enable strict compiler warnings... " >&6; } - OPT_COMPILER_WARNINGS="default" + OPT_COMPILER_WARNINGS="yes" # Check whether --enable-warnings was given. if test ${enable_warnings+y} then : - enableval=$enable_warnings; OPT_COMPILER_WARNINGS=$enableval + enableval=$enable_warnings; OPT_COMPILER_WARNINGS=yes fi case "$OPT_COMPILER_WARNINGS" in no) want_warnings="no" ;; - default) - want_warnings="$want_debug" - ;; *) want_warnings="yes" ;; @@ -7060,7 +7064,7 @@ fi # Define the identity of the package. PACKAGE='c-ares' - VERSION='1.20.1' + VERSION='1.23.0' printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h @@ -22714,26 +22718,13 @@ printf "%s\n" "$as_me: WARNING: compiler options rejected: $tmp_options" >&2;} # if test "$want_warnings" = "yes"; then tmp_CFLAGS="$tmp_CFLAGS -pedantic" - tmp_CFLAGS="$tmp_CFLAGS -Wall -Wextra" - tmp_CFLAGS="$tmp_CFLAGS -Wpointer-arith -Wwrite-strings" - tmp_CFLAGS="$tmp_CFLAGS -Wshadow" - tmp_CFLAGS="$tmp_CFLAGS -Winline -Wnested-externs" - tmp_CFLAGS="$tmp_CFLAGS -Wmissing-declarations" - tmp_CFLAGS="$tmp_CFLAGS -Wmissing-prototypes" + tmp_CFLAGS="$tmp_CFLAGS -Winline" tmp_CFLAGS="$tmp_CFLAGS -Wno-long-long" - tmp_CFLAGS="$tmp_CFLAGS -Wfloat-equal" tmp_CFLAGS="$tmp_CFLAGS -Wno-multichar -Wsign-compare" - tmp_CFLAGS="$tmp_CFLAGS -Wundef" tmp_CFLAGS="$tmp_CFLAGS -Wno-format-nonliteral" - tmp_CFLAGS="$tmp_CFLAGS -Wendif-labels -Wstrict-prototypes" - tmp_CFLAGS="$tmp_CFLAGS -Wdeclaration-after-statement" - tmp_CFLAGS="$tmp_CFLAGS -Wcast-align" + tmp_CFLAGS="$tmp_CFLAGS -Wendif-labels" tmp_CFLAGS="$tmp_CFLAGS -Wno-system-headers" tmp_CFLAGS="$tmp_CFLAGS -Wshorten-64-to-32" - # - if test "$compiler_num" -ge "101"; then - tmp_CFLAGS="$tmp_CFLAGS -Wunused" - fi fi ;; # @@ -22753,21 +22744,12 @@ printf "%s\n" "$as_me: WARNING: compiler options rejected: $tmp_options" >&2;} tmp_CFLAGS="$tmp_CFLAGS -pedantic" fi # - tmp_CFLAGS="$tmp_CFLAGS -Wall -W" - # - if test "$compiler_num" -ge "104"; then - tmp_CFLAGS="$tmp_CFLAGS -Wpointer-arith -Wwrite-strings" - if test "x$cross_compiling" != "xyes" || - test "$compiler_num" -ge "300"; then - tmp_CFLAGS="$tmp_CFLAGS -Wunused -Wshadow" - fi - fi + tmp_CFLAGS="$tmp_CFLAGS -W" # if test "$compiler_num" -ge "207"; then - tmp_CFLAGS="$tmp_CFLAGS -Winline -Wnested-externs" + tmp_CFLAGS="$tmp_CFLAGS -Winline" if test "x$cross_compiling" != "xyes" || test "$compiler_num" -ge "300"; then - tmp_CFLAGS="$tmp_CFLAGS -Wmissing-declarations" tmp_CFLAGS="$tmp_CFLAGS -Wmissing-prototypes" fi fi @@ -22777,9 +22759,7 @@ printf "%s\n" "$as_me: WARNING: compiler options rejected: $tmp_options" >&2;} fi # if test "$compiler_num" -ge "296"; then - tmp_CFLAGS="$tmp_CFLAGS -Wfloat-equal" tmp_CFLAGS="$tmp_CFLAGS -Wno-multichar -Wsign-compare" - tmp_CFLAGS="$tmp_CFLAGS -Wundef" fi # if test "$compiler_num" -ge "297"; then @@ -22791,26 +22771,18 @@ printf "%s\n" "$as_me: WARNING: compiler options rejected: $tmp_options" >&2;} fi # if test "$compiler_num" -ge "303"; then - tmp_CFLAGS="$tmp_CFLAGS -Wendif-labels -Wstrict-prototypes" - fi - # - if test "$compiler_num" -ge "304"; then - tmp_CFLAGS="$tmp_CFLAGS -Wdeclaration-after-statement" + tmp_CFLAGS="$tmp_CFLAGS -Wendif-labels" fi # if test "$compiler_num" -ge "400"; then tmp_CFLAGS="$tmp_CFLAGS -Wstrict-aliasing=3" fi - # - if test "$compiler_num" -ge "402"; then - tmp_CFLAGS="$tmp_CFLAGS -Wcast-align" - fi # if test "$compiler_num" -ge "403"; then tmp_CFLAGS="$tmp_CFLAGS -Wtype-limits -Wold-style-declaration" tmp_CFLAGS="$tmp_CFLAGS -Wmissing-parameter-type -Wempty-body" tmp_CFLAGS="$tmp_CFLAGS -Wclobbered -Wignored-qualifiers" - tmp_CFLAGS="$tmp_CFLAGS -Wconversion -Wno-sign-conversion -Wvla" + tmp_CFLAGS="$tmp_CFLAGS -Wno-sign-conversion" fi # if test "$compiler_num" -ge "405"; then @@ -22852,15 +22824,13 @@ printf "%s\n" "$as_me: WARNING: compiler options rejected: $tmp_options" >&2;} # if test "$want_warnings" = "yes"; then if test "$compiler_num" -gt "600"; then - tmp_CPPFLAGS="$tmp_CPPFLAGS -Wall -w2" + tmp_CPPFLAGS="$tmp_CPPFLAGS -w2" tmp_CPPFLAGS="$tmp_CPPFLAGS -Wcheck" tmp_CPPFLAGS="$tmp_CPPFLAGS -Wcomment" tmp_CPPFLAGS="$tmp_CPPFLAGS -Wdeprecated" tmp_CPPFLAGS="$tmp_CPPFLAGS -Wmissing-prototypes" tmp_CPPFLAGS="$tmp_CPPFLAGS -Wp64" - tmp_CPPFLAGS="$tmp_CPPFLAGS -Wpointer-arith" tmp_CPPFLAGS="$tmp_CPPFLAGS -Wreturn-type" - tmp_CPPFLAGS="$tmp_CPPFLAGS -Wshadow" tmp_CPPFLAGS="$tmp_CPPFLAGS -Wuninitialized" tmp_CPPFLAGS="$tmp_CPPFLAGS -Wunused-function" fi @@ -22910,8 +22880,7 @@ printf "%s\n" "$as_me: WARNING: compiler options rejected: $tmp_options" >&2;} TINY_C) # if test "$want_warnings" = "yes"; then - tmp_CFLAGS="$tmp_CFLAGS -Wall" - tmp_CFLAGS="$tmp_CFLAGS -Wwrite-strings" + tmp_CFLAGS="$tmp_CFLAGS" tmp_CFLAGS="$tmp_CFLAGS -Wunsupported" fi ;; @@ -22919,7 +22888,7 @@ printf "%s\n" "$as_me: WARNING: compiler options rejected: $tmp_options" >&2;} WATCOM_UNIX_C) # if test "$want_warnings" = "yes"; then - tmp_CFLAGS="$tmp_CFLAGS -Wall -Wextra" + tmp_CFLAGS="$tmp_CFLAGS" fi ;; # @@ -23077,6 +23046,172 @@ printf "%s\n" "$as_me: WARNING: compiler options rejected: $tmp_CFLAGS $tmp_CPPF fi +if test "$want_warnings" = "yes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts " >&5 +printf %s "checking whether C compiler accepts ... " >&6; } +if test ${ax_cv_check_cflags__+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + ax_check_save_flags=$CFLAGS + CFLAGS="$CFLAGS " + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ax_cv_check_cflags__=yes +else $as_nop + ax_cv_check_cflags__=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CFLAGS=$ax_check_save_flags +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags__" >&5 +printf "%s\n" "$ax_cv_check_cflags__" >&6; } +if test x"$ax_cv_check_cflags__" = xyes +then : + : +else $as_nop + : +fi + +if test ${CFLAGS+y} +then : + case " $CFLAGS " in + *" "*) + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : CFLAGS already contains "; } >&5 + (: CFLAGS already contains ) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; + *) + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \""; } >&5 + (: CFLAGS="$CFLAGS ") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + CFLAGS="$CFLAGS " + ;; + esac +else $as_nop + CFLAGS="" +fi + + + +for flag in -Wall \ + -Wextra \ + -Wcast-align \ + -Wconversion \ + -Wdeclaration-after-statement \ + -Wdouble-promotion \ + -Wfloat-equal \ + -Wformat-security \ + -Winit-self \ + -Wjump-misses-init \ + -Wlogical-op \ + -Wmissing-braces \ + -Wmissing-declarations \ + -Wmissing-format-attribute \ + -Wmissing-include-dirs \ + -Wmissing-prototypes \ + -Wnested-externs \ + -Wno-coverage-mismatch \ + -Wold-style-definition \ + -Wpacked \ + -Wpointer-arith \ + -Wredundant-decls \ + -Wshadow \ + -Wsign-conversion \ + -Wstrict-overflow \ + -Wstrict-prototypes \ + -Wtrampolines \ + -Wundef \ + -Wunused \ + -Wvariadic-macros \ + -Wvla \ + -Wwrite-strings \ + -Werror=implicit-int \ + -Werror=implicit-function-declaration \ + -Werror=partial-availability \ + ; do + as_CACHEVAR=`printf "%s\n" "ax_cv_check_cflags_-Werror_$flag" | $as_tr_sh` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5 +printf %s "checking whether C compiler accepts $flag... " >&6; } +if eval test \${$as_CACHEVAR+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + ax_check_save_flags=$CFLAGS + CFLAGS="$CFLAGS -Werror $flag" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + eval "$as_CACHEVAR=yes" +else $as_nop + eval "$as_CACHEVAR=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CFLAGS=$ax_check_save_flags +fi +eval ac_res=\$$as_CACHEVAR + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +if test x"`eval 'as_val=${'$as_CACHEVAR'};printf "%s\n" "$as_val"'`" = xyes +then : + if test ${CFLAGS+y} +then : + case " $CFLAGS " in + *" $flag "*) + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : CFLAGS already contains \$flag"; } >&5 + (: CFLAGS already contains $flag) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; + *) + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \$flag\""; } >&5 + (: CFLAGS="$CFLAGS $flag") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + CFLAGS="$CFLAGS $flag" + ;; + esac +else $as_nop + CFLAGS="$flag" +fi + +else $as_nop + : +fi + +done + +fi + if test "$compiler_id" = "INTEL_UNIX_C"; then # if test "$compiler_num" -ge "1000"; then @@ -23626,7 +23761,7 @@ printf "%s\n" "#define HAVE_WS2TCPIP_H 1" >>confdefs.h ;; esac - CPPFLAGS="$CPPFLAGS -D_WIN32_WINNT=0x0600" + CPPFLAGS="$CPPFLAGS -D_WIN32_WINNT=0x0602" ;; *) ac_cv_header_winsock_h="no" @@ -24512,6 +24647,7 @@ printf %s "checking for iOS minimum version 10 or later... " >&6; } #include +#include #include int @@ -24555,6 +24691,7 @@ printf %s "checking for macOS minimum version 10.12 or later... " >&6; } #include +#include #include int @@ -25394,6 +25531,56 @@ if test "x$ac_cv_header_assert_h" = xyes then : printf "%s\n" "#define HAVE_ASSERT_H 1" >>confdefs.h +fi +ac_fn_c_check_header_compile "$LINENO" "iphlpapi.h" "ac_cv_header_iphlpapi_h" " +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_TIME_H +#include +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include +#endif + +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif + + +" +if test "x$ac_cv_header_iphlpapi_h" = xyes +then : + printf "%s\n" "#define HAVE_IPHLPAPI_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "netioapi.h" "ac_cv_header_netioapi_h" " +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_TIME_H +#include +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include +#endif + +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif + + +" +if test "x$ac_cv_header_netioapi_h" = xyes +then : + printf "%s\n" "#define HAVE_NETIOAPI_H 1" >>confdefs.h + fi ac_fn_c_check_header_compile "$LINENO" "netdb.h" "ac_cv_header_netdb_h" " #ifdef HAVE_SYS_TYPES_H @@ -33532,67 +33719,253 @@ printf "%s\n" "no" >&6; } fi +cares_includes_sys_stat="\ +/* includes start */ +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +/* includes end */" + ac_fn_c_check_header_compile "$LINENO" "sys/types.h" "ac_cv_header_sys_types_h" "$cares_includes_sys_stat +" +if test "x$ac_cv_header_sys_types_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_TYPES_H 1" >>confdefs.h +fi +ac_fn_c_check_header_compile "$LINENO" "sys/stat.h" "ac_cv_header_sys_stat_h" "$cares_includes_sys_stat +" +if test "x$ac_cv_header_sys_stat_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_STAT_H 1" >>confdefs.h - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for PF_INET6" >&5 -printf %s "checking for PF_INET6... " >&6; } +fi + + + + # + tst_links_stat="unknown" + tst_proto_stat="unknown" + tst_compi_stat="unknown" + tst_allow_stat="unknown" + # + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if stat can be linked" >&5 +printf %s "checking if stat can be linked... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ + /* Define stat to an innocuous variant, in case declares stat. + For example, HP-UX 11i declares gettimeofday. */ +#define stat innocuous_stat -#undef inline -#ifdef HAVE_WINDOWS_H -#ifndef WIN32_LEAN_AND_MEAN -#define WIN32_LEAN_AND_MEAN -#endif -#include -#ifdef HAVE_WINSOCK2_H -#include -#endif -#else -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_SYS_SOCKET_H -#include +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char stat (); below. */ + +#include +#undef stat + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" #endif +char stat (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_stat || defined __stub___stat +choke me #endif +int +main (void) +{ +return stat (); + ; + return 0; +} - #ifdef PF_INET6 - VARIABLEWASDEFINED - #else - NJET - #endif +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + tst_links_stat="yes" + +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + tst_links_stat="no" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + # + if test "$tst_links_stat" = "yes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if stat is prototyped" >&5 +printf %s "checking if stat is prototyped... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + $cares_includes_sys_stat _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "VARIABLEWASDEFINED" >/dev/null 2>&1 + $EGREP "stat" >/dev/null 2>&1 then : - ac_constant="yes" + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + tst_proto_stat="yes" + else $as_nop - ac_constant="no" + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + tst_proto_stat="no" fi rm -rf conftest* - if test "$ac_constant" = "yes" ; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 + fi + # + if test "$tst_proto_stat" = "yes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if stat is compilable" >&5 +printf %s "checking if stat is compilable... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + + $cares_includes_sys_types + $cares_includes_sys_stat + +int +main (void) +{ + + if(0 != stat(0, 0)) + return 1; + + ; + return 0; +} + +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } + tst_compi_stat="yes" -printf "%s\n" "#define HAVE_PF_INET6 1" >>confdefs.h +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + tst_compi_stat="no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + fi + # + if test "$tst_compi_stat" = "yes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if stat usage allowed" >&5 +printf %s "checking if stat usage allowed... " >&6; } + if test "x$cares_disallow_stat" != "xyes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + tst_allow_stat="yes" + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + tst_allow_stat="no" + fi + fi + # + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if stat might be used" >&5 +printf %s "checking if stat might be used... " >&6; } + if test "$tst_links_stat" = "yes" && + test "$tst_proto_stat" = "yes" && + test "$tst_compi_stat" = "yes" && + test "$tst_allow_stat" = "yes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +printf "%s\n" "#define HAVE_STAT 1" >>confdefs.h + + ac_cv_func_stat="yes" else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } - + ac_cv_func_stat="no" fi - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for AF_INET6" >&5 -printf %s "checking for AF_INET6... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for PF_INET6" >&5 +printf %s "checking for PF_INET6... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + +#undef inline +#ifdef HAVE_WINDOWS_H +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include +#ifdef HAVE_WINSOCK2_H +#include +#endif +#else +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#endif + + + #ifdef PF_INET6 + VARIABLEWASDEFINED + #else + NJET + #endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "VARIABLEWASDEFINED" >/dev/null 2>&1 +then : + ac_constant="yes" +else $as_nop + ac_constant="no" + +fi +rm -rf conftest* + + if test "$ac_constant" = "yes" ; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +printf "%s\n" "#define HAVE_PF_INET6 1" >>confdefs.h + + + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + + fi + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for AF_INET6" >&5 +printf %s "checking for AF_INET6... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -34458,8 +34831,8 @@ printf "%s\n" "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: couldn't figure out endianess, assuming little endian!" >&5 -printf "%s\n" "$as_me: WARNING: couldn't figure out endianess, assuming little endian!" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: couldn't figure out endianness, assuming little endian!" >&5 +printf "%s\n" "$as_me: WARNING: couldn't figure out endianness, assuming little endian!" >&2;} ;; esac @@ -34539,6 +34912,810 @@ printf "%s\n" "$as_me: WARNING: non-blocking sockets disabled." >&2;} +# Check whether --enable-cares-threads was given. +if test ${enable_cares_threads+y} +then : + enableval=$enable_cares_threads; CARES_THREADS=${enableval} +else $as_nop + CARES_THREADS=yes +fi + + +if test "${CARES_THREADS}" = "yes" -a "x${ac_cv_native_windows}" != "xyes" ; then + + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ax_pthread_ok=no + +# We used to check for pthread.h first, but this fails if pthread.h +# requires special compiler flags (e.g. on Tru64 or Sequent). +# It gets checked for in the link test anyway. + +# First of all, check if the user has set any of the PTHREAD_LIBS, +# etcetera environment variables, and if threads linking works using +# them: +if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then + ax_pthread_save_CC="$CC" + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + if test "x$PTHREAD_CC" != "x" +then : + CC="$PTHREAD_CC" +fi + if test "x$PTHREAD_CXX" != "x" +then : + CXX="$PTHREAD_CXX" +fi + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS" >&5 +printf %s "checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char pthread_join (); +int +main (void) +{ +return pthread_join (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ax_pthread_ok=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 +printf "%s\n" "$ax_pthread_ok" >&6; } + if test "x$ax_pthread_ok" = "xno"; then + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" + fi + CC="$ax_pthread_save_CC" + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" +fi + +# We must check for the threads library under a number of different +# names; the ordering is very important because some systems +# (e.g. DEC) have both -lpthread and -lpthreads, where one of the +# libraries is broken (non-POSIX). + +# Create a list of thread flags to try. Items with a "," contain both +# C compiler flags (before ",") and linker flags (after ","). Other items +# starting with a "-" are C compiler flags, and remaining items are +# library names, except for "none" which indicates that we try without +# any flags at all, and "pthread-config" which is a program returning +# the flags for the Pth emulation library. + +ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" + +# The ordering *is* (sometimes) important. Some notes on the +# individual items follow: + +# pthreads: AIX (must check this before -lpthread) +# none: in case threads are in libc; should be tried before -Kthread and +# other compiler flags to prevent continual compiler warnings +# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64 +# (Note: HP C rejects this with "bad form for `-t' option") +# -pthreads: Solaris/gcc (Note: HP C also rejects) +# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it +# doesn't hurt to check since this sometimes defines pthreads and +# -D_REENTRANT too), HP C (must be checked before -lpthread, which +# is present but should not be used directly; and before -mthreads, +# because the compiler interprets this as "-mt" + "-hreads") +# -mthreads: Mingw32/gcc, Lynx/gcc +# pthread: Linux, etcetera +# --thread-safe: KAI C++ +# pthread-config: use pthread-config program (for GNU Pth library) + +case $host_os in + + freebsd*) + + # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) + # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) + + ax_pthread_flags="-kthread lthread $ax_pthread_flags" + ;; + + hpux*) + + # From the cc(1) man page: "[-mt] Sets various -D flags to enable + # multi-threading and also sets -lpthread." + + ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags" + ;; + + openedition*) + + # IBM z/OS requires a feature-test macro to be defined in order to + # enable POSIX threads at all, so give the user a hint if this is + # not set. (We don't define these ourselves, as they can affect + # other portions of the system API in unpredictable ways.) + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +# if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS) + AX_PTHREAD_ZOS_MISSING +# endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "AX_PTHREAD_ZOS_MISSING" >/dev/null 2>&1 +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&5 +printf "%s\n" "$as_me: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&2;} +fi +rm -rf conftest* + + ;; + + solaris*) + + # On Solaris (at least, for some versions), libc contains stubbed + # (non-functional) versions of the pthreads routines, so link-based + # tests will erroneously succeed. (N.B.: The stubs are missing + # pthread_cleanup_push, or rather a function called by this macro, + # so we could check for that, but who knows whether they'll stub + # that too in a future libc.) So we'll check first for the + # standard Solaris way of linking pthreads (-mt -lpthread). + + ax_pthread_flags="-mt,-lpthread pthread $ax_pthread_flags" + ;; +esac + +# Are we compiling with Clang? + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC is Clang" >&5 +printf %s "checking whether $CC is Clang... " >&6; } +if test ${ax_cv_PTHREAD_CLANG+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ax_cv_PTHREAD_CLANG=no + # Note that Autoconf sets GCC=yes for Clang as well as GCC + if test "x$GCC" = "xyes"; then + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Note: Clang 2.7 lacks __clang_[a-z]+__ */ +# if defined(__clang__) && defined(__llvm__) + AX_PTHREAD_CC_IS_CLANG +# endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "AX_PTHREAD_CC_IS_CLANG" >/dev/null 2>&1 +then : + ax_cv_PTHREAD_CLANG=yes +fi +rm -rf conftest* + + fi + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG" >&5 +printf "%s\n" "$ax_cv_PTHREAD_CLANG" >&6; } +ax_pthread_clang="$ax_cv_PTHREAD_CLANG" + + +# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC) + +# Note that for GCC and Clang -pthread generally implies -lpthread, +# except when -nostdlib is passed. +# This is problematic using libtool to build C++ shared libraries with pthread: +# [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25460 +# [2] https://bugzilla.redhat.com/show_bug.cgi?id=661333 +# [3] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=468555 +# To solve this, first try -pthread together with -lpthread for GCC + +if test "x$GCC" = "xyes" +then : + ax_pthread_flags="-pthread,-lpthread -pthread -pthreads $ax_pthread_flags" +fi + +# Clang takes -pthread (never supported any other flag), but we'll try with -lpthread first + +if test "x$ax_pthread_clang" = "xyes" +then : + ax_pthread_flags="-pthread,-lpthread -pthread" +fi + + +# The presence of a feature test macro requesting re-entrant function +# definitions is, on some systems, a strong hint that pthreads support is +# correctly enabled + +case $host_os in + darwin* | hpux* | linux* | osf* | solaris*) + ax_pthread_check_macro="_REENTRANT" + ;; + + aix*) + ax_pthread_check_macro="_THREAD_SAFE" + ;; + + *) + ax_pthread_check_macro="--" + ;; +esac +if test "x$ax_pthread_check_macro" = "x--" +then : + ax_pthread_check_cond=0 +else $as_nop + ax_pthread_check_cond="!defined($ax_pthread_check_macro)" +fi + + +if test "x$ax_pthread_ok" = "xno"; then +for ax_pthread_try_flag in $ax_pthread_flags; do + + case $ax_pthread_try_flag in + none) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5 +printf %s "checking whether pthreads work without any flags... " >&6; } + ;; + + *,*) + PTHREAD_CFLAGS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\1/"` + PTHREAD_LIBS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\2/"` + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with \"$PTHREAD_CFLAGS\" and \"$PTHREAD_LIBS\"" >&5 +printf %s "checking whether pthreads work with \"$PTHREAD_CFLAGS\" and \"$PTHREAD_LIBS\"... " >&6; } + ;; + + -*) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $ax_pthread_try_flag" >&5 +printf %s "checking whether pthreads work with $ax_pthread_try_flag... " >&6; } + PTHREAD_CFLAGS="$ax_pthread_try_flag" + ;; + + pthread-config) + # Extract the first word of "pthread-config", so it can be a program name with args. +set dummy pthread-config; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ax_pthread_config+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ax_pthread_config"; then + ac_cv_prog_ax_pthread_config="$ax_pthread_config" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ax_pthread_config="yes" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_prog_ax_pthread_config" && ac_cv_prog_ax_pthread_config="no" +fi +fi +ax_pthread_config=$ac_cv_prog_ax_pthread_config +if test -n "$ax_pthread_config"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_config" >&5 +printf "%s\n" "$ax_pthread_config" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + if test "x$ax_pthread_config" = "xno" +then : + continue +fi + PTHREAD_CFLAGS="`pthread-config --cflags`" + PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" + ;; + + *) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$ax_pthread_try_flag" >&5 +printf %s "checking for the pthreads library -l$ax_pthread_try_flag... " >&6; } + PTHREAD_LIBS="-l$ax_pthread_try_flag" + ;; + esac + + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + + # Check for various functions. We must include pthread.h, + # since some functions may be macros. (On the Sequent, we + # need a special flag -Kthread to make this header compile.) + # We check for pthread_join because it is in -lpthread on IRIX + # while pthread_create is in libc. We check for pthread_attr_init + # due to DEC craziness with -lpthreads. We check for + # pthread_cleanup_push because it is one of the few pthread + # functions on Solaris that doesn't have a non-functional libc stub. + # We try pthread_create on general principles. + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +# if $ax_pthread_check_cond +# error "$ax_pthread_check_macro must be defined" +# endif + static void *some_global = NULL; + static void routine(void *a) + { + /* To avoid any unused-parameter or + unused-but-set-parameter warning. */ + some_global = a; + } + static void *start_routine(void *a) { return a; } +int +main (void) +{ +pthread_t th; pthread_attr_t attr; + pthread_create(&th, 0, start_routine, 0); + pthread_join(th, 0); + pthread_attr_init(&attr); + pthread_cleanup_push(routine, 0); + pthread_cleanup_pop(0) /* ; */ + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ax_pthread_ok=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 +printf "%s\n" "$ax_pthread_ok" >&6; } + if test "x$ax_pthread_ok" = "xyes" +then : + break +fi + + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" +done +fi + + +# Clang needs special handling, because older versions handle the -pthread +# option in a rather... idiosyncratic way + +if test "x$ax_pthread_clang" = "xyes"; then + + # Clang takes -pthread; it has never supported any other flag + + # (Note 1: This will need to be revisited if a system that Clang + # supports has POSIX threads in a separate library. This tends not + # to be the way of modern systems, but it's conceivable.) + + # (Note 2: On some systems, notably Darwin, -pthread is not needed + # to get POSIX threads support; the API is always present and + # active. We could reasonably leave PTHREAD_CFLAGS empty. But + # -pthread does define _REENTRANT, and while the Darwin headers + # ignore this macro, third-party headers might not.) + + # However, older versions of Clang make a point of warning the user + # that, in an invocation where only linking and no compilation is + # taking place, the -pthread option has no effect ("argument unused + # during compilation"). They expect -pthread to be passed in only + # when source code is being compiled. + # + # Problem is, this is at odds with the way Automake and most other + # C build frameworks function, which is that the same flags used in + # compilation (CFLAGS) are also used in linking. Many systems + # supported by AX_PTHREAD require exactly this for POSIX threads + # support, and in fact it is often not straightforward to specify a + # flag that is used only in the compilation phase and not in + # linking. Such a scenario is extremely rare in practice. + # + # Even though use of the -pthread flag in linking would only print + # a warning, this can be a nuisance for well-run software projects + # that build with -Werror. So if the active version of Clang has + # this misfeature, we search for an option to squash it. + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread" >&5 +printf %s "checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread... " >&6; } +if test ${ax_cv_PTHREAD_CLANG_NO_WARN_FLAG+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown + # Create an alternate version of $ac_link that compiles and + # links in two steps (.c -> .o, .o -> exe) instead of one + # (.c -> exe), because the warning occurs only in the second + # step + ax_pthread_save_ac_link="$ac_link" + ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g' + ax_pthread_link_step=`printf "%s\n" "$ac_link" | sed "$ax_pthread_sed"` + ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)" + ax_pthread_save_CFLAGS="$CFLAGS" + for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do + if test "x$ax_pthread_try" = "xunknown" +then : + break +fi + CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS" + ac_link="$ax_pthread_save_ac_link" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int main(void){return 0;} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_link="$ax_pthread_2step_ac_link" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int main(void){return 0;} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + done + ac_link="$ax_pthread_save_ac_link" + CFLAGS="$ax_pthread_save_CFLAGS" + if test "x$ax_pthread_try" = "x" +then : + ax_pthread_try=no +fi + ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try" + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&5 +printf "%s\n" "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&6; } + + case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in + no | unknown) ;; + *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;; + esac + +fi # $ax_pthread_clang = yes + + + +# Various other checks: +if test "x$ax_pthread_ok" = "xyes"; then + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + + # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5 +printf %s "checking for joinable pthread attribute... " >&6; } +if test ${ax_cv_PTHREAD_JOINABLE_ATTR+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ax_cv_PTHREAD_JOINABLE_ATTR=unknown + for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ +int attr = $ax_pthread_attr; return attr /* ; */ + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + done + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_JOINABLE_ATTR" >&5 +printf "%s\n" "$ax_cv_PTHREAD_JOINABLE_ATTR" >&6; } + if test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \ + test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \ + test "x$ax_pthread_joinable_attr_defined" != "xyes" +then : + +printf "%s\n" "#define PTHREAD_CREATE_JOINABLE $ax_cv_PTHREAD_JOINABLE_ATTR" >>confdefs.h + + ax_pthread_joinable_attr_defined=yes + +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether more special flags are required for pthreads" >&5 +printf %s "checking whether more special flags are required for pthreads... " >&6; } +if test ${ax_cv_PTHREAD_SPECIAL_FLAGS+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ax_cv_PTHREAD_SPECIAL_FLAGS=no + case $host_os in + solaris*) + ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS" + ;; + esac + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_SPECIAL_FLAGS" >&5 +printf "%s\n" "$ax_cv_PTHREAD_SPECIAL_FLAGS" >&6; } + if test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \ + test "x$ax_pthread_special_flags_added" != "xyes" +then : + PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS" + ax_pthread_special_flags_added=yes +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for PTHREAD_PRIO_INHERIT" >&5 +printf %s "checking for PTHREAD_PRIO_INHERIT... " >&6; } +if test ${ax_cv_PTHREAD_PRIO_INHERIT+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ +int i = PTHREAD_PRIO_INHERIT; + return i; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ax_cv_PTHREAD_PRIO_INHERIT=yes +else $as_nop + ax_cv_PTHREAD_PRIO_INHERIT=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_PRIO_INHERIT" >&5 +printf "%s\n" "$ax_cv_PTHREAD_PRIO_INHERIT" >&6; } + if test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \ + test "x$ax_pthread_prio_inherit_defined" != "xyes" +then : + +printf "%s\n" "#define HAVE_PTHREAD_PRIO_INHERIT 1" >>confdefs.h + + ax_pthread_prio_inherit_defined=yes + +fi + + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" + + # More AIX lossage: compile with *_r variant + if test "x$GCC" != "xyes"; then + case $host_os in + aix*) + case "x/$CC" in #( + x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6) : + #handle absolute path differently from PATH based program lookup + case "x$CC" in #( + x/*) : + + if as_fn_executable_p ${CC}_r +then : + PTHREAD_CC="${CC}_r" +fi + if test "x${CXX}" != "x" +then : + if as_fn_executable_p ${CXX}_r +then : + PTHREAD_CXX="${CXX}_r" +fi +fi + ;; #( + *) : + + for ac_prog in ${CC}_r +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_PTHREAD_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$PTHREAD_CC"; then + ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_PTHREAD_CC="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +PTHREAD_CC=$ac_cv_prog_PTHREAD_CC +if test -n "$PTHREAD_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5 +printf "%s\n" "$PTHREAD_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$PTHREAD_CC" && break +done +test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" + + if test "x${CXX}" != "x" +then : + for ac_prog in ${CXX}_r +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_PTHREAD_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$PTHREAD_CXX"; then + ac_cv_prog_PTHREAD_CXX="$PTHREAD_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_PTHREAD_CXX="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +PTHREAD_CXX=$ac_cv_prog_PTHREAD_CXX +if test -n "$PTHREAD_CXX"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CXX" >&5 +printf "%s\n" "$PTHREAD_CXX" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$PTHREAD_CXX" && break +done +test -n "$PTHREAD_CXX" || PTHREAD_CXX="$CXX" + +fi + + ;; +esac + ;; #( + *) : + ;; +esac + ;; + esac + fi +fi + +test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" +test -n "$PTHREAD_CXX" || PTHREAD_CXX="$CXX" + + + + + + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test "x$ax_pthread_ok" = "xyes"; then + + : +else + ax_pthread_ok=no + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: threads requested but not supported" >&5 +printf "%s\n" "$as_me: WARNING: threads requested but not supported" >&2;} + CARES_THREADS=no + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + if test "${CARES_THREADS}" = "yes" ; then + ac_fn_c_check_header_compile "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default" +if test "x$ac_cv_header_pthread_h" = xyes +then : + printf "%s\n" "#define HAVE_PTHREAD_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "pthread_np.h" "ac_cv_header_pthread_np_h" "$ac_includes_default" +if test "x$ac_cv_header_pthread_np_h" = xyes +then : + printf "%s\n" "#define HAVE_PTHREAD_NP_H 1" >>confdefs.h + +fi + + LIBS="$PTHREAD_LIBS $LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + CC="$PTHREAD_CC" + CXX="$PTHREAD_CXX" + fi +fi + +if test "${CARES_THREADS}" = "yes" ; then + +printf "%s\n" "#define CARES_THREADS 1 " >>confdefs.h + +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether hiding of library internal symbols will actually happen" >&5 printf %s "checking whether hiding of library internal symbols will actually happen... " >&6; } CFLAG_CARES_SYMBOL_HIDING="" @@ -35354,7 +36531,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by c-ares $as_me 1.20.1, which was +This file was extended by c-ares $as_me 1.23.0, which was generated by GNU Autoconf 2.71. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -35422,7 +36599,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ -c-ares config.status 1.20.1 +c-ares config.status 1.23.0 configured by $0, generated by GNU Autoconf 2.71, with options \\"\$ac_cs_config\\" diff --git a/deps/cares/configure.ac b/deps/cares/configure.ac index e3b73faa124f21..c69886ff3fe133 100644 --- a/deps/cares/configure.ac +++ b/deps/cares/configure.ac @@ -20,10 +20,10 @@ ############################################################# AC_PREREQ([2.60]) -AC_INIT([c-ares], [1.20.1], +AC_INIT([c-ares], [1.23.0], [c-ares mailing list: http://lists.haxx.se/listinfo/c-ares]) -CARES_VERSION_INFO="9:1:7" +CARES_VERSION_INFO="11:0:9" dnl This flag accepts an argument of the form current[:revision[:age]]. So, dnl passing -version-info 3:12:1 sets current to 3, revision to 12, and age to dnl 1. @@ -202,6 +202,45 @@ CARES_SET_COMPILER_DEBUG_OPTS CARES_SET_COMPILER_OPTIMIZE_OPTS CARES_SET_COMPILER_WARNING_OPTS +if test "$want_warnings" = "yes"; then + AX_APPEND_COMPILE_FLAGS([-Wall \ + -Wextra \ + -Wcast-align \ + -Wconversion \ + -Wdeclaration-after-statement \ + -Wdouble-promotion \ + -Wfloat-equal \ + -Wformat-security \ + -Winit-self \ + -Wjump-misses-init \ + -Wlogical-op \ + -Wmissing-braces \ + -Wmissing-declarations \ + -Wmissing-format-attribute \ + -Wmissing-include-dirs \ + -Wmissing-prototypes \ + -Wnested-externs \ + -Wno-coverage-mismatch \ + -Wold-style-definition \ + -Wpacked \ + -Wpointer-arith \ + -Wredundant-decls \ + -Wshadow \ + -Wsign-conversion \ + -Wstrict-overflow \ + -Wstrict-prototypes \ + -Wtrampolines \ + -Wundef \ + -Wunused \ + -Wvariadic-macros \ + -Wvla \ + -Wwrite-strings \ + -Werror=implicit-int \ + -Werror=implicit-function-declaration \ + -Werror=partial-availability \ + ], [CFLAGS], [-Werror]) +fi + if test "$compiler_id" = "INTEL_UNIX_C"; then # if test "$compiler_num" -ge "1000"; then @@ -237,7 +276,7 @@ case X-"$ac_cv_native_windows" in CURL_CHECK_HEADER_WINSOCK CURL_CHECK_HEADER_WINSOCK2 CURL_CHECK_HEADER_WS2TCPIP - CPPFLAGS="$CPPFLAGS -D_WIN32_WINNT=0x0600" + CPPFLAGS="$CPPFLAGS -D_WIN32_WINNT=0x0602" ;; *) ac_cv_header_winsock_h="no" @@ -437,6 +476,7 @@ AS_IF([test "x$host_vendor" = "xapple"], [ AC_COMPILE_IFELSE([ AC_LANG_PROGRAM([[ #include +#include #include ]], [[ #if TARGET_OS_IPHONE == 0 || __IPHONE_OS_VERSION_MIN_REQUIRED < 100000 @@ -458,6 +498,7 @@ AS_IF([test "x$host_vendor" = "xapple"], [ AC_COMPILE_IFELSE([ AC_LANG_PROGRAM([[ #include +#include #include ]], [[ #ifndef MAC_OS_X_VERSION_10_12 @@ -531,6 +572,8 @@ AC_CHECK_HEADERS( sys/param.h \ sys/uio.h \ assert.h \ + iphlpapi.h \ + netioapi.h \ netdb.h \ netinet/in.h \ netinet/tcp.h \ @@ -705,7 +748,7 @@ CARES_CHECK_FUNC_STRNCMPI CARES_CHECK_FUNC_STRNICMP CARES_CHECK_FUNC_WRITEV CARES_CHECK_FUNC_ARC4RANDOM_BUF - +CARES_CHECK_FUNC_STAT dnl check for AF_INET6 CARES_CHECK_CONSTANT( @@ -910,7 +953,7 @@ AC_C_BIGENDIAN( [AC_DEFINE(ARES_BIG_ENDIAN, 1, [define this if ares is built for a big endian system])], , - [AC_MSG_WARN([couldn't figure out endianess, assuming little endian!])] + [AC_MSG_WARN([couldn't figure out endianness, assuming little endian!])] ) dnl Check for user-specified random device @@ -929,6 +972,33 @@ fi CARES_CHECK_OPTION_NONBLOCKING CARES_CHECK_NONBLOCKING_SOCKET + +dnl ------------ THREADING -------------- +AC_ARG_ENABLE(cares-threads, + AC_HELP_STRING([--disable-cares-threads], [Disable building of thread safety support]), + [ CARES_THREADS=${enableval} ], + [ CARES_THREADS=yes ]) + +dnl windows always supports threads, only check non-windows systems. +if test "${CARES_THREADS}" = "yes" -a "x${ac_cv_native_windows}" != "xyes" ; then + AX_PTHREAD([ ], [ + AC_MSG_WARN([threads requested but not supported]) + CARES_THREADS=no + ]) + + if test "${CARES_THREADS}" = "yes" ; then + AC_CHECK_HEADERS([pthread.h pthread_np.h]) + LIBS="$PTHREAD_LIBS $LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + CC="$PTHREAD_CC" + CXX="$PTHREAD_CXX" + fi +fi + +if test "${CARES_THREADS}" = "yes" ; then + AC_DEFINE([CARES_THREADS], [ 1 ], [Threading enabled]) +fi + CARES_CONFIGURE_SYMBOL_HIDING CARES_PRIVATE_LIBS="$LIBS" diff --git a/deps/cares/docs/Makefile.in b/deps/cares/docs/Makefile.in index 710fa60584139f..a5d5a70c999543 100644 --- a/deps/cares/docs/Makefile.in +++ b/deps/cares/docs/Makefile.in @@ -96,11 +96,15 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ $(top_srcdir)/m4/ax_ac_print_to_file.m4 \ $(top_srcdir)/m4/ax_add_am_macro_static.m4 \ $(top_srcdir)/m4/ax_am_macros_static.m4 \ + $(top_srcdir)/m4/ax_append_compile_flags.m4 \ + $(top_srcdir)/m4/ax_append_flag.m4 \ + $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_check_gnu_make.m4 \ $(top_srcdir)/m4/ax_code_coverage.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ $(top_srcdir)/m4/ax_file_escapes.m4 \ + $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_require_defined.m4 \ $(top_srcdir)/m4/cares-compilers.m4 \ $(top_srcdir)/m4/cares-confopts.m4 \ @@ -262,6 +266,10 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_CXX = @PTHREAD_CXX@ +PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -281,6 +289,7 @@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ +ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ @@ -333,6 +342,67 @@ MANPAGES = ares_cancel.3 \ ares_create_query.3 \ ares_destroy.3 \ ares_destroy_options.3 \ + ares_dns_class_fromstr.3 \ + ares_dns_class_t.3 \ + ares_dns_class_tostr.3 \ + ares_dns_datatype_t.3 \ + ares_dns_flags_t.3 \ + ares_dns_mapping.3 \ + ares_dns_opcode_tostr.3 \ + ares_dns_opt_datatype_t.3 \ + ares_dns_opt_get_datatype.3 \ + ares_dns_opt_get_name.3 \ + ares_dns_opcode_t.3 \ + ares_dns_parse.3 \ + ares_dns_rcode_t.3 \ + ares_dns_rcode_tostr.3 \ + ares_dns_record.3 \ + ares_dns_record_create.3 \ + ares_dns_record_get_flags.3 \ + ares_dns_record_get_id.3 \ + ares_dns_record_get_opcode.3 \ + ares_dns_record_get_rcode.3 \ + ares_dns_record_destroy.3 \ + ares_dns_record_query_add.3 \ + ares_dns_record_query_cnt.3 \ + ares_dns_record_query_get.3 \ + ares_dns_record_rr_add.3 \ + ares_dns_record_rr_cnt.3 \ + ares_dns_record_rr_del.3 \ + ares_dns_record_rr_get.3 \ + ares_dns_rec_type_fromstr.3 \ + ares_dns_rec_type_t.3 \ + ares_dns_rr.3 \ + ares_dns_rr_get_addr.3 \ + ares_dns_rr_get_addr6.3 \ + ares_dns_rr_get_bin.3 \ + ares_dns_rr_get_class.3 \ + ares_dns_rr_get_keys.3 \ + ares_dns_rr_get_name.3 \ + ares_dns_rr_get_opt.3 \ + ares_dns_rr_get_opt_byid.3 \ + ares_dns_rr_get_opt_cnt.3 \ + ares_dns_rr_get_str.3 \ + ares_dns_rr_get_type.3 \ + ares_dns_rr_get_ttl.3 \ + ares_dns_rr_get_u16.3 \ + ares_dns_rr_get_u32.3 \ + ares_dns_rr_get_u8.3 \ + ares_dns_rr_key_datatype.3 \ + ares_dns_rr_key_t.3 \ + ares_dns_rr_key_to_rec_type.3 \ + ares_dns_rr_key_tostr.3 \ + ares_dns_rr_set_addr.3 \ + ares_dns_rr_set_addr6.3 \ + ares_dns_rr_set_bin.3 \ + ares_dns_rr_set_opt.3 \ + ares_dns_rr_set_str.3 \ + ares_dns_rr_set_u16.3 \ + ares_dns_rr_set_u32.3 \ + ares_dns_rr_set_u8.3 \ + ares_dns_section_t.3 \ + ares_dns_section_tostr.3 \ + ares_dns_write.3 \ ares_dup.3 \ ares_expand_name.3 \ ares_expand_string.3 \ @@ -358,6 +428,7 @@ MANPAGES = ares_cancel.3 \ ares_library_init_android.3 \ ares_library_initialized.3 \ ares_mkquery.3 \ + ares_opt_param_t.3 \ ares_parse_a_reply.3 \ ares_parse_aaaa_reply.3 \ ares_parse_caa_reply.3 \ @@ -371,6 +442,7 @@ MANPAGES = ares_cancel.3 \ ares_parse_uri_reply.3 \ ares_process.3 \ ares_query.3 \ + ares_reinit.3 \ ares_save_options.3 \ ares_search.3 \ ares_send.3 \ @@ -386,7 +458,12 @@ MANPAGES = ares_cancel.3 \ ares_set_socket_functions.3 \ ares_set_sortlist.3 \ ares_strerror.3 \ + ares_svcb_param_t.3 \ + ares_threadsafety.3 \ ares_timeout.3 \ + ares_tlsa_match_t.3 \ + ares_tlsa_selector_t.3 \ + ares_tlsa_usage_t.3 \ ares_version.3 man_MANS = $(MANPAGES) diff --git a/deps/cares/docs/Makefile.inc b/deps/cares/docs/Makefile.inc index f042c06688ab38..e81e0ca14f34bb 100644 --- a/deps/cares/docs/Makefile.inc +++ b/deps/cares/docs/Makefile.inc @@ -4,6 +4,67 @@ MANPAGES = ares_cancel.3 \ ares_create_query.3 \ ares_destroy.3 \ ares_destroy_options.3 \ + ares_dns_class_fromstr.3 \ + ares_dns_class_t.3 \ + ares_dns_class_tostr.3 \ + ares_dns_datatype_t.3 \ + ares_dns_flags_t.3 \ + ares_dns_mapping.3 \ + ares_dns_opcode_tostr.3 \ + ares_dns_opt_datatype_t.3 \ + ares_dns_opt_get_datatype.3 \ + ares_dns_opt_get_name.3 \ + ares_dns_opcode_t.3 \ + ares_dns_parse.3 \ + ares_dns_rcode_t.3 \ + ares_dns_rcode_tostr.3 \ + ares_dns_record.3 \ + ares_dns_record_create.3 \ + ares_dns_record_get_flags.3 \ + ares_dns_record_get_id.3 \ + ares_dns_record_get_opcode.3 \ + ares_dns_record_get_rcode.3 \ + ares_dns_record_destroy.3 \ + ares_dns_record_query_add.3 \ + ares_dns_record_query_cnt.3 \ + ares_dns_record_query_get.3 \ + ares_dns_record_rr_add.3 \ + ares_dns_record_rr_cnt.3 \ + ares_dns_record_rr_del.3 \ + ares_dns_record_rr_get.3 \ + ares_dns_rec_type_fromstr.3 \ + ares_dns_rec_type_t.3 \ + ares_dns_rr.3 \ + ares_dns_rr_get_addr.3 \ + ares_dns_rr_get_addr6.3 \ + ares_dns_rr_get_bin.3 \ + ares_dns_rr_get_class.3 \ + ares_dns_rr_get_keys.3 \ + ares_dns_rr_get_name.3 \ + ares_dns_rr_get_opt.3 \ + ares_dns_rr_get_opt_byid.3 \ + ares_dns_rr_get_opt_cnt.3 \ + ares_dns_rr_get_str.3 \ + ares_dns_rr_get_type.3 \ + ares_dns_rr_get_ttl.3 \ + ares_dns_rr_get_u16.3 \ + ares_dns_rr_get_u32.3 \ + ares_dns_rr_get_u8.3 \ + ares_dns_rr_key_datatype.3 \ + ares_dns_rr_key_t.3 \ + ares_dns_rr_key_to_rec_type.3 \ + ares_dns_rr_key_tostr.3 \ + ares_dns_rr_set_addr.3 \ + ares_dns_rr_set_addr6.3 \ + ares_dns_rr_set_bin.3 \ + ares_dns_rr_set_opt.3 \ + ares_dns_rr_set_str.3 \ + ares_dns_rr_set_u16.3 \ + ares_dns_rr_set_u32.3 \ + ares_dns_rr_set_u8.3 \ + ares_dns_section_t.3 \ + ares_dns_section_tostr.3 \ + ares_dns_write.3 \ ares_dup.3 \ ares_expand_name.3 \ ares_expand_string.3 \ @@ -29,6 +90,7 @@ MANPAGES = ares_cancel.3 \ ares_library_init_android.3 \ ares_library_initialized.3 \ ares_mkquery.3 \ + ares_opt_param_t.3 \ ares_parse_a_reply.3 \ ares_parse_aaaa_reply.3 \ ares_parse_caa_reply.3 \ @@ -42,6 +104,7 @@ MANPAGES = ares_cancel.3 \ ares_parse_uri_reply.3 \ ares_process.3 \ ares_query.3 \ + ares_reinit.3 \ ares_save_options.3 \ ares_search.3 \ ares_send.3 \ @@ -57,5 +120,10 @@ MANPAGES = ares_cancel.3 \ ares_set_socket_functions.3 \ ares_set_sortlist.3 \ ares_strerror.3 \ + ares_svcb_param_t.3 \ + ares_threadsafety.3 \ ares_timeout.3 \ + ares_tlsa_match_t.3 \ + ares_tlsa_selector_t.3 \ + ares_tlsa_usage_t.3 \ ares_version.3 diff --git a/deps/cares/docs/adig.1 b/deps/cares/docs/adig.1 index 6760bbef7db91e..f747d15b67b652 100644 --- a/deps/cares/docs/adig.1 +++ b/deps/cares/docs/adig.1 @@ -44,12 +44,13 @@ Print some extra debugging output. \fB\-f\fR flag Add a behavior control flag. Possible values for flag are - igntc - ignore to query in TCP to get truncated UDP answer, + igntc - ignore query truncation, return answer as-is instead of retrying + via tcp. noaliases - don't honor the HOSTALIASES environment variable, norecurse - don't query upstream servers recursively, - primary - use the first server, - stayopen - don't close the communication sockets, and - usevc - always use TCP. + primary - use the first server, + stayopen - don't close the communication sockets, and + usevc - always use TCP. .TP \fB\-h\fR, \fB\-?\fR Display this help and exit. @@ -61,27 +62,14 @@ Servers are tried in round-robin, if the previous one failed. \fB\-t\fR type Query records of specified type. Possible values for type are -A (default), AAAA, AFSDB, ANY, AXFR, CNAME, GPOS, HINFO, ISDN, KEY, LOC, MAILA, -MAILB, MB, MD, MF, MG, MINFO, MR, MX, NAPTR, NS, NSAP, NSAP_PTR, NULL, -PTR, PX, RP, RT, SIG, SOA, SRV, TXT, URI, WKS and X25. +A (default), AAAA, ANY, AXFR, CNAME, HINFO, MX, NAPTR, NS, PTR, SOA, SRV, TXT, +URI, CAA, SVCB, and HTTPS. .TP \fB\-T\fR port Connect to the specified TCP port of DNS server. .TP \fB\-U\fR port Connect to the specified UDP port of DNS server. -.TP -\fB\-x\fR -For an IPv4 \fB-t PTR a.b.c.d\fR lookup, query for -.br -\fBd.c.b.a.in-addr.arpa.\fR -This more often gives correct names in the \fBANSWER\fR. -.br -For an IPv6 \fB-t PTR addr\fR lookup, query for \fBa.b.c....z.IP6.ARPA.\fR -.TP -\fB\-xx\fR -As for \fB-x\fR and an IPv6 address, compact \fBa.b.c....z.IP6.ARPA.\fR into a RFC-2673 bit-string. -This compacted \fBbit-string\fR form is not supported by many DNS-servers. .SH "REPORTING BUGS" Report bugs to the c-ares mailing list: @@ -91,7 +79,7 @@ Report bugs to the c-ares mailing list: .PP acountry(1), ahost(1). .SH COPYRIGHT -This utility is based on code/ideas contained in sofware written by Greg Hudson (ares) +This utility is based on code/ideas contained in software written by Greg Hudson (ares) carrying the following notice: .br Copyright 1998 by the Massachusetts Institute of Technology. diff --git a/deps/cares/docs/ahost.1 b/deps/cares/docs/ahost.1 index 30b968deeb528c..3cad8b77813a2e 100644 --- a/deps/cares/docs/ahost.1 +++ b/deps/cares/docs/ahost.1 @@ -59,7 +59,7 @@ Report bugs to the c-ares mailing list: .PP acountry(1), adig(1). .SH COPYRIGHT -This utility is based on code/ideas contained in sofware written by Greg Hudson (ares) +This utility is based on code/ideas contained in software written by Greg Hudson (ares) carrying the following notice: .br Copyright 1998 by the Massachusetts Institute of Technology. diff --git a/deps/cares/docs/ares_cancel.3 b/deps/cares/docs/ares_cancel.3 index 49f025d74cc954..0e11b6cae61d90 100644 --- a/deps/cares/docs/ares_cancel.3 +++ b/deps/cares/docs/ares_cancel.3 @@ -22,7 +22,7 @@ ares_cancel \- Cancel a resolve .nf #include -void ares_cancel(ares_channel \fIchannel\fP) +void ares_cancel(ares_channel_t *\fIchannel\fP) .fi .SH DESCRIPTION The \fBares_cancel(3)\fP function cancels all lookups/requests made on the the diff --git a/deps/cares/docs/ares_create_query.3 b/deps/cares/docs/ares_create_query.3 index 28d12603a1f732..1f5532e891dbfb 100644 --- a/deps/cares/docs/ares_create_query.3 +++ b/deps/cares/docs/ares_create_query.3 @@ -79,6 +79,7 @@ Memory was exhausted. .SH AVAILABILITY Added in c-ares 1.10.0 .SH SEE ALSO +.BR ares_dns_record (3), .BR ares_expand_name (3), .BR ares_free_string (3), .BR ares_mkquery (3) diff --git a/deps/cares/docs/ares_destroy.3 b/deps/cares/docs/ares_destroy.3 index a65a522c276972..a7924890367c38 100644 --- a/deps/cares/docs/ares_destroy.3 +++ b/deps/cares/docs/ares_destroy.3 @@ -22,7 +22,7 @@ ares_destroy \- Destroy a resolver channel .nf #include -void ares_destroy(ares_channel \fIchannel\fP) +void ares_destroy(ares_channel_t *\fIchannel\fP) .fi .SH DESCRIPTION The \fBares_destroy(3)\fP function destroys the name service channel @@ -33,9 +33,13 @@ by the channel. channel, passing a status of \fIARES_EDESTRUCTION\fP. These calls give the callbacks a chance to clean up any state which might have been stored in their arguments. A callback must not add new requests to a channel being destroyed. + +There is no ability to make this function thread-safe. No additional calls +using this channel may be made once this function is called. .SH SEE ALSO .BR ares_init (3), -.BR ares_cancel (3) +.BR ares_cancel (3), +.BR ares_threadsafety (3) .SH AUTHOR Greg Hudson, MIT Information Systems .br diff --git a/deps/cares/docs/ares_dns_class_fromstr.3 b/deps/cares/docs/ares_dns_class_fromstr.3 new file mode 100644 index 00000000000000..4587b9a586ef8e --- /dev/null +++ b/deps/cares/docs/ares_dns_class_fromstr.3 @@ -0,0 +1,4 @@ +.\" +.\" Copyright (C) Daniel Stenberg +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_mapping.3 diff --git a/deps/cares/docs/ares_dns_class_t.3 b/deps/cares/docs/ares_dns_class_t.3 new file mode 100644 index 00000000000000..4acc581d29789c --- /dev/null +++ b/deps/cares/docs/ares_dns_class_t.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_record.3 diff --git a/deps/cares/docs/ares_dns_class_tostr.3 b/deps/cares/docs/ares_dns_class_tostr.3 new file mode 100644 index 00000000000000..4587b9a586ef8e --- /dev/null +++ b/deps/cares/docs/ares_dns_class_tostr.3 @@ -0,0 +1,4 @@ +.\" +.\" Copyright (C) Daniel Stenberg +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_mapping.3 diff --git a/deps/cares/docs/ares_dns_datatype_t.3 b/deps/cares/docs/ares_dns_datatype_t.3 new file mode 100644 index 00000000000000..4587b9a586ef8e --- /dev/null +++ b/deps/cares/docs/ares_dns_datatype_t.3 @@ -0,0 +1,4 @@ +.\" +.\" Copyright (C) Daniel Stenberg +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_mapping.3 diff --git a/deps/cares/docs/ares_dns_flags_t.3 b/deps/cares/docs/ares_dns_flags_t.3 new file mode 100644 index 00000000000000..4acc581d29789c --- /dev/null +++ b/deps/cares/docs/ares_dns_flags_t.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_record.3 diff --git a/deps/cares/docs/ares_dns_mapping.3 b/deps/cares/docs/ares_dns_mapping.3 new file mode 100644 index 00000000000000..6c2c905a5c5185 --- /dev/null +++ b/deps/cares/docs/ares_dns_mapping.3 @@ -0,0 +1,302 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.\" +.TH ARES_DNS_MAPPINGS 3 "12 November 2023" +.SH NAME +ares_dns_class_fromstr, ares_dns_class_tostr, ares_dns_datatype_t, ares_dns_opcode_tostr, +ares_dns_opt_datatype_t, ares_dns_opt_get_datatype, ares_dns_opt_get_name, +ares_dns_rcode_tostr, ares_dns_rec_type_fromstr, ares_dns_rr_get_keys, +ares_dns_rr_key_datatype, ares_dns_rr_key_to_rec_type, ares_dns_rr_key_tostr, +ares_dns_section_tostr, ares_opt_param_t, ares_svcb_param_t \- +Helper functions for converting dns record identifiers to and from their +respective types, as well identifying datatypes for various records. +.SH SYNOPSIS +.nf +#include + +const char *ares_dns_rec_type_tostr(ares_dns_rec_type_t type); + +const char *ares_dns_class_tostr(ares_dns_class_t qclass); + +const char *ares_dns_opcode_tostr(ares_dns_opcode_t opcode); + +const char *ares_dns_rr_key_tostr(ares_dns_rr_key_t key); + +const char *ares_dns_section_tostr(ares_dns_section_t section); + +const char *ares_dns_rcode_tostr(ares_dns_rcode_t rcode); + +ares_bool_t ares_dns_class_fromstr(ares_dns_class_t *qclass, const char *str); + +ares_bool_t ares_dns_rec_type_fromstr(ares_dns_rec_type_t *qtype, + const char *str); + +const ares_dns_rr_key_t *ares_dns_rr_get_keys(ares_dns_rec_type_t type, + size_t *cnt); + +ares_dns_datatype_t ares_dns_rr_key_datatype(ares_dns_rr_key_t key); + +ares_dns_rec_type_t ares_dns_rr_key_to_rec_type(ares_dns_rr_key_t key); + +ares_dns_opt_datatype_t ares_dns_opt_get_datatype(ares_dns_rr_key_t key, + unsigned short opt); + +const char *ares_dns_opt_get_name(ares_dns_rr_key_t key, unsigned short opt); + +.fi +.SH ENUMERATIONS +.B ares_dns_datatype_t - +Data types associated with \fIares_dns_rr_key_t\fP: +.RS 4 +.B ARES_DATATYPE_INADDR +- IPv4 address as \fIstruct in_addr *\fP. Use \fIares_dns_rr_set_addr(3)\fP to +set and \fIares_dns_rr_get_addr(3)\fP to get. +.br +.B ARES_DATATYPE_INADDR6 +- IPv6 address as \fIstruct ares_in6_addr *\fP. Use \fIares_dns_rr_set_addr6(3)\fP to +set and \fIares_dns_rr_get_addr6(3)\fP to get. +.br +.B ARES_DATATYPE_U8 +- 8bit unsigned integer. Use \fIares_dns_rr_set_u8(3)\fP to +set and \fIares_dns_rr_get_u8(3)\fP to get. +.br +.B ARES_DATATYPE_U16 +- 16bit unsigned integer. Use \fIares_dns_rr_set_u16(3)\fP to +set and \fIares_dns_rr_get_u16(3)\fP to get. +.br +.B ARES_DATATYPE_U32 +- 32bit unsigned integer. Use \fIares_dns_rr_set_u32(3)\fP to +set and \fIares_dns_rr_get_u32(3)\fP to get. +.br +.B ARES_DATATYPE_NAME +- Null-terminated string of a domain name (series of labels). Use \fIares_dns_rr_set_str(3)\fP to +set and \fIares_dns_rr_get_str(3)\fP to get. +.br +.B ARES_DATATYPE_STR +- Null-terminated string. Use \fIares_dns_rr_set_str(3)\fP to +set and \fIares_dns_rr_get_str(3)\fP to get. +.br +.B ARES_DATATYPE_BIN +- Binary Data. Use \fIares_dns_rr_set_bin(3)\fP to +set and \fIares_dns_rr_get_bin(3)\fP to get. +.br +.B ARES_DATATYPE_BINP +- Officially defined as binary data, but likely printable. Guaranteed to have +a NULL terminator for convenience (not included in length). Use \fIares_dns_rr_set_bin(3)\fP to +set and \fIares_dns_rr_get_bin(3)\fP to get. +.br +.B ARES_DATATYPE_OPT +- Array of options. 16bit identifier, Binary data. Use \fIares_dns_rr_set_opt(3)\fP to +set and \fIares_dns_rr_get_opt(3)\fP to get. +.br +.RE + +.B ares_dns_opt_datatype_t - +Data types associated with \fIARES_DATATYPE_OPT\fP parameters if known as returned +by \fIares_dns_opt_get_datatype(3)\fP: +.RS 4 +.B ARES_OPT_DATATYPE_NONE +- No value allowed for this parameter +.br +.B ARES_OPT_DATATYPE_STR_LIST +- List of strings, each prefixed with a single octet representing the length as +defined by RFC 1035. Can use \fIares_expand_string(3)\fP until buffer is consumed. +.br +.B ARES_OPT_DATATYPE_U8_LIST +- List of 8bit unsigned integers, concatenated +.br +.B ARES_OPT_DATATYPE_U16 +- 16bit unsigned integer in network byte order +.br +.B ARES_OPT_DATATYPE_U16_LIST +- list of 16bit unsigned integers in network byte order, concatenated. +.br +.B ARES_OPT_DATATYPE_U32 +- 32bit unsigned integer in network byte order +.br +.B ARES_OPT_DATATYPE_U32_LIST +- list of 16bit unsigned integers in network byte order, concatenated. +.br +.B ARES_OPT_DATATYPE_INADDR4_LIST +- List of ipv4 addresses in network byte order, concatenated +.br +.B ARES_OPT_DATATYPE_INADDR6_LIST +- List of ipv6 addresses in network byte order, concatenated +.br +.B ARES_OPT_DATATYPE_BIN +- Binary Data +.br +.B ARES_OPT_DATATYPE_NAME +- DNS Domain Name binary format as defined in RFC1035, can use \fIares_expand_name(3)\fP +.br +.RE + +.B ares_svcb_param_t - +SVCB (and HTTPS) RR known parameters as returned by \fIares_dns_opt_get_datatype(3)\fP +with \fIARES_RR_SVCB_PARAMS\fP or \fIARES_RR_HTTPS_PARAMS\fP: +.RS 4 +.B ARES_SVCB_PARAM_MANDATORY +- Mandatory keys in this RR (RFC 9460 Section 8). Datatype: \fIARES_OPT_DATATYPE_U16_LIST\fP +.br +.B ARES_SVCB_PARAM_ALPN +- Additional supported protocols (RFC 9460 Section 7.1). Datatype: \fIARES_OPT_DATATYPE_STR_LIST\fP +.br +.B ARES_SVCB_PARAM_NO_DEFAULT_ALPN +- No support for default protocol (RFC 9460 Section 7.1). Datatype: \fIARES_OPT_DATATYPE_NONE\fP +.br +.B ARES_SVCB_PARAM_PORT +- Port for alternative endpoint (RFC 9460 Section 7.2). Datatype: \fIARES_OPT_DATATYPE_U16\fP +.br +.B ARES_SVCB_PARAM_IPV4HINT +- IPv4 address hints (RFC 9460 Section 7.3). Datatype: \fIARES_OPT_DATATYPE_INADDR4_LIST\fP +.br +.B ARES_SVCB_PARAM_ECH +- RESERVED (held for Encrypted ClientHello) +.br +.B ARES_SVCB_PARAM_IPV6HINT +- IPv6 address hints (RFC 9460 Section 7.3). Datatype: \fIARES_OPT_DATATYPE_INADDR6_LIST\fP +.br + +.RE + +.B ares_opt_param_t - +OPT RR known parameters as returned by \fIares_dns_opt_get_datatype(3)\fP +with \fIARES_RR_OPT_OPTIONS\fB: +.RS 4 +.B ARES_OPT_PARAM_LLQ +- RFC 8764. Apple's DNS Long-Lived Queries Protocol. Datatype: \fIARES_OPT_DATATYPE_BIN\fP +.br +.B ARES_OPT_PARAM_UL +- http://files.dns-sd.org/draft-sekar-dns-ul.txt: Update Lease. Datatype: \fIARES_OPT_DATATYPE_U32\fP +.br +.B ARES_OPT_PARAM_NSID +- RFC 5001. Name Server Identification. Datatype: \fIARES_OPT_DATATYPE_BIN\fP +.br +.B ARES_OPT_PARAM_DAU +- RFC 6975. DNSSEC Algorithm Understood. Datatype: \fIARES_OPT_DATATYPE_U8_LIST\fP +.br +.B ARES_OPT_PARAM_DHU +- RFC 6975. DS Hash Understood. Datatype: \fIARES_OPT_DATATYPE_U8_LIST\fP +.br +.B ARES_OPT_PARAM_N3U +- RFC 6975. NSEC3 Hash Understood. Datatype: \fIARES_OPT_DATATYPE_U8_LIST\fP +.br +.B ARES_OPT_PARAM_EDNS_CLIENT_SUBNET +- RFC 7871. Client Subnet. Datatype: \fIARES_OPT_DATATYPE_BIN\fP +.br +.B ARES_OPT_PARAM_EDNS_EXPIRE +- RFC 7314. Expire Timer. Datatype: \fIARES_OPT_DATATYPE_U32\fP +.br +.B ARES_OPT_PARAM_COOKIE +- RFC 7873. Client and Server Cookies. Datatype: \fIARES_OPT_DATATYPE_BIN\fP +.br +.B ARES_OPT_PARAM_EDNS_TCP_KEEPALIVE +- RFC 7828. TCP Keepalive timeout. Datatype: \fIARES_OPT_DATATYPE_U16\fP +.br +.B ARES_OPT_PARAM_PADDING +- RFC 7830. Padding. Datatype: \fIARES_OPT_DATATYPE_BIN\fP +.br +.B ARES_OPT_PARAM_CHAIN +- RFC 7901. Chain query requests. Datatype: \fIARES_OPT_DATATYPE_NAME\fP +.br +.B ARES_OPT_PARAM_EDNS_KEY_TAG +- RFC 8145. Signaling Trust Anchor Knowledge in DNSSEC. Datatype: \fIARES_OPT_DATATYPE_U16_LIST\fP +.br +.B ARES_OPT_PARAM_EXTENDED_DNS_ERROR +- RFC 8914. Extended ERROR code and message. Datatype: \fIARES_OPT_DATATYPE_BIN\fP +.br +.RE + +.SH DESCRIPTION +The \fIares_dns_rec_type_tostr(3)\fP function outputs a human readable DNS record +type from its numeric form passed in +.IR type . + +The \fIares_dns_class_tostr(3)\fP function outputs a human readable DNS class +from its numeric form passed in +.IR qclass . + +The \fIares_dns_opcode_tostr(3)\fP function outputs a human readable DNS opcode +from its numeric form in +.IR opcode . + +The \fIares_dns_rr_key_tostr(3)\fP function outputs a human readable DNS Resource +Record parameter name from its numeric form in +.IR key . + +The \fIares_dns_section_tostr(3)\fP function outputs a human readable DNS +message section from its numeric form in +.IR section . + +The \fIares_dns_rcode_tostr(3)\fP function outputs a human readable DNS +response code from its numeric form in +.IR rcode . + +The \fIares_dns_class_fromstr(3)\fP function outputs the DNS class in numeric +from from its string representation in +.IR str . +The result is stored into the variable pointed to by +.IR qclass . + +The \fIares_dns_rec_type_fromstr(3)\fP function outputs the DNS record type in +numeric from from its string representation in +.IR str . +The result is stored into the variable pointed to by +.IR qtype . + +The \fIares_dns_rr_get_keys(3)\fP function retrieves a list of parameters that +may be set or retrieved for the provided +.IR type . +The count of returned keys is stored into the variable pointed to by +.IR cnt . + +The \fIares_dns_rr_key_datatype(3)\fP function retrieves the associated datatype +for an RR parameter specified by +.IR key . + +The \fIares_dns_rr_key_to_rec_type(3)\fP function dereferences the provided RR +parameter specified by +.IR key +to the DNS Record Type it belongs. + +The \fIares_dns_opt_get_datatype(3)\fP function is used in association with +\fIares_dns_rr_set_opt(3)\fP and \fIares_dns_rr_get_opt(3)\fP to retrieve the +datatype of an option record contained within an RR as specified in +.IR key +if it is known. The raw option record identifier is provided by +.IR opt . + +The \fIares_dns_opt_get_name(3)\fP function is used in association with +\fIares_dns_rr_set_opt(3)\fP and \fIares_dns_rr_get_opt(3)\fP to retrieve human +readable parameter name of an option record contained within an RR as specified +in +.IR key +if it is known. The raw option record identifier is provided by +.IR opt . + +.SH RETURN VALUES +\fIares_dns_rec_type_tostr(3)\fP, \fIares_dns_class_tostr(3)\fP, +\fIares_dns_opcode_tostr(3)\fP, \fIares_dns_rr_key_tostr(3)\fP, +\fIares_dns_section_tostr(3)\fP, \fIares_dns_rcode_tostr(3)\fP, and +\fIares_dns_opt_get_name(3)\fP all return a human printable ASCII string, or +NULL on error. + +\fIares_dns_class_fromstr(3)\fP and \fIares_dns_rec_type_fromstr(3)\fP return +.B ARES_TRUE +on successful conversion, otherwise +.B ARES_FALSE. + +\fIares_dns_rr_get_keys(3)\fP returns an array of keys or NULL on failure. + +\fIares_dns_rr_key_datatype(3)\fP, \fIares_dns_rr_key_to_rec_type(3)\fP, and +\fIares_dns_opt_get_datatype(3)\fP return their respective integer values, or +0 on failure. + +.SH AVAILABILITY +These functions were first introduced in c-ares version 1.22.0. +.SH SEE ALSO +.BR ares_dns_record (3), +.BR ares_dns_rr (3), +.BR ares_init (3) +.SH AUTHOR +Copyright (C) 2023 The c-ares project and its members. diff --git a/deps/cares/docs/ares_dns_opcode_t.3 b/deps/cares/docs/ares_dns_opcode_t.3 new file mode 100644 index 00000000000000..4acc581d29789c --- /dev/null +++ b/deps/cares/docs/ares_dns_opcode_t.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_record.3 diff --git a/deps/cares/docs/ares_dns_opcode_tostr.3 b/deps/cares/docs/ares_dns_opcode_tostr.3 new file mode 100644 index 00000000000000..4587b9a586ef8e --- /dev/null +++ b/deps/cares/docs/ares_dns_opcode_tostr.3 @@ -0,0 +1,4 @@ +.\" +.\" Copyright (C) Daniel Stenberg +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_mapping.3 diff --git a/deps/cares/docs/ares_dns_opt_datatype_t.3 b/deps/cares/docs/ares_dns_opt_datatype_t.3 new file mode 100644 index 00000000000000..4587b9a586ef8e --- /dev/null +++ b/deps/cares/docs/ares_dns_opt_datatype_t.3 @@ -0,0 +1,4 @@ +.\" +.\" Copyright (C) Daniel Stenberg +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_mapping.3 diff --git a/deps/cares/docs/ares_dns_opt_get_datatype.3 b/deps/cares/docs/ares_dns_opt_get_datatype.3 new file mode 100644 index 00000000000000..4587b9a586ef8e --- /dev/null +++ b/deps/cares/docs/ares_dns_opt_get_datatype.3 @@ -0,0 +1,4 @@ +.\" +.\" Copyright (C) Daniel Stenberg +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_mapping.3 diff --git a/deps/cares/docs/ares_dns_opt_get_name.3 b/deps/cares/docs/ares_dns_opt_get_name.3 new file mode 100644 index 00000000000000..4587b9a586ef8e --- /dev/null +++ b/deps/cares/docs/ares_dns_opt_get_name.3 @@ -0,0 +1,4 @@ +.\" +.\" Copyright (C) Daniel Stenberg +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_mapping.3 diff --git a/deps/cares/docs/ares_dns_parse.3 b/deps/cares/docs/ares_dns_parse.3 new file mode 100644 index 00000000000000..4acc581d29789c --- /dev/null +++ b/deps/cares/docs/ares_dns_parse.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_record.3 diff --git a/deps/cares/docs/ares_dns_rcode_t.3 b/deps/cares/docs/ares_dns_rcode_t.3 new file mode 100644 index 00000000000000..4acc581d29789c --- /dev/null +++ b/deps/cares/docs/ares_dns_rcode_t.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_record.3 diff --git a/deps/cares/docs/ares_dns_rcode_tostr.3 b/deps/cares/docs/ares_dns_rcode_tostr.3 new file mode 100644 index 00000000000000..4587b9a586ef8e --- /dev/null +++ b/deps/cares/docs/ares_dns_rcode_tostr.3 @@ -0,0 +1,4 @@ +.\" +.\" Copyright (C) Daniel Stenberg +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_mapping.3 diff --git a/deps/cares/docs/ares_dns_rec_type_fromstr.3 b/deps/cares/docs/ares_dns_rec_type_fromstr.3 new file mode 100644 index 00000000000000..4587b9a586ef8e --- /dev/null +++ b/deps/cares/docs/ares_dns_rec_type_fromstr.3 @@ -0,0 +1,4 @@ +.\" +.\" Copyright (C) Daniel Stenberg +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_mapping.3 diff --git a/deps/cares/docs/ares_dns_rec_type_t.3 b/deps/cares/docs/ares_dns_rec_type_t.3 new file mode 100644 index 00000000000000..4acc581d29789c --- /dev/null +++ b/deps/cares/docs/ares_dns_rec_type_t.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_record.3 diff --git a/deps/cares/docs/ares_dns_record.3 b/deps/cares/docs/ares_dns_record.3 new file mode 100644 index 00000000000000..39232417d09b86 --- /dev/null +++ b/deps/cares/docs/ares_dns_record.3 @@ -0,0 +1,380 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.\" +.TH ARES_DNS_RECORD 3 "12 November 2023" +.SH NAME +ares_dns_class_t, ares_dns_flags_t, ares_dns_opcode_t, ares_dns_parse, +ares_dns_rcode_t, ares_dns_record_create, ares_dns_record_destroy, +ares_dns_record_get_flags, ares_dns_record_get_id, ares_dns_record_get_opcode, +ares_dns_record_get_rcode, ares_dns_record_query_add, ares_dns_record_query_cnt, +ares_dns_record_query_get, ares_dns_rec_type_t, ares_dns_write \- +DNS Record parsing, writing, creating and destroying functions. +.SH SYNOPSIS +.nf +#include + +void ares_dns_record_destroy(ares_dns_record_t *dnsrec); + +ares_status_t ares_dns_parse(const unsigned char *buf, + size_t buf_len, unsigned int flags, + ares_dns_record_t **dnsrec); + +ares_status_t ares_dns_write(ares_dns_record_t *dnsrec, + unsigned char **buf, size_t *buf_len); + +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); + +unsigned short ares_dns_record_get_id(const ares_dns_record_t *dnsrec); + +unsigned short ares_dns_record_get_flags(const ares_dns_record_t *dnsrec); + +ares_dns_opcode_t ares_dns_record_get_opcode(const ares_dns_record_t *dnsrec); + +ares_dns_rcode_t ares_dns_record_get_rcode(const ares_dns_record_t *dnsrec); + +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); + +size_t ares_dns_record_query_cnt(const ares_dns_record_t *dnsrec); + +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); + +.fi +.SH ENUMERATIONS + +.B ares_dns_rec_type_t - +DNS Record types handled by c-ares. Some record types may only be valid +on requests, and some may only be valid on responses: +.RS 4 +.B ARES_REC_TYPE_A +- Host address +.br +.B ARES_REC_TYPE_NS +- Authoritative server +.br +.B ARES_REC_TYPE_CNAME +- Canonical name +.br +.B ARES_REC_TYPE_SOA +- Start of authority zone +.br +.B ARES_REC_TYPE_PTR +- Domain name pointer +.br +.B ARES_REC_TYPE_HINFO +- Host information +.br +.B ARES_REC_TYPE_MX +- Mail routing information +.br +.B ARES_REC_TYPE_TXT +- Text strings +.br +.B ARES_REC_TYPE_AAAA +- RFC 3596. Ip6 Address +.br +.B ARES_REC_TYPE_SRV +- RFC 2782. Server Selection +.br +.B ARES_REC_TYPE_NAPTR +- RFC 3403. Naming Authority Pointer +.br +.B ARES_REC_TYPE_OPT +- RFC 6891. EDNS0 option (meta-RR). Pseudo Record. +.br +.B ARES_REC_TYPE_TLSA +- RFC 6698. DNS-Based Authentication of Named Entities (DANE) Transport Layer Security (TLS) Protocol: TLSA +.br +.B ARES_REC_TYPE_SVCB +- RFC 9460. General Purpose Service Binding +.br +.B ARES_REC_TYPE_HTTPS - +- RFC 9460. Service Binding type for use with HTTPS +.br +.B ARES_REC_TYPE_ANY +- Wildcard match. Not response RR +.br +.B ARES_REC_TYPE_URI +- RFC 7553. Uniform Resource Identifier +.br +.B ARES_REC_TYPE_CAA +- RFC 6844. Certification Authority Authorization +.br +.B ARES_REC_TYPE_RAW_RR +- Used as an indicator that the RR record is not parsed, but provided in wire +format +.br +.RE + +.B ares_dns_class_t - +DNS Classes for requests and responses: +.RS 4 +.B ARES_CLASS_IN +- Internet +.br +.B ARES_CLASS_CHAOS +- CHAOS +.br +.B ARES_CLASS_HESOID +- Hesoid [Dyer 87] +.br +.B ARES_CLASS_NONE +- RFC 2136 +.br +.B ARES_CLASS_ANY +- Any class (requests only) +.br +.RE + +.B ares_dns_opcode_t - +DNS Header Opcodes: +.RS 4 +.B ARES_OPCODE_QUERY +- Standard query +.br +.B ARES_OPCODE_IQUERY +- Inverse query. Obsolete +.br +.B ARES_OPCODE_STATUS +- Name server status query +.br +.B ARES_OPCODE_NOTIFY +- Zone change notification (RFC 1996) +.br +.B ARES_OPCODE_UPDATE +- Zone update message (RFC2136) +.br +.RE + +.B ares_dns_flags_t - +DNS Header Flags: +.RS 4 +.B ARES_FLAG_QR +- QR. If set, is a response +.br +.B ARES_FLAG_AA +- Authoritative Answer. If set, is authoritative +.br +.B ARES_FLAG_TC +- Truncation. If set, is truncated response +.br +.B ARES_FLAG_RD +- Recursion Desired. If set, recursion is desired +.br +.B ARES_FLAG_RA +- Recursion Available. If set, server supports recursion +.br +.B ARES_FLAG_AD +- RFC 2065. Authentic Data bit indicates in a response that the data included +has been verified by the server providing it +.br +.B ARES_FLAG_CD +- RFC 2065. Checking Disabled bit indicates in a query that non-verified data +is acceptable to the resolver sending the query +.br +.RE + +.B ares_dns_rcode_t - +DNS Response codes from server: +.RS 4 +.B ARES_RCODE_NOERROR +- Success +.br +.B ARES_RCODE_FORMERR +- Format error. The name server was unable to interpret the query +.br +.B ARES_RCODE_SERVFAIL +- Server Failure. The name server was unable to process this query due to a +problem with the nameserver +.br +.B ARES_RCODE_NXDOMAIN +- Name Error. Meaningful only for responses from an authoritative name server, +this code signifies that the domain name referenced in the query does not exist. +.br +.B ARES_RCODE_NOTIMP +- Not implemented. The name server does not support the requested kind of query +.br +.B ARES_RCODE_REFUSED +- Refused. The name server refuses to perform the specified operation for policy +reasons. +.br +.B ARES_RCODE_YXDOMAIN +- RFC 2136. Some name that ought not to exist, does exist +.br +.B ARES_RCODE_YXRRSET +- RFC 2136. Some RRset that ought to not exist, does exist +.br +.B ARES_RCODE_NXRRSET +- RFC 2136. Some RRset that ought to exist, does not exist +.br +.B ARES_RCODE_NOTAUTH +- RFC 2136. The server is not authoritative for the zone named in the Zone section. +.br +.B ARES_RCODE_NOTZONE +- RFC 2136. A name used in the Prerequisite or Update Section is not within the +zone denoted by the Zone Section. +.br +.B ARES_RCODE_DSOTYPEI +- RFC 8409. DSO-TYPE Not implemented +.br +.B ARES_RCODE_BADSIG +- RFC 8945. TSIG Signature Failure +.br +.B ARES_RCODE_BADKEY +- RFC 8945. Key not recognized +.br +.B ARES_RCODE_BADTIME +- RFC 8945. Signature out of time window +.br +.B ARES_RCODE_BADMODE +- RFC 2930. Bad TKEY Mode +.br +.B ARES_RCODE_BADNAME +- RFC 2930. Duplicate Key Name +.br +.B ARES_RCODE_BADALG +- RFC 2930. Algorithm not supported +.br +.B ARES_RCODE_BADTRUNC +- RFC 8945. Bad Truncation +.br +.B ARES_RCODE_BADCOOKIE +- RFC 7973. Bad/missing Server Cookie +.br +.RE + + +.SH DESCRIPTION + +The \fIares_dns_record_destroy(3)\fP function destroys the memory associated +with the dns record created by either \fIares_dns_record_create(3)\fP or +\fIares_dns_parse(3)\fP passed in via +.IR dnsrec . + +The \fIares_dns_parse(3)\fP function parses the buffer provided in +.IR buf +with length provided in +.IR buf_len. +The +.IR flags +parameter can be one or more \fIares_dns_parse_flags_t\fP, or zero if no +flags are needed. The resulting dns record data structure is stored into the +variable pointed to by +.IR dnsrec +and must be destroyed using \fIares_dns_record_destroy(3)\fP. + +The \fIares_dns_write(3)\fP function takes a populated DNS record structure in +.IR dnsrec +and writes a wire-format DNS message into the variable pointed to by +.IR buf +and writes the length of the buffer into the variable pointed to by +.IR buf_len. +The buffer must be destroyed using \fIares_free_string(3)\fP. + +The \fIares_dns_record_create(3)\fP function creates an empty DNS record structure +in the variable pointed to by +.IR dnsrec. +The +.IR id +parameter is the DNS message id, however if passing to \fIares_send(3)\fP this +identifier will be overwritten, so should typically be 0. The +.IR flags +parameter is one or more \fIares_dns_flags_t\fP. The opcode is passed in the +.IR opcode +parameter and should typically be \fIARES_OPCODE_QUERY\fP. The response code +is meant mostly for responses and is passed in the +.IR rcode +parameter and is typically \fPARES_RCODE_NOERROR\fP. + + +The \fIares_dns_record_get_id(3)\fP function is used to retrieve the DNS +message id from the DNS record provided in the +.IR dnsrec +parameter. + +The \fIares_dns_record_get_flags(3)\fP function is used to retrieve the DNS +message flags from the DNS record provided in the +.IR dnsrec +parameter. + +The \fIares_dns_record_get_opcode(3)\fP function is used to retrieve the DNS +message flags from the DNS record provided in the +.IR dnsrec +parameter. + +The \fIares_dns_record_get_rcode(3)\fP function is used to retrieve the DNS +message response code from the DNS record provided in the +.IR dnsrec +parameter. + + +The \fIares_dns_record_query_add(3)\fP function is used to add a question to +the DNS record provided in the +.IR dnsrec +parameter. The domain name specified for the question is provided in the +.IR name +parameter, along with the question type in the +.IR qtype +parameter and the question class (typically \fIARES_CLASS_IN\fP) in the +.IR qclass +parameter. + +The \fIares_dns_record_query_cnt(3)\fP function is used to retrieve the number +of DNS questions in the DNS record provided in the +.IR dnsrec +parameter. + +The \fIares_dns_record_query_get(3)\fP function is used to retrieve the details +of a single DNS question in the provided +.IR dnsrec +parameter. The index provided in the +.IR idx +parameter must be less than the value returned from \fIares_dns_record_query_cnt(3)\fP. +The DNS question name will be returned in the variable pointed to by the +.IR name +parameter, this may be provided as NULL if the name is not needed. +The DNS question type will be returned in the variable pointed to by the +.IR qtype +parameter, this may be provided as NULL if the type is not needed. +The DNS question class will be returned in the variable pointed to by the +.IR qclass +parameter, this may be provided as NULL if the class is not needed. + + +.SH RETURN VALUES + +\fIares_dns_parse(3)\fP, \fIares_dns_write(3)\fP, \fIares_dns_record_create(3)\fP, +\fIares_dns_record_query_add(3)\fP, and \fIares_dns_record_query_get(3)\fP all +return an \fIares_status_t\fP error code. +.B ARES_SUCCESS +is returned on success, +.B ARES_ENOMEM +is returned on out of memory, +.B ARES_EFORMERR +is returned on misuse. + +\fIares_dns_record_get_id(3)\fP, \fIares_dns_record_get_flags(3)\fP, +\fIares_dns_record_get_opcode(3)\fP, \fIares_dns_record_get_rcode(3)\fP, and +\fIares_dns_record_query_cnt(3)\fP all returned their prescribed datatype +values and in general can't fail except for misuse cases, in which a 0 may +be returned, however 0 can also be a valid return value for most of these +functions. + + +.SH AVAILABILITY +These functions were first introduced in c-ares version 1.22.0. +.SH SEE ALSO +.BR ares_dns_mapping (3), +.BR ares_dns_rr (3), +.BR ares_free_string (3) +.SH AUTHOR +Copyright (C) 2023 The c-ares project and its members. diff --git a/deps/cares/docs/ares_dns_record_create.3 b/deps/cares/docs/ares_dns_record_create.3 new file mode 100644 index 00000000000000..4acc581d29789c --- /dev/null +++ b/deps/cares/docs/ares_dns_record_create.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_record.3 diff --git a/deps/cares/docs/ares_dns_record_destroy.3 b/deps/cares/docs/ares_dns_record_destroy.3 new file mode 100644 index 00000000000000..4acc581d29789c --- /dev/null +++ b/deps/cares/docs/ares_dns_record_destroy.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_record.3 diff --git a/deps/cares/docs/ares_dns_record_get_flags.3 b/deps/cares/docs/ares_dns_record_get_flags.3 new file mode 100644 index 00000000000000..4acc581d29789c --- /dev/null +++ b/deps/cares/docs/ares_dns_record_get_flags.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_record.3 diff --git a/deps/cares/docs/ares_dns_record_get_id.3 b/deps/cares/docs/ares_dns_record_get_id.3 new file mode 100644 index 00000000000000..4acc581d29789c --- /dev/null +++ b/deps/cares/docs/ares_dns_record_get_id.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_record.3 diff --git a/deps/cares/docs/ares_dns_record_get_opcode.3 b/deps/cares/docs/ares_dns_record_get_opcode.3 new file mode 100644 index 00000000000000..4acc581d29789c --- /dev/null +++ b/deps/cares/docs/ares_dns_record_get_opcode.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_record.3 diff --git a/deps/cares/docs/ares_dns_record_get_rcode.3 b/deps/cares/docs/ares_dns_record_get_rcode.3 new file mode 100644 index 00000000000000..4acc581d29789c --- /dev/null +++ b/deps/cares/docs/ares_dns_record_get_rcode.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_record.3 diff --git a/deps/cares/docs/ares_dns_record_query_add.3 b/deps/cares/docs/ares_dns_record_query_add.3 new file mode 100644 index 00000000000000..4acc581d29789c --- /dev/null +++ b/deps/cares/docs/ares_dns_record_query_add.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_record.3 diff --git a/deps/cares/docs/ares_dns_record_query_cnt.3 b/deps/cares/docs/ares_dns_record_query_cnt.3 new file mode 100644 index 00000000000000..4acc581d29789c --- /dev/null +++ b/deps/cares/docs/ares_dns_record_query_cnt.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_record.3 diff --git a/deps/cares/docs/ares_dns_record_query_get.3 b/deps/cares/docs/ares_dns_record_query_get.3 new file mode 100644 index 00000000000000..4acc581d29789c --- /dev/null +++ b/deps/cares/docs/ares_dns_record_query_get.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_record.3 diff --git a/deps/cares/docs/ares_dns_record_rr_add.3 b/deps/cares/docs/ares_dns_record_rr_add.3 new file mode 100644 index 00000000000000..b93e4cd4e37fa8 --- /dev/null +++ b/deps/cares/docs/ares_dns_record_rr_add.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/deps/cares/docs/ares_dns_record_rr_cnt.3 b/deps/cares/docs/ares_dns_record_rr_cnt.3 new file mode 100644 index 00000000000000..b93e4cd4e37fa8 --- /dev/null +++ b/deps/cares/docs/ares_dns_record_rr_cnt.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/deps/cares/docs/ares_dns_record_rr_del.3 b/deps/cares/docs/ares_dns_record_rr_del.3 new file mode 100644 index 00000000000000..b93e4cd4e37fa8 --- /dev/null +++ b/deps/cares/docs/ares_dns_record_rr_del.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/deps/cares/docs/ares_dns_record_rr_get.3 b/deps/cares/docs/ares_dns_record_rr_get.3 new file mode 100644 index 00000000000000..b93e4cd4e37fa8 --- /dev/null +++ b/deps/cares/docs/ares_dns_record_rr_get.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/deps/cares/docs/ares_dns_rr.3 b/deps/cares/docs/ares_dns_rr.3 new file mode 100644 index 00000000000000..2999d18e3aa6bb --- /dev/null +++ b/deps/cares/docs/ares_dns_rr.3 @@ -0,0 +1,631 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.\" +.TH ARES_DNS_RR 3 "12 November 2023" +.SH NAME +ares_dns_record_rr_add, ares_dns_record_rr_cnt, ares_dns_record_rr_del, +ares_dns_record_rr_get, ares_dns_rr_get_addr, ares_dns_rr_get_addr6, +ares_dns_rr_get_bin, ares_dns_rr_get_class, ares_dns_rr_get_name, +ares_dns_rr_get_opt, ares_dns_rr_get_opt_byid, ares_dns_rr_get_opt_cnt, +ares_dns_rr_get_str, ares_dns_rr_get_ttl, ares_dns_rr_get_type, +ares_dns_rr_get_u16, ares_dns_rr_get_u32, ares_dns_rr_get_u8, ares_dns_rr_key_t, +ares_dns_rr_set_addr, ares_dns_rr_set_addr6, ares_dns_rr_set_bin, +ares_dns_rr_set_opt, ares_dns_rr_set_str, ares_dns_rr_set_u16, +ares_dns_rr_set_u32, ares_dns_rr_set_u8, ares_dns_section_t, ares_tlsa_match_t, +ares_tlsa_selector_t, ares_tlsa_usage_t \- +DNS Resource Record creating, reading, and writing functions. +.SH SYNOPSIS +.nf +#include + +size_t ares_dns_record_rr_cnt(const ares_dns_record_t *dnsrec, + ares_dns_section_t sect); + +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 *ares_dns_record_rr_get(ares_dns_record_t *dnsrec, + ares_dns_section_t sect, + size_t idx); + +ares_status_t ares_dns_record_rr_del(ares_dns_record_t *dnsrec, + ares_dns_section_t sect, + size_t idx); + +const char *ares_dns_rr_get_name(const ares_dns_rr_t *rr); + +ares_dns_rec_type_t ares_dns_rr_get_type(const ares_dns_rr_t *rr); + +ares_dns_class_t ares_dns_rr_get_class(const ares_dns_rr_t *rr); + +unsigned int ares_dns_rr_get_ttl(const ares_dns_rr_t *rr); + +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); + +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); + +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 ares_dns_rr_set_u8(ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, + unsigned char val); + +ares_status_t ares_dns_rr_set_u16(ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, + unsigned short val); + +ares_status_t ares_dns_rr_set_u32(ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, + unsigned int val); + +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 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); + +const struct in_addr *ares_dns_rr_get_addr(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key); + +const struct ares_in6_addr *ares_dns_rr_get_addr6(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key); + +const char *ares_dns_rr_get_str(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key); + +unsigned char ares_dns_rr_get_u8(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key); + +unsigned short ares_dns_rr_get_u16(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key); + +unsigned int ares_dns_rr_get_u32(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key); + +const unsigned char *ares_dns_rr_get_bin(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, + size_t *len); + +size_t ares_dns_rr_get_opt_cnt(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key); + +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_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); + +.fi +.SH ENUMERATIONS + +.B ares_dns_section_t - +DNS RR section types: +.RS 4 +.B ARES_SECTION_ANSWER +- Answer section +.br +.B ARES_SECTION_AUTHORITY +- Authority section +.br +.B ARES_SECTION_ADDITIONAL +- Additional Information section +.br +.RE + +.B ares_dns_rr_key_t - +Keys used for handling RR record parameters: +.RS 4 +.B ARES_RR_A_ADDR +- A Record. Address. Datatype: \fIARES_DATATYPE_INADDR\fP +.br +.B ARES_RR_NS_NSDNAME +- NS Record. Name. Datatype: \fIARES_DATATYPE_NAME\fP +.br +.B ARES_RR_CNAME_CNAME +- CNAME Record. CName. Datatype: \fIARES_DATATYPE_NAME\fP +.br +.B ARES_RR_SOA_MNAME +- SOA Record. MNAME, Primary Source of Data. Datatype: \fIARES_DATATYPE_NAME\fP +.br +.B ARES_RR_SOA_RNAME +- SOA Record. RNAME, Mailbox of person responsible. Datatype: \fIARES_DATATYPE_NAME\fP +.br +.B ARES_RR_SOA_SERIAL +- SOA Record. Serial, version. Datatype: \fIARES_DATATYPE_U32\fP +.br +.B ARES_RR_SOA_REFRESH +- SOA Record. Refresh, zone refersh interval. Datatype: \fIARES_DATATYPE_U32\fP +.br +.B ARES_RR_SOA_RETRY +- SOA Record. Retry, failed refresh retry interval. Datatype: \fIARES_DATATYPE_U32\fP +.br +.B ARES_RR_SOA_EXPIRE +- SOA Record. Expire, upper limit on authority. Datatype: \fIARES_DATATYPE_U32\fP +.br +.B ARES_RR_SOA_MINIMUM +- SOA Record. Minimum, RR TTL. Datatype: \fIARES_DATATYPE_U32\fP +.br +.B ARES_RR_PTR_DNAME +- PTR Record. DNAME, pointer domain. Datatype: \fIARES_DATATYPE_NAME\fP +.br +.B ARES_RR_HINFO_CPU +- HINFO Record. CPU. Datatype: \fIARES_DATATYPE_STR\fP +.br +.B ARES_RR_HINFO_OS +- HINFO Record. OS. Datatype: \fIARES_DATATYPE_STR\fP +.br +.B ARES_RR_MX_PREFERENCE +- MX Record. Preference. Datatype: \fIARES_DATATYPE_U16\fP +.br +.B ARES_RR_MX_EXCHANGE +- MX Record. Exchange, domain. Datatype: \fIARES_DATATYPE_NAME\fP +.br +.B ARES_RR_TXT_DATA +- TXT Record. Data. Datatype: \fIARES_DATATYPE_BINP\fP +.br +.B ARES_RR_AAAA_ADDR +- AAAA Record. Address. Datatype: \fIARES_DATATYPE_INADDR6\fP +.br +.B ARES_RR_SRV_PRIORITY +- SRV Record. Priority. Datatype: \fIARES_DATATYPE_U16\fP +.br +.B ARES_RR_SRV_WEIGHT +- SRV Record. Weight. Datatype: \fIARES_DATATYPE_U16\fP +.br +.B ARES_RR_SRV_PORT +- SRV Record. Port. Datatype: \fIARES_DATATYPE_U16\fP +.br +.B ARES_RR_SRV_TARGET +- SRV Record. Target domain. Datatype: \fIARES_DATATYPE_NAME\fP +.br +.B ARES_RR_NAPTR_ORDER +- NAPTR Record. Order. Datatype: \fIARES_DATATYPE_U16\fP +.br +.B ARES_RR_NAPTR_PREFERENCE +- NAPTR Record. Preference. Datatype: \fIARES_DATATYPE_U16\fP +.br +.B ARES_RR_NAPTR_FLAGS +- NAPTR Record. Flags. Datatype: \fIARES_DATATYPE_STR\fP +.br +.B ARES_RR_NAPTR_SERVICES +- NAPTR Record. Services. Datatype: \fIARES_DATATYPE_STR\fP +.br +.B ARES_RR_NAPTR_REGEXP +- NAPTR Record. Regexp. Datatype: \fIARES_DATATYPE_STR\fP +.br +.B ARES_RR_NAPTR_REPLACEMENT +- NAPTR Record. Replacement. Datatype: \fIARES_DATATYPE_NAME\fP +.br +.B ARES_RR_OPT_UDP_SIZE +- OPT Record. UDP Size. Datatype: \fIARES_DATATYPE_U16\fP +.br +.B ARES_RR_OPT_VERSION +- OPT Record. Version. Datatype: \fIARES_DATATYPE_U8\fP +.br +.B ARES_RR_OPT_FLAGS +- OPT Record. Flags. Datatype: \fIARES_DATATYPE_U16\fP +.br +.B ARES_RR_OPT_OPTIONS +- OPT Record. Options. See \fIares_opt_param_t\fP. Datatype: \fIARES_DATATYPE_OPT\fP +.br +.B ARES_RR_TLSA_CERT_USAGE +- TLSA Record. Certificate Usage. See \fIares_tlsa_usage_t\fP. Datatype: \fIARES_DATATYPE_U8\fP +.br +.B ARES_RR_TLSA_SELECTOR +- TLSA Record. Selector. See \fIares_tlsa_selector_t\fP. Datatype: \fIARES_DATATYPE_U8\fP +.br +.B ARES_RR_TLSA_MATCH +- TLSA Record. Matching Type. See \fIares_tlsa_match_t\fP. Datatype: \fIARES_DATATYPE_U8\fP +.br +.B ARES_RR_TLSA_DATA +- TLSA Record. Certificate Association Data. Datatype: \fIARES_DATATYPE_BIN\fP +.br +.B ARES_RR_SVCB_PRIORITY +- SVCB Record. SvcPriority. Datatype: \fIARES_DATATYPE_U16\fP +.br +.B ARES_RR_SVCB_TARGET +- SVCB Record. TargetName. Datatype: \fIARES_DATATYPE_NAME\fP +.br +.B ARES_RR_SVCB_PARAMS +- SVCB Record. SvcParams. See \fIares_svcb_param_t\fP. Datatype: \fIARES_DATATYPE_OPT\fP +.br +.B ARES_RR_HTTPS_PRIORITY +- HTTPS Record. SvcPriority. Datatype: \fIARES_DATATYPE_U16\fP +.br +.B ARES_RR_HTTPS_TARGET +- HTTPS Record. TargetName. Datatype: \fIARES_DATATYPE_NAME\fP +.br +.B ARES_RR_HTTPS_PARAMS +- HTTPS Record. SvcParams. See \fIares_svcb_param_t\fP. Datatype: \fIARES_DATATYPE_OPT\fP +.br +.B ARES_RR_URI_PRIORITY +- URI Record. Priority. Datatype: \fIARES_DATATYPE_U16\fP +.br +.B ARES_RR_URI_WEIGHT +- URI Record. Weight. Datatype: \fIARES_DATATYPE_U16\fP +.br +.B ARES_RR_URI_TARGET +- URI Record. Target domain. Datatype: \fIARES_DATATYPE_NAME\fP +.br +.B ARES_RR_CAA_CRITICAL +- CAA Record. Critical flag. Datatype: \fIARES_DATATYPE_U8\fP +.br +.B ARES_RR_CAA_TAG +- CAA Record. Tag/Property. Datatype: \fIARES_DATATYPE_STR\fP +.br +.B ARES_RR_CAA_VALUE +- CAA Record. Value. Datatype: \fIARES_DATATYPE_BINP\fP +.br +.B ARES_RR_RAW_RR_TYPE +- RAW Record. RR Type. Datatype: \fIARES_DATATYPE_U16\fP +.br +.B ARES_RR_RAW_RR_DATA +- RAW Record. RR Data. Datatype: \fIARES_DATATYPE_BIN\fP +.br +.RE + +.B ares_tlsa_usage_t - +TLSA Record \fIARES_RR_TLSA_CERT_USAGE\fP known values +.RS 4 +.B ARES_TLSA_USAGE_CA +- Certificate Usage 0. CA Constraint +.br +.B ARES_TLSA_USAGE_SERVICE +- Certificate Usage 1. Service Certificate Constraint +.br +.B ARES_TLSA_USAGE_TRUSTANCHOR +- Certificate Usage 2. Trust Anchor Assertion +.br +.B ARES_TLSA_USAGE_DOMAIN +- Certificate Usage 3. Domain-issued certificate +.br +.RE + +.B ares_tlsa_selector_t - +TLSA Record \fIARES_RR_TLSA_SELECTOR\fP known values: +.RS 4 +.B ARES_TLSA_SELECTOR_FULL +- Full Certificate +.br +.B ARES_TLSA_SELECTOR_SUBJPUBKEYINFO +- DER-encoded SubjectPublicKeyInfo +.br +.RE + +.B ares_tlsa_match_t - +TLSA Record \fIARES_RR_TLSA_MATCH\fP known values: +.RS 4 +.B ARES_TLSA_MATCH_EXACT +- Exact match +.br +.B ARES_TLSA_MATCH_SHA256 +- Sha256 match +.br +.B ARES_TLSA_MATCH_SHA512 +- Sha512 match +.br +.RE + + +.SH DESCRIPTION + +The \fIares_dns_record_rr_cnt(3)\fP function returns the number of resource +records in the DNS record provided by the +.IR dnsrec +parameter for the section provided in the +.IR sect +parameter. + +The \fIares_dns_record_rr_add(3)\fP function adds a new resource record entry +the the DNS record provided by the +.IR dnsrec +parameter. The resulting resource record is stored into the variable pointed to by +.IR rr_out. +The DNS section the resource record belongs to is specified by the +.IR sect +parameter. The domain name associated with the resource record is specified by the +.IR name +parameter, which can not be NULL but may be an empty string, or ".". The resource +record type is specified in the +.IR type +parameter, along with the DNS record class in the +.IR rclass +parameter, and the Time To Live (TTL) in the +.IR ttl +parameter. + + +The \fIares_dns_record_rr_get(3)\fP function is used to retrieve the resource +record pointer from the DNS record provided in the +.IR dnsrec +parameter, for the resource record section provided in the +.IR sect +parameter, for the specified index in the +.IR idx +parameter. The index must be less than \fIares_dns_record_rr_cnt(3)\fP. + + +The \fIares_dns_record_rr_del(3)\fP is used to delete a resource record from +the DNS record specified in the +.IR dnsrec +parameter. Its primary use is to remove a \fIARES_REC_TYPE_OPT\fP record when +needing to retry a query without EDNS support. The DNS RR section is specified +via the +.IR sect +parameter, and the index to remove is specified in the +.IR idx +parameter. The index must be less than \fIares_dns_record_rr_cnt(3)\fP. + + +The \fIares_dns_rr_get_name(3)\fP function is used to retrieve the resource +record domain name from the Resource Record pointer provided in the +.IR rr +parameter. + +The \fIares_dns_rr_get_type(3)\fP function is used to retrieve the resource +record type from the Resource Record pointer provided in the +.IR rr +parameter. + +The \fIares_dns_rr_get_class(3)\fP function is used to retrieve the resource +record class from the Resource Record pointer provided in the +.IR rr +parameter. + +The \fIares_dns_rr_get_ttl(3)\fP function is used to retrieve the resource +record class Time to Live (TTL) from the Resource Record pointer provided in the +.IR rr +parameter. + +The \fIares_dns_rr_set_addr(3)\fP function is used to set an IPv4 address for the +associated resource record key/parameter when the datatype is \fIARES_DATATYPE_INADDR\fP. +The resource record to be modified is provided in the +.IR dns_rr +parameter, the key/parameter is provided in the +.IR key +parameter, and the value is provided in the +.IR addr +parameter. + +The \fIares_dns_rr_set_addr6(3)\fP function is used to set an IPv6 address for the +associated resource record key/parameter when the datatype is \fIARES_DATATYPE_INADDR6\fP. +The resource record to be modified is provided in the +.IR dns_rr +parameter, the key/parameter is provided in the +.IR key +parameter, and the value is provided in the +.IR addr +parameter. + +The \fIares_dns_rr_set_str(3)\fP function is used to set a string for the +associated resource record key/parameter when the datatype is \fIARES_DATATYPE_STR\fP +or \fIARES_DATATYPE_NAME\fP. Most strings are limited to 255 bytes, +however some records, such as a TXT record may allow longer as they are output +as multiple strings. The resource record to be modified is +provided in the +.IR dns_rr +parameter, the key/parameter is provided in the +.IR key +parameter, and the value is provided in the +.IR val +parameter. + +The \fIares_dns_rr_set_u8(3)\fP function is used to set an 8bit unsigned value for the +associated resource record key/parameter when the datatype is \fIARES_DATATYPE_U8\fP. +The resource record to be modified is provided in the +.IR dns_rr +parameter, the key/parameter is provided in the +.IR key +parameter, and the value is provided in the +.IR val +parameter. + +The \fIares_dns_rr_set_u16(3)\fP function is used to set an 16bit unsigned value for the +associated resource record key/parameter when the datatype is \fIARES_DATATYPE_U16\fP. +The resource record to be modified is provided in the +.IR dns_rr +parameter, the key/parameter is provided in the +.IR key +parameter, and the value is provided in the +.IR val +parameter. + +The \fIares_dns_rr_set_u32(3)\fP function is used to set an 32bit unsigned value for the +associated resource record key/parameter when the datatype is \fIARES_DATATYPE_U32\fP. +The resource record to be modified is provided in the +.IR dns_rr +parameter, the key/parameter is provided in the +.IR key +parameter, and the value is provided in the +.IR val +parameter. + +The \fIares_dns_rr_set_bin(3)\fP function is used to set an binary value for the +associated resource record key/parameter when the datatype is \fIARES_DATATYPE_BIN\fP +or \fIARES_DATATYPE_BINP\fP. +The resource record to be modified is provided in the +.IR dns_rr +parameter, the key/parameter is provided in the +.IR key +parameter, and the value is provided in the +.IR val +parameter. And the associated value length is provided in the +.IR len +parameter. + +The \fIares_dns_rr_set_opt(3)\fP function is used to set option/parameter keys and +values for the resource record when the datatype if \fIARES_DATATYPE_OPT\fP. The +resource record to be modified is provided in the +.IR dns_rr +parameter. They key/parameter is provided in the +.IR key +parameter. The option/parameter value specific to the resource record is provided +in the +.IR opt +parameter, and this is left to the user to determine the appropriate value to +use. Some known values may be provided by \fIares_svcb_param_t\fP and \fIares_opt_param_t\fP +enumerations. The value for the option is always provided in binary form in +.IR val +with length provided in +.IR val_len. + +The \fIares_dns_rr_get_addr(3)\fP function is used to retrieve the IPv4 address +from the resource record when the datatype is \fIARES_DATATYPE_INADDR\fP. The +resource record is provided in the +.IR dns_rr +parameter and the key/parameter to retrieve is provided in the +.IR key +parameter. + +The \fIares_dns_rr_get_addr6(3)\fP function is used to retrieve the IPv6 address +from the resource record when the datatype is \fIARES_DATATYPE_INADDR6\fP. The +resource record is provided in the +.IR dns_rr +parameter and the key/parameter to retrieve is provided in the +.IR key +parameter. + +The \fIares_dns_rr_get_str(3)\fP function is used to retrieve a string +from the resource record when the datatype is \fIARES_DATATYPE_STR\fP or +\fIARES_DATATYPE_NAME\fP. The resource record is provided in the +.IR dns_rr +parameter and the key/parameter to retrieve is provided in the +.IR key +parameter. + +The \fIares_dns_rr_get_u8(3)\fP function is used to retrieve an 8bit integer +from the resource record when the datatype is \fIARES_DATATYPE_U8\fP. +The resource record is provided in the +.IR dns_rr +parameter and the key/parameter to retrieve is provided in the +.IR key +parameter. + +The \fIares_dns_rr_get_u16(3)\fP function is used to retrieve a 16bit integer +from the resource record when the datatype is \fIARES_DATATYPE_U16\fP. +The resource record is provided in the +.IR dns_rr +parameter and the key/parameter to retrieve is provided in the +.IR key +parameter. + +The \fIares_dns_rr_get_u32(3)\fP function is used to retrieve a 32bit integer +from the resource record when the datatype is \fIARES_DATATYPE_U32\fP. +The resource record is provided in the +.IR dns_rr +parameter and the key/parameter to retrieve is provided in the +.IR key +parameter. + +The \fIares_dns_rr_get_bin(3)\fP function is used to retrieve binary data +from the resource record when the datatype is \fIARES_DATATYPE_BIN\fP or +\fIARES_DATATYPE_BINP\fP. +The resource record is provided in the +.IR dns_rr +parameter and the key/parameter to retrieve is provided in the +.IR key +parameter, and length is stored into the variable pointed to by +.IR len. + +The \fIares_dns_rr_get_opt_cnt(3)\fP function is used to retrieve the count +of options/parameters associated with the resource record when the datatype +is \fIARES_DATATYPE_OPT\fP. +The resource record is provided in the +.IR dns_rr +parameter and the key/parameter to retrieve is provided in the +.IR key. + +The \fIares_dns_rr_get_opt(3)\fP function is used to retrieve binary option data +from the resource record when the datatype is \fIARES_DATATYPE_OPT\fP for the +specified index. +The resource record is provided in the +.IR dns_rr +parameter and the key/parameter to retrieve is provided in the +.IR key +parameter, the index to retrieve the option data from is provided in the +.IR idx +parameter. The value is stored into the variable pointed to by +.IR val +and length is stored into the variable pointed to by +.IR val_len. + +The \fIares_dns_rr_get_opt_byid(3)\fP function is used to retrieve binary option data +from the resource record when the datatype is \fIARES_DATATYPE_OPT\fP for the +specified option identifier, if it exists. +The resource record is provided in the +.IR dns_rr +parameter and the key/parameter to retrieve is provided in the +.IR key +parameter, the identifier to retrieve the option data from is provided in the +.IR opt +parameter. The value is stored into the variable pointed to by +.IR val +and length is stored into the variable pointed to by +.IR val_len. + + +.SH RETURN VALUES + +\fIares_dns_record_rr_cnt(3)\fP and \fIares_dns_rr_get_opt_cnt(3)\fP return the +respective counts. + +\fIares_dns_record_rr_add(3)\fP, \fIares_dns_record_rr_del(3)\fP, +\fIares_dns_rr_set_addr(3)\fP, \fIares_dns_rr_set_addr6(3)\fP, +\fIares_dns_rr_set_str(3)\fP, \fIares_dns_rr_set_u8(3)\fP, +\fIares_dns_rr_set_u16(3)\fP, \fIares_dns_rr_set_u32(3)\fP, +\fIares_dns_rr_set_bin(3)\fP, and \fIares_dns_rr_set_opt(3)\fP all +return an \fIares_status_t\fP error code. +.B ARES_SUCCESS +is returned on success, +.B ARES_ENOMEM +is returned on out of memory, +.B ARES_EFORMERR +is returned on misuse. + + +\fIares_dns_rr_get_name(3)\fP, \fIares_dns_rr_get_type(3)\fP, +\fIares_dns_rr_get_class(3)\fP, \fIares_dns_rr_get_ttl(3)\fP, +\fIares_dns_rr_get_addr(3)\fP, \fIares_dns_rr_get_addr6(3)\fP, +\fIares_dns_rr_get_str(3)\fP, \fIares_dns_rr_get_u8(3)\fP, +\fIares_dns_rr_get_u16(3)\fP, \fIares_dns_rr_get_u32(3)\fP, +\fIares_dns_rr_get_bin(3)\fP, \fIares_dns_rr_get_opt(3)\fP all return their +prescribed datatype values and in general can't fail except for misuse cases, +in which a 0 (or NULL) may be returned, however 0 can also be a valid return +value for most of these functions. + +\fIares_dns_record_rr_get(3)\fP will return the requested resource record +pointer or NULL on failure (misuse). + +\fIares_dns_rr_get_opt_byid(3)\fP will return ARES_TRUE if the option was +found, otherwise ARES_FALSE if not found (or misuse). + +.SH AVAILABILITY +These functions were first introduced in c-ares version 1.22.0. +.SH SEE ALSO +.BR ares_dns_mapping (3), +.BR ares_dns_record (3), +.BR ares_free_string (3) +.SH AUTHOR +Copyright (C) 2023 The c-ares project and its members. diff --git a/deps/cares/docs/ares_dns_rr_get_addr.3 b/deps/cares/docs/ares_dns_rr_get_addr.3 new file mode 100644 index 00000000000000..b93e4cd4e37fa8 --- /dev/null +++ b/deps/cares/docs/ares_dns_rr_get_addr.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/deps/cares/docs/ares_dns_rr_get_addr6.3 b/deps/cares/docs/ares_dns_rr_get_addr6.3 new file mode 100644 index 00000000000000..b93e4cd4e37fa8 --- /dev/null +++ b/deps/cares/docs/ares_dns_rr_get_addr6.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/deps/cares/docs/ares_dns_rr_get_bin.3 b/deps/cares/docs/ares_dns_rr_get_bin.3 new file mode 100644 index 00000000000000..b93e4cd4e37fa8 --- /dev/null +++ b/deps/cares/docs/ares_dns_rr_get_bin.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/deps/cares/docs/ares_dns_rr_get_class.3 b/deps/cares/docs/ares_dns_rr_get_class.3 new file mode 100644 index 00000000000000..b93e4cd4e37fa8 --- /dev/null +++ b/deps/cares/docs/ares_dns_rr_get_class.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/deps/cares/docs/ares_dns_rr_get_keys.3 b/deps/cares/docs/ares_dns_rr_get_keys.3 new file mode 100644 index 00000000000000..a7758577c5b459 --- /dev/null +++ b/deps/cares/docs/ares_dns_rr_get_keys.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_mapping.3 diff --git a/deps/cares/docs/ares_dns_rr_get_name.3 b/deps/cares/docs/ares_dns_rr_get_name.3 new file mode 100644 index 00000000000000..b93e4cd4e37fa8 --- /dev/null +++ b/deps/cares/docs/ares_dns_rr_get_name.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/deps/cares/docs/ares_dns_rr_get_opt.3 b/deps/cares/docs/ares_dns_rr_get_opt.3 new file mode 100644 index 00000000000000..b93e4cd4e37fa8 --- /dev/null +++ b/deps/cares/docs/ares_dns_rr_get_opt.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/deps/cares/docs/ares_dns_rr_get_opt_byid.3 b/deps/cares/docs/ares_dns_rr_get_opt_byid.3 new file mode 100644 index 00000000000000..b93e4cd4e37fa8 --- /dev/null +++ b/deps/cares/docs/ares_dns_rr_get_opt_byid.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/deps/cares/docs/ares_dns_rr_get_opt_cnt.3 b/deps/cares/docs/ares_dns_rr_get_opt_cnt.3 new file mode 100644 index 00000000000000..b93e4cd4e37fa8 --- /dev/null +++ b/deps/cares/docs/ares_dns_rr_get_opt_cnt.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/deps/cares/docs/ares_dns_rr_get_str.3 b/deps/cares/docs/ares_dns_rr_get_str.3 new file mode 100644 index 00000000000000..b93e4cd4e37fa8 --- /dev/null +++ b/deps/cares/docs/ares_dns_rr_get_str.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/deps/cares/docs/ares_dns_rr_get_ttl.3 b/deps/cares/docs/ares_dns_rr_get_ttl.3 new file mode 100644 index 00000000000000..b93e4cd4e37fa8 --- /dev/null +++ b/deps/cares/docs/ares_dns_rr_get_ttl.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/deps/cares/docs/ares_dns_rr_get_type.3 b/deps/cares/docs/ares_dns_rr_get_type.3 new file mode 100644 index 00000000000000..b93e4cd4e37fa8 --- /dev/null +++ b/deps/cares/docs/ares_dns_rr_get_type.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/deps/cares/docs/ares_dns_rr_get_u16.3 b/deps/cares/docs/ares_dns_rr_get_u16.3 new file mode 100644 index 00000000000000..b93e4cd4e37fa8 --- /dev/null +++ b/deps/cares/docs/ares_dns_rr_get_u16.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/deps/cares/docs/ares_dns_rr_get_u32.3 b/deps/cares/docs/ares_dns_rr_get_u32.3 new file mode 100644 index 00000000000000..b93e4cd4e37fa8 --- /dev/null +++ b/deps/cares/docs/ares_dns_rr_get_u32.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/deps/cares/docs/ares_dns_rr_get_u8.3 b/deps/cares/docs/ares_dns_rr_get_u8.3 new file mode 100644 index 00000000000000..b93e4cd4e37fa8 --- /dev/null +++ b/deps/cares/docs/ares_dns_rr_get_u8.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/deps/cares/docs/ares_dns_rr_key_datatype.3 b/deps/cares/docs/ares_dns_rr_key_datatype.3 new file mode 100644 index 00000000000000..4587b9a586ef8e --- /dev/null +++ b/deps/cares/docs/ares_dns_rr_key_datatype.3 @@ -0,0 +1,4 @@ +.\" +.\" Copyright (C) Daniel Stenberg +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_mapping.3 diff --git a/deps/cares/docs/ares_dns_rr_key_t.3 b/deps/cares/docs/ares_dns_rr_key_t.3 new file mode 100644 index 00000000000000..b93e4cd4e37fa8 --- /dev/null +++ b/deps/cares/docs/ares_dns_rr_key_t.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/deps/cares/docs/ares_dns_rr_key_to_rec_type.3 b/deps/cares/docs/ares_dns_rr_key_to_rec_type.3 new file mode 100644 index 00000000000000..4587b9a586ef8e --- /dev/null +++ b/deps/cares/docs/ares_dns_rr_key_to_rec_type.3 @@ -0,0 +1,4 @@ +.\" +.\" Copyright (C) Daniel Stenberg +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_mapping.3 diff --git a/deps/cares/docs/ares_dns_rr_key_tostr.3 b/deps/cares/docs/ares_dns_rr_key_tostr.3 new file mode 100644 index 00000000000000..4587b9a586ef8e --- /dev/null +++ b/deps/cares/docs/ares_dns_rr_key_tostr.3 @@ -0,0 +1,4 @@ +.\" +.\" Copyright (C) Daniel Stenberg +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_mapping.3 diff --git a/deps/cares/docs/ares_dns_rr_set_addr.3 b/deps/cares/docs/ares_dns_rr_set_addr.3 new file mode 100644 index 00000000000000..b93e4cd4e37fa8 --- /dev/null +++ b/deps/cares/docs/ares_dns_rr_set_addr.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/deps/cares/docs/ares_dns_rr_set_addr6.3 b/deps/cares/docs/ares_dns_rr_set_addr6.3 new file mode 100644 index 00000000000000..b93e4cd4e37fa8 --- /dev/null +++ b/deps/cares/docs/ares_dns_rr_set_addr6.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/deps/cares/docs/ares_dns_rr_set_bin.3 b/deps/cares/docs/ares_dns_rr_set_bin.3 new file mode 100644 index 00000000000000..b93e4cd4e37fa8 --- /dev/null +++ b/deps/cares/docs/ares_dns_rr_set_bin.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/deps/cares/docs/ares_dns_rr_set_opt.3 b/deps/cares/docs/ares_dns_rr_set_opt.3 new file mode 100644 index 00000000000000..b93e4cd4e37fa8 --- /dev/null +++ b/deps/cares/docs/ares_dns_rr_set_opt.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/deps/cares/docs/ares_dns_rr_set_str.3 b/deps/cares/docs/ares_dns_rr_set_str.3 new file mode 100644 index 00000000000000..b93e4cd4e37fa8 --- /dev/null +++ b/deps/cares/docs/ares_dns_rr_set_str.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/deps/cares/docs/ares_dns_rr_set_u16.3 b/deps/cares/docs/ares_dns_rr_set_u16.3 new file mode 100644 index 00000000000000..b93e4cd4e37fa8 --- /dev/null +++ b/deps/cares/docs/ares_dns_rr_set_u16.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/deps/cares/docs/ares_dns_rr_set_u32.3 b/deps/cares/docs/ares_dns_rr_set_u32.3 new file mode 100644 index 00000000000000..b93e4cd4e37fa8 --- /dev/null +++ b/deps/cares/docs/ares_dns_rr_set_u32.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/deps/cares/docs/ares_dns_rr_set_u8.3 b/deps/cares/docs/ares_dns_rr_set_u8.3 new file mode 100644 index 00000000000000..b93e4cd4e37fa8 --- /dev/null +++ b/deps/cares/docs/ares_dns_rr_set_u8.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/deps/cares/docs/ares_dns_section_t.3 b/deps/cares/docs/ares_dns_section_t.3 new file mode 100644 index 00000000000000..b93e4cd4e37fa8 --- /dev/null +++ b/deps/cares/docs/ares_dns_section_t.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/deps/cares/docs/ares_dns_section_tostr.3 b/deps/cares/docs/ares_dns_section_tostr.3 new file mode 100644 index 00000000000000..4587b9a586ef8e --- /dev/null +++ b/deps/cares/docs/ares_dns_section_tostr.3 @@ -0,0 +1,4 @@ +.\" +.\" Copyright (C) Daniel Stenberg +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_mapping.3 diff --git a/deps/cares/docs/ares_dns_write.3 b/deps/cares/docs/ares_dns_write.3 new file mode 100644 index 00000000000000..4acc581d29789c --- /dev/null +++ b/deps/cares/docs/ares_dns_write.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_record.3 diff --git a/deps/cares/docs/ares_dup.3 b/deps/cares/docs/ares_dup.3 index 879be0e1661ebe..15b81a666c28d7 100644 --- a/deps/cares/docs/ares_dup.3 +++ b/deps/cares/docs/ares_dup.3 @@ -22,7 +22,7 @@ ares_dup \- Duplicate a resolver channel .nf #include -int ares_dup(ares_channel *\fIdest\fP, ares_channel \fIsource\fP) +int ares_dup(ares_channel_t **\fIdest\fP, ares_channel_t *\fIsource\fP) .fi .SH DESCRIPTION The \fBares_dup(3)\fP function duplicates an existing communications channel @@ -31,9 +31,9 @@ set the variable pointed to by \fIdest\fP to a handle used to identify the name service channel. The caller should invoke \fIares_destroy(3)\fP on the handle when the channel is no longer needed. .SH SEE ALSO -.BR ares_destroy(3), -.BR ares_init(3), -.BR ares_library_init(3) +.BR ares_destroy (3), +.BR ares_init (3), +.BR ares_library_init (3) .SH AVAILABILITY \fIares_dup(3)\fP was added in c-ares 1.6.0 .SH AUTHOR diff --git a/deps/cares/docs/ares_expand_name.3 b/deps/cares/docs/ares_expand_name.3 index a4f340e4fca1fb..2f3866bb00fcb6 100644 --- a/deps/cares/docs/ares_expand_name.3 +++ b/deps/cares/docs/ares_expand_name.3 @@ -60,7 +60,8 @@ The encoded domain name was malformed and could not be expanded. .B ARES_ENOMEM Memory was exhausted. .SH SEE ALSO -.BR ares_mkquery (3), ares_free_string (3) +.BR ares_mkquery (3), +.BR ares_free_string (3) .SH AUTHOR Greg Hudson, MIT Information Systems .br diff --git a/deps/cares/docs/ares_fds.3 b/deps/cares/docs/ares_fds.3 index 08731eae0439d8..bbb6b2e8abe0df 100644 --- a/deps/cares/docs/ares_fds.3 +++ b/deps/cares/docs/ares_fds.3 @@ -22,7 +22,7 @@ ares_fds \- return file descriptors to select on .nf #include -int ares_fds(ares_channel \fIchannel\fP, +int ares_fds(ares_channel_t *\fIchannel\fP, fd_set *\fIread_fds\fP, fd_set *\fIwrite_fds\fP) .fi diff --git a/deps/cares/docs/ares_free_data.3 b/deps/cares/docs/ares_free_data.3 index f4159729f3b5a4..67cde08e50ecfa 100644 --- a/deps/cares/docs/ares_free_data.3 +++ b/deps/cares/docs/ares_free_data.3 @@ -27,53 +27,52 @@ void ares_free_data(void *\fIdataptr\fP) .fi .SH DESCRIPTION .PP -The -.B ares_free_data(3) -function frees one or more data structures allocated and returned -by several c-ares functions. Specifically the data returned by the -following list of functions must be deallocated using this function. +The \fBares_free_data(3)\fP function frees one or more data structures +allocated and returned by several c-ares functions. Specifically the data +returned by the following list of functions must be deallocated using this +function. .TP 5 .B ares_get_servers(3) -When used to free the data returned by ares_get_servers(3) this -will free the whole linked list of ares_addr_node structures returned -by ares_get_servers(3). +When used to free the data returned by \fIares_get_servers(3)\fP this will +free the whole linked list of ares_addr_node structures returned by +\fIares_get_servers(3)\fP. .TP .B ares_parse_srv_reply(3) -When used to free the data returned by ares_parse_srv_reply(3) this -will free the whole linked list of ares_srv_reply structures returned -by ares_parse_srv_reply(3), along with any additional storage -associated with those structures. +When used to free the data returned by \fIares_parse_srv_reply(3)\fP this will +free the whole linked list of ares_srv_reply structures returned by +\fIares_parse_srv_reply(3)\fP, along with any additional storage associated +with those structures. .TP .B ares_parse_mx_reply(3) -When used to free the data returned by ares_parse_mx_reply(3) this -will free the whole linked list of ares_mx_reply structures returned -by ares_parse_mx_reply(3), along with any additional storage -associated with those structures. +When used to free the data returned by \fIares_parse_mx_reply(3)\fP this will +free the whole linked list of ares_mx_reply structures returned by +\fIares_parse_mx_reply(3)\fP, along with any additional storage associated +with those structures. .TP .B ares_parse_txt_reply(3) -When used to free the data returned by ares_parse_txt_reply(3) this -will free the whole linked list of ares_txt_reply structures returned -by ares_parse_txt_reply(3), along with any additional storage -associated with those structures. +When used to free the data returned by \fIares_parse_txt_reply(3)\fP this will +free the whole linked list of ares_txt_reply structures returned by +\fIares_parse_txt_reply(3)\fP, along with any additional storage associated +with those structures. .TP .B ares_parse_soa_reply(3) -When used to free the data returned by ares_parse_soa_reply(3) this -will free the ares_soa_reply structure, along with any additional storage +When used to free the data returned by \fIares_parse_soa_reply(3)\fP this will +free the ares_soa_reply structure, along with any additional storage associated with those structure. .B ares_parse_uri_reply(3) -When used to free the data returned by ares_parse_uri_reply(3) this -will free list of ares_uri_reply structures, along with any additional -storage associated with those structure. +When used to free the data returned by \fIares_parse_uri_reply(3)\fP this will +free list of ares_uri_reply structures, along with any additional storage +associated with those structure. .SH RETURN VALUE -The ares_free_data() function does not return a value. +The \fIares_free_data(3)\fP function does not return a value. .SH AVAILABILITY This function was first introduced in c-ares version 1.7.0. .SH SEE ALSO -.BR ares_get_servers(3), -.BR ares_parse_srv_reply(3), -.BR ares_parse_mx_reply(3), -.BR ares_parse_txt_reply(3), -.BR ares_parse_soa_reply(3) +.BR ares_get_servers (3), +.BR ares_parse_srv_reply (3), +.BR ares_parse_mx_reply (3), +.BR ares_parse_txt_reply (3), +.BR ares_parse_soa_reply (3) .SH AUTHOR Yang Tse .PP diff --git a/deps/cares/docs/ares_get_servers.3 b/deps/cares/docs/ares_get_servers.3 index fbd911ea256ae8..a10b473bb6673c 100644 --- a/deps/cares/docs/ares_get_servers.3 +++ b/deps/cares/docs/ares_get_servers.3 @@ -23,10 +23,10 @@ ares_get_servers, ares_get_servers_ports \- Retrieve name servers from an initia .nf #include -int ares_get_servers(ares_channel \fIchannel\fP, +int ares_get_servers(ares_channel_t *\fIchannel\fP, struct ares_addr_node **\fIservers\fP) -int ares_get_servers_ports(ares_channel \fIchannel\fP, +int ares_get_servers_ports(ares_channel_t *\fIchannel\fP, struct ares_addr_port_node **\fIservers\fP) .fi .SH DESCRIPTION diff --git a/deps/cares/docs/ares_getaddrinfo.3 b/deps/cares/docs/ares_getaddrinfo.3 index ea90f9c7f86d77..27585aa3d5426a 100644 --- a/deps/cares/docs/ares_getaddrinfo.3 +++ b/deps/cares/docs/ares_getaddrinfo.3 @@ -26,16 +26,14 @@ typedef void (*ares_addrinfo_callback)(void *\fIarg\fP, int \fIstatus\fP, int \fItimeouts\fP, struct ares_addrinfo *\fIresult\fP) -void ares_getaddrinfo(ares_channel \fIchannel\fP, const char *\fIname\fP, +void ares_getaddrinfo(ares_channel_t *\fIchannel\fP, const char *\fIname\fP, const char* \fIservice\fP, const struct ares_addrinfo_hints *\fIhints\fP, ares_addrinfo_callback \fIcallback\fP, void *\fIarg\fP) .fi .SH DESCRIPTION -The -.B ares_getaddrinfo -function initiates a host query by name on the name service channel -identified by +The \fBares_getaddrinfo(3)\fP function initiates a host query by name on the +name service channel identified by .IR channel . The .I name @@ -93,11 +91,15 @@ Completion or failure of the query may happen immediately, or may happen during a later call to \fIares_process(3)\fP, \fIares_destroy(3)\fP or \fIares_cancel(3)\fP. .PP +If this is called from a thread other than which the main program event loop is +running, care needs to be taken to ensure any file descriptor lists are updated +immediately within the eventloop. When the associated callback is called, +it is called with a channel lock so care must be taken to ensure any processing +is minimal to prevent DNS channel stalls. +.PP The callback argument .I arg -is copied from the -.B ares_getaddrinfo -argument +is copied from the \fBares_getaddrinfo(3)\fP argument .IR arg . The callback argument .I status @@ -119,6 +121,9 @@ was not found. .B ARES_ENOMEM Memory was exhausted. .TP 19 +.B ARES_ESERVICE +The textual service name provided could not be dereferenced into a port. +.TP 19 .B ARES_ECANCELLED The query was cancelled. .TP 19 @@ -183,8 +188,7 @@ struct ares_addrinfo_cname { .EE .RE .PP -The reserved memory has to be deleted by -.B ares_freeaddrinfo. +The reserved memory has to be deleted by \fBares_freeaddrinfo(3)\fP. The result is sorted according to RFC6724 except: - Rule 3 (Avoid deprecated addresses) diff --git a/deps/cares/docs/ares_gethostbyaddr.3 b/deps/cares/docs/ares_gethostbyaddr.3 index eaeb58d5db9ed5..4a250505281661 100644 --- a/deps/cares/docs/ares_gethostbyaddr.3 +++ b/deps/cares/docs/ares_gethostbyaddr.3 @@ -26,7 +26,7 @@ typedef void (*ares_host_callback)(void *\fIarg\fP, int \fIstatus\fP, int \fItimeouts\fP, struct hostent *\fIhostent\fP) -void ares_gethostbyaddr(ares_channel \fIchannel\fP, const void *\fIaddr\fP, +void ares_gethostbyaddr(ares_channel_t *\fIchannel\fP, const void *\fIaddr\fP, int \fIaddrlen\fP, int \fIfamily\fP, ares_host_callback \fIcallback\fP, void *\fIarg\fP) .fi @@ -98,6 +98,12 @@ did not complete successfully, .I hostent will be .BR NULL . +.PP +If this is called from a thread other than which the main program event loop is +running, care needs to be taken to ensure any file descriptor lists are updated +immediately within the eventloop. When the associated callback is called, +it is called with a channel lock so care must be taken to ensure any processing +is minimal to prevent DNS channel stalls. .SH SEE ALSO .BR ares_process (3), .BR ares_gethostbyname (3) diff --git a/deps/cares/docs/ares_gethostbyname.3 b/deps/cares/docs/ares_gethostbyname.3 index b3614eb43c9a23..e6d302d0c7fdf2 100644 --- a/deps/cares/docs/ares_gethostbyname.3 +++ b/deps/cares/docs/ares_gethostbyname.3 @@ -26,7 +26,7 @@ typedef void (*ares_host_callback)(void *\fIarg\fP, int \fIstatus\fP, int \fItimeouts\fP, struct hostent *\fIhostent\fP) -void ares_gethostbyname(ares_channel \fIchannel\fP, const char *\fIname\fP, +void ares_gethostbyname(ares_channel_t *\fIchannel\fP, const char *\fIname\fP, int \fIfamily\fP, ares_host_callback \fIcallback\fP, void *\fIarg\fP) .fi @@ -106,6 +106,12 @@ did not complete successfully, .I hostent will be .BR NULL . +.PP +If this is called from a thread other than which the main program event loop is +running, care needs to be taken to ensure any file descriptor lists are updated +immediately within the eventloop. When the associated callback is called, +it is called with a channel lock so care must be taken to ensure any processing +is minimal to prevent DNS channel stalls. .SH SEE ALSO .BR ares_process (3), .BR ares_gethostbyaddr (3) diff --git a/deps/cares/docs/ares_gethostbyname_file.3 b/deps/cares/docs/ares_gethostbyname_file.3 index 5bbb28a8fedfc3..06a21b50c1b08e 100644 --- a/deps/cares/docs/ares_gethostbyname_file.3 +++ b/deps/cares/docs/ares_gethostbyname_file.3 @@ -22,7 +22,7 @@ ares_gethostbyname_file \- Lookup a name in the system's hosts file .nf #include -int ares_gethostbyname_file(ares_channel \fIchannel\fP, const char *\fIname\fP, +int ares_gethostbyname_file(ares_channel_t *\fIchannel\fP, const char *\fIname\fP, int \fIfamily\fP, struct hostent **host) .fi .SH DESCRIPTION diff --git a/deps/cares/docs/ares_getnameinfo.3 b/deps/cares/docs/ares_getnameinfo.3 index bde3e800e46738..c941a68f655906 100644 --- a/deps/cares/docs/ares_getnameinfo.3 +++ b/deps/cares/docs/ares_getnameinfo.3 @@ -26,7 +26,7 @@ typedef void (*ares_nameinfo_callback)(void *\fIarg\fP, int \fIstatus\fP, int \fItimeouts\fP, char *\fInode\fP, char *\fIservice\fP) -void ares_getnameinfo(ares_channel \fIchannel\fP, const struct sockaddr *\fIsa\fP, +void ares_getnameinfo(ares_channel_t *\fIchannel\fP, const struct sockaddr *\fIsa\fP, ares_socklen_t \fIsalen\fP, int \fIflags\fP, ares_nameinfo_callback \fIcallback\fP, void *\fIarg\fP) .fi @@ -86,6 +86,12 @@ failed, the ares library will invoke \fIcallback\fP. Completion or failure of the query may happen immediately, or may happen during a later call to \fIares_process(3)\fP, \fIares_destroy(3)\fP or \fIares_cancel(3)\fP. .PP +If this is called from a thread other than which the main program event loop is +running, care needs to be taken to ensure any file descriptor lists are updated +immediately within the eventloop. When the associated callback is called, +it is called with a channel lock so care must be taken to ensure any processing +is minimal to prevent DNS channel stalls. +.PP The callback argument .I arg is copied from the diff --git a/deps/cares/docs/ares_getsock.3 b/deps/cares/docs/ares_getsock.3 index c502e483500500..1079d85d7a9fbd 100644 --- a/deps/cares/docs/ares_getsock.3 +++ b/deps/cares/docs/ares_getsock.3 @@ -22,7 +22,7 @@ ares_getsock \- get socket descriptors to wait on .nf #include -int ares_getsock(ares_channel \fIchannel\fP, ares_socket_t *\fIsocks\fP, +int ares_getsock(ares_channel_t *\fIchannel\fP, ares_socket_t *\fIsocks\fP, int \fInumsocks\fP); .fi .SH DESCRIPTION diff --git a/deps/cares/docs/ares_inet_ntop.3 b/deps/cares/docs/ares_inet_ntop.3 index 68d1db9b95cd39..83306a1a12e5db 100644 --- a/deps/cares/docs/ares_inet_ntop.3 +++ b/deps/cares/docs/ares_inet_ntop.3 @@ -40,8 +40,8 @@ the size of this buffer, which shall be large enough to hold the text string (INET_ADDRSTRLEN (16) characters for IPv4, INET6_ADDRSTRLEN (46) characters for IPv6). .SH SEE ALSO -.BR ares_init(3), -.BR ares_inet_pton(3) +.BR ares_init (3), +.BR ares_inet_pton (3) .SH AVAILABILITY made properly publicly available in c-ares for real in version 1.10.0 .SH AUTHOR diff --git a/deps/cares/docs/ares_inet_pton.3 b/deps/cares/docs/ares_inet_pton.3 index 21c4eacdab6414..d727533cff7944 100644 --- a/deps/cares/docs/ares_inet_pton.3 +++ b/deps/cares/docs/ares_inet_pton.3 @@ -36,8 +36,8 @@ in. The \fBdst\fP argument points to a buffer into which the function stores the numeric address; this shall be large enough to hold the numeric address (32 bits for AF_INET, 128 bits for AF_INET6). .SH SEE ALSO -.BR ares_init(3), -.BR ares_inet_ntop(3) +.BR ares_init (3), +.BR ares_inet_ntop (3) .SH AVAILABILITY made properly publicly available in c-ares for real in version 1.10.0 .SH AUTHOR diff --git a/deps/cares/docs/ares_init.3 b/deps/cares/docs/ares_init.3 index d68e2241f4ee2e..6f81734ce3c0d8 100644 --- a/deps/cares/docs/ares_init.3 +++ b/deps/cares/docs/ares_init.3 @@ -1,83 +1,3 @@ -.\" -.\" Copyright 1998 by the Massachusetts Institute of Technology. -.\" Copyright (C) 2004-2010 by Daniel Stenberg -.\" -.\" 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. -.\" +.\" Copyright (C) 2023 The c-ares project and its contributors. .\" SPDX-License-Identifier: MIT -.\" -.TH ARES_INIT 3 "5 March 2010" -.SH NAME -ares_init \- Initialize a resolver channel -.SH SYNOPSIS -.nf -#include - -int ares_init(ares_channel *\fIchannelptr\fP) -.fi -.SH DESCRIPTION -The \fBares_init(3)\fP function initializes a communications channel for name -service lookups. If it returns successfully, \fBares_init(3)\fP will set the -variable pointed to by \fIchannelptr\fP to a handle used to identify the name -service channel. The caller should invoke \fIares_destroy(3)\fP on the handle -when the channel is no longer needed. - -The \fIares_init_options(3)\fP function is provide to offer more init -alternatives. -.SH RETURN VALUES -\fIares_init(3)\fP can return any of the following values: -.TP 14 -.B ARES_SUCCESS -Initialization succeeded. -.TP 14 -.B ARES_EFILE -A configuration file could not be read. -.TP 14 -.B ARES_ENOMEM -The process's available memory was exhausted. -.TP 14 -.B ARES_ENOTINITIALIZED -c-ares library initialization not yet performed. -.SH NOTES -When initializing from -.B /etc/resolv.conf, -.BR ares_init (3) -reads the -.I domain -and -.I search -directives to allow lookups of short names relative to the domains -specified. The -.I domain -and -.I search -directives override one another. If more that one instance of either -.I domain -or -.I search -directives is specified, the last occurrence wins. For more information, -please see the -.BR resolv.conf (5) -manual page. -.SH SEE ALSO -.BR ares_init_options(3), -.BR ares_destroy(3), -.BR ares_dup(3), -.BR ares_library_init(3), -.BR ares_set_servers(3) -.SH AUTHOR -Greg Hudson, MIT Information Systems -.br -Copyright 1998 by the Massachusetts Institute of Technology. -.br -Copyright (C) 2004-2010 by Daniel Stenberg. +.so man3/ares_init_options.3 diff --git a/deps/cares/docs/ares_init_options.3 b/deps/cares/docs/ares_init_options.3 index 2fc14c569a9dd0..942c1462783063 100644 --- a/deps/cares/docs/ares_init_options.3 +++ b/deps/cares/docs/ares_init_options.3 @@ -2,23 +2,11 @@ .\" Copyright 1998 by the Massachusetts Institute of Technology. .\" Copyright (C) 2004-2010 by Daniel Stenberg .\" -.\" 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. -.\" .\" SPDX-License-Identifier: MIT .\" -.TH ARES_INIT 3 "5 March 2010" +.TH ARES_INIT_OPTIONS 3 "5 March 2010" .SH NAME -ares_init_options \- Initialize a resolver channel +ares_init_options, ares_init \- Initialize a resolver channel .SH SYNOPSIS .nf #include @@ -45,13 +33,23 @@ struct ares_options { char *resolvconf_path; char *hosts_path; int udp_max_queries; + int maxtimeout; /* in milliseconds */ + unsigned int qcache_max_ttl; /* in seconds */ }; -int ares_init_options(ares_channel *\fIchannelptr\fP, - struct ares_options *\fIoptions\fP, - int \fIoptmask\fP) +int ares_init_options(ares_channel_t **\fIchannelptr\fP, + const struct ares_options *\fIoptions\fP, + int \fIoptmask\fP); + +int ares_init(ares_channel_t **\fIchannelptr\fP); + .fi .SH DESCRIPTION +The \fBares_init(3)\fP function is equivalent to calling +\fBares_init_options(NULL, 0)\fP. It is recommended to use +\fBares_init_options(3)\fP instead and to set or make configurable the +appropriate options for your application. + The \fBares_init_options(3)\fP function initializes a communications channel for name service lookups. If it returns successfully, \fBares_init_options(3)\fP will set the variable pointed to by @@ -59,14 +57,69 @@ for name service lookups. If it returns successfully, caller should invoke \fIares_destroy(3)\fP on the handle when the channel is no longer needed. +It is recommended for an application to have at most one ares channel and use +this for all DNS queries for the life of the application. When system +configuration changes, \fIares_reinit(3)\fP can be called to reload the +configuration if necessary. The recommended concurrent query limit is about +32k queries, but remembering that when specifying AF_UNSPEC for +\fBares_getaddrinfo(3)\fP or \fBares_gethostbyname(3)\fP, they may spawn +2 queries internally. The reason for the limit is c-ares does not allow +duplicate DNS query ids (which have a maximum of 64k) to be oustanding at a +given time, and it must randomly search for an available id thus 32k will limit +the number of searches. This limitation should not be a concern for most +implementations and c-ares may implement queuing in future releases to lift this +limitation. + The \fIoptmask\fP parameter generally specifies which fields in the structure pointed to by \fIoptions\fP are set, as follows: .TP 18 .B ARES_OPT_FLAGS .B int \fIflags\fP; .br -Flags controlling the behavior of the resolver. See below for a -description of possible flag values. +Flags controlling the behavior of the resolver: +.RS 4 +.TP 23 +.B ARES_FLAG_USEVC +Always use TCP queries (the "virtual circuit") instead of UDP +queries. Normally, TCP is only used if a UDP query yields a truncated +result. +.TP 23 +.B ARES_FLAG_PRIMARY +Only query the first server in the list of servers to query. +.TP 23 +.B ARES_FLAG_IGNTC +If a truncated response to a UDP query is received, do not fall back +to TCP; simply continue on with the truncated response. +.TP 23 +.B ARES_FLAG_NORECURSE +Do not set the "recursion desired" bit on outgoing queries, so that the name +server being contacted will not try to fetch the answer from other servers if +it doesn't know the answer locally. Be aware that ares will not do the +recursion for you. Recursion must be handled by the application calling ares +if \fIARES_FLAG_NORECURSE\fP is set. +.TP 23 +.B ARES_FLAG_STAYOPEN +Do not close communications sockets when the number of active queries +drops to zero. +.TP 23 +.B ARES_FLAG_NOSEARCH +Do not use the default search domains; only query hostnames as-is or +as aliases. +.TP 23 +.B ARES_FLAG_NOALIASES +Do not honor the HOSTALIASES environment variable, which normally +specifies a file of hostname translations. +.TP 23 +.B ARES_FLAG_NOCHECKRESP +Do not discard responses with the SERVFAIL, NOTIMP, or REFUSED +response code or responses whose questions don't match the questions +in the request. Primarily useful for writing clients which might be +used to test or debug name servers. +.TP 23 +.B ARES_FLAG_EDNS +Include an EDNS pseudo-resource record (RFC 2671) in generated requests. As of +v1.22, this is on by default if flags are otherwise not set. +.RE .TP 18 .B ARES_OPT_TIMEOUT .B int \fItimeout\fP; @@ -102,6 +155,13 @@ queried for "as is" prior to querying for it with the default domain extensions appended. The default value is 1 unless set otherwise by resolv.conf or the RES_OPTIONS environment variable. .TP 18 +.B ARES_OPT_MAXTIMEOUTMS +.B int \fImaxtimeout\fP; +.br +The upper bound for timeout between sequential retry attempts. When retrying +queries, the timeout is increased from the requested timeout parameter, this +caps the value. +.TP 18 .B ARES_OPT_UDP_PORT .B unsigned short \fIudp_port\fP; .br @@ -120,10 +180,9 @@ The default value is 53, the standard name service port. .B int \fInservers\fP; .br The list of IPv4 servers to contact, instead of the servers specified in -resolv.conf or the local named. In order to allow specification of either -IPv4 or IPv6 name servers, the -.BR ares_set_servers(3) -function must be used instead. +resolv.conf or the local named. In order to allow specification of either IPv4 +or IPv6 name servers, the \Bares_set_servers(3)\fP function must be used +instead. .TP 18 .B ARES_OPT_DOMAINS .B char **\fIdomains\fP; @@ -184,9 +243,9 @@ The receive buffer size to set for the socket. .B ARES_OPT_EDNSPSZ .B int \fIednspsz\fP; .br -The message size to be advertized in EDNS; only takes effect if the +The message size to be advertised in EDNS; only takes effect if the .B ARES_FLAG_EDNS -flag is set. +flag is set. Defaults to 1280, the recommended size. .TP 18 .B ARES_OPT_RESOLVCONF .B char *\fIresolvconf_path\fP; @@ -215,6 +274,18 @@ The maximum number of udp queries that can be sent on a single ephemeral port to a given DNS server before a new ephemeral port is assigned. Any value of 0 or less will be considered unlimited, and is the default. .br +.TP 18 +.B ARES_OPT_QUERY_CACHE +.B unsigned int \fIqcache_max_ttl\fP; +.br +Enable the built-in query cache. Will cache queries based on the returned TTL +in the DNS message. Only fully successful and NXDOMAIN query results will be +cached. Fill in the \fIqcache_max_ttl\fP with the maximum number of seconds +a query result may be cached which will override a larger TTL in the response +message. This must be a non-zero value otherwise the cache will be disabled. +Choose a reasonable value for your application such as 300 (5 minutes) or +3600 (1 hour). +.br .PP The \fIoptmask\fP parameter also includes options without a corresponding field in the @@ -229,51 +300,10 @@ for each resolution. Do not perform round-robin nameserver selection; always use the list of nameservers in the same order. .PP -The -.I flags -field should be the bitwise or of some subset of the following values: -.TP 23 -.B ARES_FLAG_USEVC -Always use TCP queries (the "virtual circuit") instead of UDP -queries. Normally, TCP is only used if a UDP query yields a truncated -result. -.TP 23 -.B ARES_FLAG_PRIMARY -Only query the first server in the list of servers to query. -.TP 23 -.B ARES_FLAG_IGNTC -If a truncated response to a UDP query is received, do not fall back -to TCP; simply continue on with the truncated response. -.TP 23 -.B ARES_FLAG_NORECURSE -Do not set the "recursion desired" bit on outgoing queries, so that the name -server being contacted will not try to fetch the answer from other servers if -it doesn't know the answer locally. Be aware that ares will not do the -recursion for you. Recursion must be handled by the application calling ares -if \fIARES_FLAG_NORECURSE\fP is set. -.TP 23 -.B ARES_FLAG_STAYOPEN -Do not close communications sockets when the number of active queries -drops to zero. -.TP 23 -.B ARES_FLAG_NOSEARCH -Do not use the default search domains; only query hostnames as-is or -as aliases. -.TP 23 -.B ARES_FLAG_NOALIASES -Do not honor the HOSTALIASES environment variable, which normally -specifies a file of hostname translations. -.TP 23 -.B ARES_FLAG_NOCHECKRESP -Do not discard responses with the SERVFAIL, NOTIMP, or REFUSED -response code or responses whose questions don't match the questions -in the request. Primarily useful for writing clients which might be -used to test or debug name servers. -.TP 23 -.B ARES_FLAG_EDNS -Include an EDNS pseudo-resource record (RFC 2671) in generated requests. + .SH RETURN VALUES -\fBares_init_options(3)\fP can return any of the following values: +\fBares_init_options(3)\fP and \fBares_init(3)\fP can return any of the +following values: .TP 14 .B ARES_SUCCESS Initialization succeeded. @@ -292,21 +322,22 @@ When initializing from (or, alternatively when specified by the .I resolvconf_path path location) -\fBares_init_options(3)\fP reads the \fIdomain\fP and \fIsearch\fP directives -to allow lookups of short names relative to the domains specified. The -\fIdomain\fP and \fIsearch\fP directives override one another. If more than -one instance of either \fIdomain\fP or \fIsearch\fP directives is specified, -the last occurrence wins. For more information, please see the +\fBares_init_options(3)\fP and \fBares_init(3)\fP reads the \fIdomain\fP and +\fIsearch\fP directives to allow lookups of short names relative to the domains +specified. The \fIdomain\fP and \fIsearch\fP directives override one another. +If more than one instance of either \fIdomain\fP or \fIsearch\fP directives is +specified, the last occurrence wins. For more information, please see the .BR resolv.conf (5) manual page. .SH SEE ALSO -.BR ares_init(3), -.BR ares_destroy(3), -.BR ares_dup(3), -.BR ares_library_init(3), -.BR ares_save_options(3), -.BR ares_set_servers(3), -.BR ares_set_sortlist(3) +.BR ares_reinit (3), +.BR ares_destroy (3), +.BR ares_dup (3), +.BR ares_library_init (3), +.BR ares_save_options (3), +.BR ares_set_servers (3), +.BR ares_set_sortlist (3), +.BR ares_threadsafety (3) .SH AUTHOR Greg Hudson, MIT Information Systems .br diff --git a/deps/cares/docs/ares_library_cleanup.3 b/deps/cares/docs/ares_library_cleanup.3 index 1af89d78d3f002..d6d76959b9d845 100644 --- a/deps/cares/docs/ares_library_cleanup.3 +++ b/deps/cares/docs/ares_library_cleanup.3 @@ -63,11 +63,10 @@ the DllMain function. Doing so will produce deadlocks and other problems. This function was first introduced in c-ares version 1.7.0 along with the definition of preprocessor symbol \fICARES_HAVE_ARES_LIBRARY_CLEANUP\fP as an indication of the availability of this function. Reference counting in -\fIares_library_init()\fP and \fIares_library_cleanup()\fP, which requires +\fIares_library_init(3)\fP and \fIares_library_cleanup(3)\fP, which requires calls to the former function to match calls to the latter, is present since -c-ares version 1.10.0. -Earlier versions would deinitialize the library on the first call -to \fIares_library_cleanup()\fP. +c-ares version 1.10.0. Earlier versions would deinitialize the library on the +first call to \fIares_library_cleanup(3)\fP. .PP Since the introduction of this function, it is absolutely mandatory to call it for any Win32/64 program using c-ares. @@ -76,8 +75,8 @@ Non-Win32/64 systems can still use c-ares version 1.7.0 without calling \fIares_library_cleanup(3)\fP due to the fact that \fIcurrently\fP it is nearly a do-nothing function on non-Win32/64 platforms. .SH SEE ALSO -.BR ares_library_init(3), -.BR ares_cancel(3) +.BR ares_library_init (3), +.BR ares_cancel (3) .SH AUTHOR Yang Tse .PP diff --git a/deps/cares/docs/ares_library_init.3 b/deps/cares/docs/ares_library_init.3 index 286702da56f8c0..2f61ce2fcf8844 100644 --- a/deps/cares/docs/ares_library_init.3 +++ b/deps/cares/docs/ares_library_init.3 @@ -87,18 +87,18 @@ as there are no currently dynamically loaded libraries. .B ARES_LIB_INIT_NONE Initialize nothing extra. This sets no bit. .SH RETURN VALUE -Upon successful completion, ares_library_init() will return 0. Otherwise, a -non-zero error number will be returned to indicate the error. Except for +Upon successful completion, \fIares_library_init(3)\fP returns 0. Otherwise, +a non-zero error number is returned to indicate the error. Except for \fIares_strerror(3)\fP, you shall not call any other c-ares function upon \fIares_library_init(3)\fP failure. .SH AVAILABILITY This function was first introduced in c-ares version 1.7.0 along with the definition of preprocessor symbol \fICARES_HAVE_ARES_LIBRARY_INIT\fP as an -indication of the availability of this function. Its recursive behavior, -which requires a matching number of calls to \fIares_library_cleanup()\fP -in order to deinitialize the library, is present since c-ares version -1.10.0. Earlier versions would deinitialize the library on the first call -to \fIares_library_cleanup()\fP. +indication of the availability of this function. Its recursive behavior, which +requires a matching number of calls to \fIares_library_cleanup(3)\fP in order +to deinitialize the library, is present since c-ares version 1.10.0. Earlier +versions would deinitialize the library on the first call to +\fIares_library_cleanup(3)\fP. .PP Since the introduction of this function it is absolutely mandatory to call it for any Win32/64 program using c-ares. @@ -107,8 +107,8 @@ Non-Win32/64 systems can still use c-ares version 1.7.0 without calling \fIares_library_init(3)\fP due to the fact that \fIcurrently\fP it is nearly a do-nothing function on non-Win32/64 platforms at this point. .SH SEE ALSO -.BR ares_library_cleanup(3), -.BR ares_strerror(3) +.BR ares_library_cleanup (3), +.BR ares_strerror (3) .SH AUTHOR Yang Tse .PP diff --git a/deps/cares/docs/ares_library_init_android.3 b/deps/cares/docs/ares_library_init_android.3 index 51ec20d5bd7948..5c8bb7537f7937 100644 --- a/deps/cares/docs/ares_library_init_android.3 +++ b/deps/cares/docs/ares_library_init_android.3 @@ -53,7 +53,7 @@ Deinitialization will take place though \fIares_library_cleanup(3)\fP. The \fBares_library_init_jvm\fP function allows the caller to register the JVM with c-ares. It's meant to be called during JNI_OnLoad because you're guaranteed to have the JVM in that function. The JVM is required in order to -use the Connectivty Manager registered using +use the Connectivity Manager registered using \fIares_library_init_android(3)\fP. This must be call before \fIares_library_init_android(3)\fP. @@ -117,7 +117,7 @@ Calling the registered function from Java: } .fi Initializing the Connectivity Manager in JNI directly using an Android -Context. It is assumed the JVM has aleady been registered through +Context. It is assumed the JVM has already been registered through \fIJNI_OnLoad\fP. .nf void initialize(jobject android_context) @@ -135,8 +135,8 @@ Context. It is assumed the JVM has aleady been registered through .SH AVAILABILITY This function was first introduced in c-ares version 1.15.0. .SH SEE ALSO -.BR ares_library_init(3), -.BR ares_library_cleanup(3), +.BR ares_library_init (3), +.BR ares_library_cleanup (3), .SH AUTHOR John Schember .PP diff --git a/deps/cares/docs/ares_library_initialized.3 b/deps/cares/docs/ares_library_initialized.3 index c9baad37e1962d..8ddc14539a190b 100644 --- a/deps/cares/docs/ares_library_initialized.3 +++ b/deps/cares/docs/ares_library_initialized.3 @@ -32,5 +32,5 @@ initialization is needed. .SH AVAILABILITY This function was first introduced in c-ares version 1.11.0 .SH SEE ALSO -.BR ares_library_init(3), -.BR ares_library_cleanup(3) +.BR ares_library_init (3), +.BR ares_library_cleanup (3) diff --git a/deps/cares/docs/ares_mkquery.3 b/deps/cares/docs/ares_mkquery.3 index c8788433246a78..9b9aa807176a5f 100644 --- a/deps/cares/docs/ares_mkquery.3 +++ b/deps/cares/docs/ares_mkquery.3 @@ -84,6 +84,7 @@ characters. Memory was exhausted. .SH SEE ALSO .BR ares_expand_name (3), +.BR ares_dns_record (3), .BR ares_free_string (3) .SH AUTHOR Greg Hudson, MIT Information Systems diff --git a/deps/cares/docs/ares_opt_param_t.3 b/deps/cares/docs/ares_opt_param_t.3 new file mode 100644 index 00000000000000..4587b9a586ef8e --- /dev/null +++ b/deps/cares/docs/ares_opt_param_t.3 @@ -0,0 +1,4 @@ +.\" +.\" Copyright (C) Daniel Stenberg +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_mapping.3 diff --git a/deps/cares/docs/ares_parse_caa_reply.3 b/deps/cares/docs/ares_parse_caa_reply.3 index f99fb26496c22d..ef95769fcc235b 100644 --- a/deps/cares/docs/ares_parse_caa_reply.3 +++ b/deps/cares/docs/ares_parse_caa_reply.3 @@ -114,7 +114,7 @@ static void dns_callback(void *arg, ares_free_data (caa_out); } -static void main_loop(ares_channel *channel) +static void main_loop(ares_channel_t **channel) { int nfds, count; fd_set readers, writers; @@ -145,7 +145,7 @@ int main(int argc, char **argv) if (argc > 1) domain = argv[1]; - ares_channel channel; + ares_channel_t *channel; if ((err = ares_init (&channel)) != ARES_SUCCESS) { printf ("ares_init() failed (%i)\\n", err); diff --git a/deps/cares/docs/ares_parse_mx_reply.3 b/deps/cares/docs/ares_parse_mx_reply.3 index 05e6cc4e9bbf2c..851380ad7ef90c 100644 --- a/deps/cares/docs/ares_parse_mx_reply.3 +++ b/deps/cares/docs/ares_parse_mx_reply.3 @@ -40,7 +40,7 @@ memory and a pointer to it stored into the variable pointed to by It is the caller's responsibility to free the resulting .IR mx_out structure when it is no longer needed using the function -.B ares_free_data +\fBares_free_data(3)\fP. .PP The structure .I ares_mx_reply diff --git a/deps/cares/docs/ares_parse_naptr_reply.3 b/deps/cares/docs/ares_parse_naptr_reply.3 index 5cefa2604fd936..b5ef19c508fee2 100644 --- a/deps/cares/docs/ares_parse_naptr_reply.3 +++ b/deps/cares/docs/ares_parse_naptr_reply.3 @@ -41,7 +41,7 @@ memory and a pointer to it stored into the variable pointed to by It is the caller's responsibility to free the resulting .IR naptr_out structure when it is no longer needed using the function -.B ares_free_data +\fBares_free_data(3)\fP. .PP The structure .I ares_naptr_reply diff --git a/deps/cares/docs/ares_parse_soa_reply.3 b/deps/cares/docs/ares_parse_soa_reply.3 index 04d70fa79a39fd..f816126ff554e0 100644 --- a/deps/cares/docs/ares_parse_soa_reply.3 +++ b/deps/cares/docs/ares_parse_soa_reply.3 @@ -40,7 +40,7 @@ memory and a pointer to it stored into the variable pointed to by It is the caller's responsibility to free the resulting .IR soa_out structure when it is no longer needed using the function -.B ares_free_data +\fBares_free_data(3)\fP. .PP The structure .I ares_soa_reply diff --git a/deps/cares/docs/ares_parse_srv_reply.3 b/deps/cares/docs/ares_parse_srv_reply.3 index 1a04b6282d4274..d16f0d8a4ee458 100644 --- a/deps/cares/docs/ares_parse_srv_reply.3 +++ b/deps/cares/docs/ares_parse_srv_reply.3 @@ -41,7 +41,7 @@ memory and a pointer to it stored into the variable pointed to by It is the caller's responsibility to free the resulting .IR srv_out structure when it is no longer needed using the function -.B ares_free_data +\fBares_free_data(3)\fP. .PP The structure .I ares_srv_reply diff --git a/deps/cares/docs/ares_parse_txt_reply.3 b/deps/cares/docs/ares_parse_txt_reply.3 index e4d7aa736ec799..22807facf5d8bf 100644 --- a/deps/cares/docs/ares_parse_txt_reply.3 +++ b/deps/cares/docs/ares_parse_txt_reply.3 @@ -29,10 +29,9 @@ int ares_parse_txt_reply_ext(const unsigned char* \fIabuf\fP, int \fIalen\fP, struct ares_txt_ext **\fItxt_out\fP); .fi .SH DESCRIPTION -The -.BR "ares_parse_txt_reply" " (" "ares_parse_txt_reply_ext" ")" -function parses the response to a query of type TXT into a -linked list (one element per sub-string) of +The \fIares_parse_txt_reply(3)\fP and \fIares_parse_txt_reply_ext(3)\fP +functions parse the response to a query of type TXT into a linked list (one +element per sub-string) of .IR "struct ares_txt_reply" " (" "struct ares_txt_ext" ")" The parameters .I abuf @@ -44,13 +43,11 @@ memory and a pointer to it stored into the variable pointed to by It is the caller's responsibility to free the resulting .IR txt_out structure when it is no longer needed using the function -.B ares_free_data -.PP +\fBares_free_data(3)\fP. + The structure .I ares_txt_reply contains the following fields: -.sp -.in +4n .nf struct ares_txt_reply { struct ares_txt_reply *next; @@ -58,13 +55,10 @@ struct ares_txt_reply { unsigned char *txt; }; .fi -.in -.PP + The structure .I ares_txt_ext contains the following fields: -.sp -.in +4n .nf struct ares_txt_ext { struct ares_txt_ext *next; @@ -73,8 +67,6 @@ struct ares_txt_ext { unsigned char record_start; }; .fi -.in -.PP The .I record_start field in @@ -87,7 +79,7 @@ will have at least one item with equal to 1, and may have some items with .I record_start equal to 0 between them. -.PP + These sequences of .I struct ares_txt_ext (starting from the item with @@ -95,7 +87,6 @@ These sequences of equal to 1, and ending right before the record start item) may be treated as either components of a single TXT record or as a multi-parted TXT record, depending on particular use case. -.PP .SH RETURN VALUES .BR "ares_parse_txt_reply" " (" "ares_parse_txt_reply_ext" ")" can return any of the following values: diff --git a/deps/cares/docs/ares_parse_uri_reply.3 b/deps/cares/docs/ares_parse_uri_reply.3 index 2c2268c1c51ee6..d2ec037bdae9d9 100644 --- a/deps/cares/docs/ares_parse_uri_reply.3 +++ b/deps/cares/docs/ares_parse_uri_reply.3 @@ -26,10 +26,8 @@ int ares_parse_uri_reply(const unsigned char* \fIabuf\fP, int \fIalen\fP, struct ares_uri_reply** \fIuri_out\fP); .fi .SH DESCRIPTION -The -.B ares_parse_uri_reply -function parses the response to a query of type URI into a -linked list of +The \fIares_parse_uri_reply(3)\fP function parses the response to a query of +type URI into a linked list of .I struct ares_uri_reply The parameters .I abuf @@ -41,13 +39,11 @@ memory and a pointer to it stored into the variable pointed to by It is the caller's responsibility to free the resulting .IR uri_out structure when it is no longer needed using the function -.B ares_free_data -.PP +\fBares_free_data(3)\fP. + The structure .I ares_uri_reply contains the following fields: -.sp -.in +4n .nf struct ares_uri_reply { struct ares_uri_reply *next; @@ -57,8 +53,6 @@ struct ares_uri_reply { int ttl; }; .fi -.in -.PP .SH RETURN VALUES .B ares_parse_uri_reply can return any of the following values: diff --git a/deps/cares/docs/ares_process.3 b/deps/cares/docs/ares_process.3 index 4f6ec981259f6f..c4d118c1f58e16 100644 --- a/deps/cares/docs/ares_process.3 +++ b/deps/cares/docs/ares_process.3 @@ -22,11 +22,11 @@ ares_process \- Process events for name resolution .nf #include -void ares_process(ares_channel \fIchannel\fP, +void ares_process(ares_channel_t *\fIchannel\fP, fd_set *\fIread_fds\fP, fd_set *\fIwrite_fds\fP) -void ares_process_fd(ares_channel \fIchannel\fP, +void ares_process_fd(ares_channel_t *\fIchannel\fP, ares_socket_t \fIread_fd\fP, ares_socket_t \fIwrite_fd\fP) .fi diff --git a/deps/cares/docs/ares_query.3 b/deps/cares/docs/ares_query.3 index aa40f850ad524a..f87a5648222812 100644 --- a/deps/cares/docs/ares_query.3 +++ b/deps/cares/docs/ares_query.3 @@ -26,7 +26,7 @@ typedef void (*ares_callback)(void *\fIarg\fP, int \fIstatus\fP, int \fItimeouts\fP, unsigned char *\fIabuf\fP, int \fIalen\fP) -void ares_query(ares_channel \fIchannel\fP, const char *\fIname\fP, +void ares_query(ares_channel_t *\fIchannel\fP, const char *\fIname\fP, int \fIdnsclass\fP, int \fItype\fP, ares_callback \fIcallback\fP, void *\fIarg\fP) .fi @@ -54,6 +54,12 @@ happen during a later call to or .BR ares_destroy (3). .PP +If this is called from a thread other than which the main program event loop is +running, care needs to be taken to ensure any file descriptor lists are updated +immediately within the eventloop. When the associated callback is called, +it is called with a channel lock so care must be taken to ensure any processing +is minimal to prevent DNS channel stalls. +.PP The callback argument .I arg is copied from the diff --git a/deps/cares/docs/ares_reinit.3 b/deps/cares/docs/ares_reinit.3 new file mode 100644 index 00000000000000..0b037127990293 --- /dev/null +++ b/deps/cares/docs/ares_reinit.3 @@ -0,0 +1,51 @@ +.\" +.\" SPDX-License-Identifier: MIT +.\" +.TH ARES_REINIT 3 "12 November 2023" +.SH NAME +ares_reinit \- ReInitialize a resolver channel from system configuration. +.SH SYNOPSIS +.nf +#include + +int ares_reinit(ares_channel_t *\fIchannel\fP) +.fi +.SH DESCRIPTION +The \fBares_reinit(3)\fP function re-reads the system configuration and safely +applies the configuration to the existing channel. System configuration will +never override user-provided settings such as provided via +\fBares_init_options(3)\fP or \fBares_set_servers(3)\fP. + +Any existing queries will be automatically requeued if the server they are +currently assigned to is removed from the system configuration. + +This function may cause additional file descriptors to be created, and existing +ones to be destroyed if server configuration has changed. If this is called from +a thread other than which the main program event loop is running, care needs to +be taken to ensure any file descriptor lists are updated immediately within +the eventloop. + +.SH RETURN VALUES +\fIares_reinit(3)\fP can return any of the following values: +.TP 14 +.B ARES_SUCCESS +Initialization succeeded. +.TP 14 +.B ARES_EFILE +A configuration file could not be read. +.TP 14 +.B ARES_ENOMEM +The process's available memory was exhausted. + +.SH AVAILABILITY +This function was first introduced in c-ares version 1.22.0. +.SH SEE ALSO +.BR ares_init (3), +.BR ares_init_options (3), +.BR ares_destroy (3), +.BR ares_dup (3), +.BR ares_library_init (3), +.BR ares_set_servers (3), +.BR ares_threadsafety (3) +.SH AUTHOR +Copyright (C) 2023 The c-ares project and its members. diff --git a/deps/cares/docs/ares_save_options.3 b/deps/cares/docs/ares_save_options.3 index 308eb395f83f83..7beecd52770278 100644 --- a/deps/cares/docs/ares_save_options.3 +++ b/deps/cares/docs/ares_save_options.3 @@ -22,7 +22,7 @@ ares_save_options \- Save configuration values obtained from initialized ares_ch .nf #include -int ares_save_options(ares_channel \fIchannel\fP, +int ares_save_options(ares_channel_t *\fIchannel\fP, struct ares_options *\fIoptions\fP, int *\fIoptmask\fP) .fi .SH DESCRIPTION @@ -60,9 +60,9 @@ this config struct, which may no longer be the complete set of config options. \fBares_dup(3)\fP will not have that restriction. The ares_options struct can not handle potential IPv6 name servers the -ares_channel might be configured to use. The \fBares_save_options(3)\fP function +ares channel might be configured to use. The \fBares_save_options(3)\fP function will only return IPv4 servers, if any. In order to retrieve all name servers -an ares_channel might be using, the \fBares_get_servers(3)\fP function must be +an ares channel might be using, the \fBares_get_servers(3)\fP function must be used instead. .SH SEE ALSO .BR ares_destroy_options (3), diff --git a/deps/cares/docs/ares_search.3 b/deps/cares/docs/ares_search.3 index c81f03b3dc1ebc..e4db64db8cecd4 100644 --- a/deps/cares/docs/ares_search.3 +++ b/deps/cares/docs/ares_search.3 @@ -26,7 +26,7 @@ typedef void (*ares_callback)(void *\fIarg\fP, int \fIstatus\fP, int \fItimeouts\fP, unsigned char *\fIabuf\fP, int \fIalen\fP) -void ares_search(ares_channel \fIchannel\fP, const char *\fIname\fP, +void ares_search(ares_channel_t *\fIchannel\fP, const char *\fIname\fP, int \fIdnsclass\fP, int \fItype\fP, ares_callback \fIcallback\fP, void *\fIarg\fP) .fi @@ -57,6 +57,12 @@ may happen during a later call to or .BR ares_destroy (3). .PP +If this is called from a thread other than which the main program event loop is +running, care needs to be taken to ensure any file descriptor lists are updated +immediately within the eventloop. When the associated callback is called, +it is called with a channel lock so care must be taken to ensure any processing +is minimal to prevent DNS channel stalls. +.PP The callback argument .I arg is copied from the @@ -147,7 +153,8 @@ will usually be 0, but in some cases an unsuccessful query result may be placed in .IR abuf . .SH SEE ALSO -.BR ares_process (3) +.BR ares_process (3), +.BR ares_dns_record (3) .SH AUTHOR Greg Hudson, MIT Information Systems .br diff --git a/deps/cares/docs/ares_send.3 b/deps/cares/docs/ares_send.3 index 59f2e2b4233b6e..83ddb7ee5fa5c0 100644 --- a/deps/cares/docs/ares_send.3 +++ b/deps/cares/docs/ares_send.3 @@ -26,7 +26,7 @@ typedef void (*ares_callback)(void *\fIarg\fP, int \fIstatus\fP, int \fItimeouts\fP, unsigned char *\fIabuf\fP, int \fIalen\fP) -void ares_send(ares_channel \fIchannel\fP, const unsigned char *\fIqbuf\fP, +void ares_send(ares_channel_t *\fIchannel\fP, const unsigned char *\fIqbuf\fP, int \fIqlen\fP, ares_callback \fIcallback\fP, void *\fIarg\fP) .fi .SH DESCRIPTION @@ -49,6 +49,12 @@ happen during a later call to or .BR ares_destroy (3). .PP +If this is called from a thread other than which the main program event loop is +running, care needs to be taken to ensure any file descriptor lists are updated +immediately within the eventloop. When the associated callback is called, +it is called with a channel lock so care must be taken to ensure any processing +is minimal to prevent DNS channel stalls. +.PP The callback argument .I arg is copied from the @@ -119,7 +125,8 @@ status, so a callback status of does not reflect as much about the response as for other query functions. .SH SEE ALSO -.BR ares_process (3) +.BR ares_process (3), +.BR ares_dns_record (3) .SH AUTHOR Greg Hudson, MIT Information Systems .br diff --git a/deps/cares/docs/ares_set_local_dev.3 b/deps/cares/docs/ares_set_local_dev.3 index 7c32d1a51fe8e4..54dfcc51eebf8b 100644 --- a/deps/cares/docs/ares_set_local_dev.3 +++ b/deps/cares/docs/ares_set_local_dev.3 @@ -22,7 +22,7 @@ ares_set_local_dev \- Bind to a specific network device when creating sockets. .nf #include -void ares_set_local_dev(ares_channel \fIchannel\fP, const char* \fIlocal_dev_name\fP) +void ares_set_local_dev(ares_channel_t *\fIchannel\fP, const char* \fIlocal_dev_name\fP) .fi .SH DESCRIPTION The \fBares_set_local_dev\fP function causes all future sockets diff --git a/deps/cares/docs/ares_set_local_ip4.3 b/deps/cares/docs/ares_set_local_ip4.3 index 86965ab212d660..51d7d02bad12ac 100644 --- a/deps/cares/docs/ares_set_local_ip4.3 +++ b/deps/cares/docs/ares_set_local_ip4.3 @@ -22,7 +22,7 @@ ares_set_local_ip4 \- Set local IPv4 address outgoing requests. .nf #include -void ares_set_local_ip4(ares_channel \fIchannel\fP, unsigned int \fIlocal_ip\fP) +void ares_set_local_ip4(ares_channel_t *\fIchannel\fP, unsigned int \fIlocal_ip\fP) .fi .SH DESCRIPTION The \fBares_set_local_ip4\fP function sets the IP address for outbound diff --git a/deps/cares/docs/ares_set_local_ip6.3 b/deps/cares/docs/ares_set_local_ip6.3 index 585be294e94057..57d1f2315d4a63 100644 --- a/deps/cares/docs/ares_set_local_ip6.3 +++ b/deps/cares/docs/ares_set_local_ip6.3 @@ -22,7 +22,7 @@ ares_set_local_ip6 \- Set local IPv6 address outgoing requests. .nf #include -void ares_set_local_ip6(ares_channel \fIchannel\fP, const unsigned char* \fIlocal_ip6\fP) +void ares_set_local_ip6(ares_channel_t *\fIchannel\fP, const unsigned char* \fIlocal_ip6\fP) .fi .SH DESCRIPTION The \fBares_set_local_ip6\fP function sets the IPv6 address for outbound IPv6 diff --git a/deps/cares/docs/ares_set_servers.3 b/deps/cares/docs/ares_set_servers.3 index 6634ef5a2573f6..e2817e7220d3d2 100644 --- a/deps/cares/docs/ares_set_servers.3 +++ b/deps/cares/docs/ares_set_servers.3 @@ -17,16 +17,17 @@ .\" .TH ARES_SET_SERVERS 3 "5 March 2010" .SH NAME -ares_set_servers, ares_set_servers_ports \- Initialize an ares_channel name servers configuration +ares_set_servers, ares_set_servers_ports \- Initialize name server configuration +for an ares channel. .SH SYNOPSIS .nf #include -int ares_set_servers(ares_channel \fIchannel\fP, - struct ares_addr_node *\fIservers\fP) +int ares_set_servers(ares_channel_t *\fIchannel\fP, + const struct ares_addr_node *\fIservers\fP) -int ares_set_servers_ports(ares_channel \fIchannel\fP, - struct ares_addr_port_node *\fIservers\fP) +int ares_set_servers_ports(ares_channel_t *\fIchannel\fP, + const struct ares_addr_port_node *\fIservers\fP) .fi .SH DESCRIPTION The \fBares_set_servers(3)\fP function initializes name servers configuration @@ -41,7 +42,7 @@ The name server linked list pointer argument may be the result of a previous call to \fBares_get_servers(3)\fP or a linked list of \fBares_addr_node\fP structs set up by other means. .PP -The \fBares_set_servers(3)\fP function also allows the specification of UDP and +The \fBares_set_servers_ports(3)\fP function also allows the specification of UDP and TCP ports to be used for communication on a per-server basis. The provided linked list argument may be the result of a previous call to \fBares_get_servers_ports(3)\fP or a linked list of \fBares_addr_port_node\fP structs @@ -50,7 +51,9 @@ set up by other means. This function replaces any potentially previously configured name servers with the ones given in the linked list. So, in order to configure a channel with more than one name server all the desired ones must be specified in a -single list. +single list. Though not recommended, passing NULL will clear all configured +servers and make an inoperable channel, this may be advantageous for test +simulation but unlikely to be useful in production. .PP The function does not take ownership of the linked list argument. The caller is responsible for freeing the linked list when no longer needed. @@ -59,6 +62,10 @@ This function is capable of handling IPv4 and IPv6 name server addresses simultaneously, rendering \fBares_init_options(3)\fP with optmask \fBARES_OPT_SERVERS\fP functionally obsolete except for IPv4-only name server usage. +.PP +As of v1.22.0 this function can +be called on an active channel with running queries, previously it would return +ARES_ENOTIMP. .SH RETURN VALUES .B ares_set_servers(3) @@ -77,14 +84,11 @@ was invalid. .TP 15 .B ARES_ENOTINITIALIZED c-ares library initialization not yet performed. -.TP 15 -.B ARES_ENOTIMP -Changing name servers configuration while queries are outstanding is not implemented. .SH SEE ALSO .BR ares_set_servers_csv (3), .BR ares_get_servers (3), .BR ares_init_options (3), -.BR ares_dup(3) +.BR ares_dup (3) .SH AVAILABILITY \fBares_set_servers(3)\fP was added in c-ares 1.7.1; \fBares_set_servers_ports(3)\fP was added in c-ares 1.11.0. diff --git a/deps/cares/docs/ares_set_servers_csv.3 b/deps/cares/docs/ares_set_servers_csv.3 index fd37a1789e224f..44ea72b7d21bd7 100644 --- a/deps/cares/docs/ares_set_servers_csv.3 +++ b/deps/cares/docs/ares_set_servers_csv.3 @@ -22,13 +22,21 @@ ares_set_servers_csv, ares_set_servers_ports_csv \- Set list of DNS servers to b .nf #include -int ares_set_servers_csv(ares_channel \fIchannel\fP, const char* \fIservers\fP) +int ares_set_servers_csv(ares_channel_t *\fIchannel\fP, const char* \fIservers\fP) -int ares_set_servers_ports_csv(ares_channel \fIchannel\fP, const char* \fIservers\fP) +int ares_set_servers_ports_csv(ares_channel_t *\fIchannel\fP, const char* \fIservers\fP) .fi .SH DESCRIPTION The \fBares_set_servers_csv\fP and \fBares_set_servers_ports_csv\fPfunctions set -the list of DNS servers that ARES will query. The format of the servers option is: +the list of DNS servers that ARES will query. As of v1.22.0 this function can +be called on an active channel with running queries, previously it would return +ARES_ENOTIMP. + +Though not recommended, passing NULL for servers will clear all configured +servers and make an inoperable channel, this may be advantageous for test +simulation but unlikely to be useful in production. + +The format of the servers option is: host[:port][,host[:port]]... @@ -58,9 +66,6 @@ was invalid. .TP 15 .B ARES_ENOTINITIALIZED c-ares library initialization not yet performed. -.TP 15 -.B ARES_ENOTIMP -Changing name servers configuration while queries are outstanding is not implemented. .SH SEE ALSO .BR ares_set_servers (3) .SH AVAILABILITY diff --git a/deps/cares/docs/ares_set_socket_callback.3 b/deps/cares/docs/ares_set_socket_callback.3 index d251eb821b083e..4eb04084e9a11d 100644 --- a/deps/cares/docs/ares_set_socket_callback.3 +++ b/deps/cares/docs/ares_set_socket_callback.3 @@ -13,7 +13,7 @@ typedef int (*ares_sock_create_callback)(ares_socket_t \fIsocket_fd\fP, int \fItype\fP, void *\fIuserdata\fP) -void ares_set_socket_callback(ares_channel \fIchannel\fP, +void ares_set_socket_callback(ares_channel_t *\fIchannel\fP, ares_sock_create_callback \fIcallback\fP, void *\fIuserdata\fP) .PP @@ -27,7 +27,8 @@ connected to the remote server. The callback must return ARES_SUCCESS if things are fine, or return -1 to signal an error. A returned error will abort the ares operation. .SH SEE ALSO -.BR ares_init_options (3), ares_set_socket_configure_callback (3) +.BR ares_init_options (3), +.BR ares_set_socket_configure_callback (3) .SH AVAILABILITY ares_set_socket_callback(3) was added in c-ares 1.6.0 .SH AUTHOR diff --git a/deps/cares/docs/ares_set_socket_configure_callback.3 b/deps/cares/docs/ares_set_socket_configure_callback.3 index 7cc27fe60b7609..1f44ae3c08b47f 100644 --- a/deps/cares/docs/ares_set_socket_configure_callback.3 +++ b/deps/cares/docs/ares_set_socket_configure_callback.3 @@ -12,7 +12,7 @@ typedef int (*ares_sock_config_callback)(ares_socket_t \fIsocket_fd\fP, int \fItype\fP, void *\fIuserdata\fP) -void ares_set_socket_configure_callback(ares_channel \fIchannel\fP, +void ares_set_socket_configure_callback(ares_channel_t *\fIchannel\fP, ares_sock_config_callback \fIcallback\fP, void *\fIuserdata\fP) .fi @@ -25,7 +25,8 @@ to configure various socket options. The callback must return ARES_SUCCESS if things are fine, or return -1 to signal an error. A returned error will abort the ares operation. .SH SEE ALSO -.BR ares_init_options (3), ares_set_socket_callback (3) +.BR ares_init_options (3), +.BR ares_set_socket_callback (3) .SH AVAILABILITY ares_set_socket_configure_callback(3) was added in c-ares 1.11.0 .SH AUTHOR diff --git a/deps/cares/docs/ares_set_socket_functions.3 b/deps/cares/docs/ares_set_socket_functions.3 index 1b4e1aaee32d8f..a1d9f7741ffba0 100644 --- a/deps/cares/docs/ares_set_socket_functions.3 +++ b/deps/cares/docs/ares_set_socket_functions.3 @@ -16,7 +16,7 @@ struct ares_socket_functions { ares_ssize_t (*\fIasendv\fP)(ares_socket_t, const struct iovec *, int, void *); }; -void ares_set_socket_functions(ares_channel \fIchannel\fP, +void ares_set_socket_functions(ares_channel_t *\fIchannel\fP, const struct ares_socket_functions * \fIfunctions\fP, void *\fIuser_data\fP); .fi @@ -90,12 +90,12 @@ and must thus remain valid through out the channels and any created socket's lif Added in c-ares 1.13.0 .SH SEE ALSO .BR ares_init_options (3), -.BR socket(2), -.BR close(2), -.BR connect(2), -.BR recv(2), -.BR recvfrom(2), -.BR send(2), -.BR writev(2) +.BR socket (2), +.BR close (2), +.BR connect (2), +.BR recv (2), +.BR recvfrom (2), +.BR send (2), +.BR writev (2) .SH AUTHOR Carl Wilund diff --git a/deps/cares/docs/ares_set_sortlist.3 b/deps/cares/docs/ares_set_sortlist.3 index 24c3c35a7319eb..c93e5262b81465 100644 --- a/deps/cares/docs/ares_set_sortlist.3 +++ b/deps/cares/docs/ares_set_sortlist.3 @@ -16,12 +16,12 @@ .\" .TH ARES_SET_SORTLIST 3 "23 November 2015" .SH NAME -ares_set_sortlist \- Initialize an ares_channel sortlist configuration +ares_set_sortlist \- Initialize an ares_channel_t *sortlist configuration .SH SYNOPSIS .nf #include -int ares_set_sortlist(ares_channel \fIchannel\fP, const char *\fIsortstr\fP) +int ares_set_sortlist(ares_channel_t *\fIchannel\fP, const char *\fIsortstr\fP) .fi .SH DESCRIPTION The \fBares_set_sortlist(3)\fP function initializes an address sortlist configuration @@ -56,6 +56,6 @@ was invalid. c-ares library initialization not yet performed. .SH SEE ALSO .BR ares_init_options (3), -.BR ares_dup(3) +.BR ares_dup (3) .SH AVAILABILITY ares_set_sortlist(3) was added in c-ares 1.11.0 diff --git a/deps/cares/docs/ares_svcb_param_t.3 b/deps/cares/docs/ares_svcb_param_t.3 new file mode 100644 index 00000000000000..4587b9a586ef8e --- /dev/null +++ b/deps/cares/docs/ares_svcb_param_t.3 @@ -0,0 +1,4 @@ +.\" +.\" Copyright (C) Daniel Stenberg +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_mapping.3 diff --git a/deps/cares/docs/ares_threadsafety.3 b/deps/cares/docs/ares_threadsafety.3 new file mode 100644 index 00000000000000..782893a5b4b039 --- /dev/null +++ b/deps/cares/docs/ares_threadsafety.3 @@ -0,0 +1,43 @@ +.\" +.\" SPDX-License-Identifier: MIT +.\" +.TH ARES_REINIT 3 "26 November 2023" +.SH NAME +ares_threadsafety \- Query if c-ares was built with thread-safety +.SH SYNOPSIS +.nf +#include + +ares_bool_t ares_threadsafety(void); +.fi +.SH DESCRIPTION +The \fBares_threadsafety(3)\fP function returns if the library was built with +thread safety enabled or not. + +As of c-ares 1.23.0, this simply means that every public function which +references an \fIares_channel_t\fP object will lock the channel on entry and +release the lock on exit of the function. This will prevent concurrent +thread access to the channel, thus ensuring no corruption can occur. Future +versions will likely implement more threading-specific features. + +.SH RETURN VALUES +\fIares_threadsafety(3)\fP can return any of the following values: +.TP 14 +.B ARES_TRUE +Built with thread safety. +.TP 14 +.B ARES_FALSE +Built without thread safety +.TP 14 + +.SH AVAILABILITY +This function was first introduced in c-ares version 1.23.0. +.SH SEE ALSO +.BR ares_init (3), +.BR ares_init_options (3), +.BR ares_destroy (3), +.BR ares_dup (3), +.BR ares_library_init (3), +.BR ares_set_servers (3) +.SH AUTHOR +Copyright (C) 2023 The c-ares project and its members. diff --git a/deps/cares/docs/ares_timeout.3 b/deps/cares/docs/ares_timeout.3 index d61bdd98ed607b..fd33193fe80857 100644 --- a/deps/cares/docs/ares_timeout.3 +++ b/deps/cares/docs/ares_timeout.3 @@ -22,7 +22,7 @@ ares_timeout \- return maximum time to wait .nf #include -struct timeval *ares_timeout(ares_channel \fIchannel\fP, +struct timeval *ares_timeout(ares_channel_t *\fIchannel\fP, struct timeval *\fImaxtv\fP, struct timeval *\fItv\fP) .fi diff --git a/deps/cares/docs/ares_tlsa_match_t.3 b/deps/cares/docs/ares_tlsa_match_t.3 new file mode 100644 index 00000000000000..b93e4cd4e37fa8 --- /dev/null +++ b/deps/cares/docs/ares_tlsa_match_t.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/deps/cares/docs/ares_tlsa_selector_t.3 b/deps/cares/docs/ares_tlsa_selector_t.3 new file mode 100644 index 00000000000000..b93e4cd4e37fa8 --- /dev/null +++ b/deps/cares/docs/ares_tlsa_selector_t.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/deps/cares/docs/ares_tlsa_usage_t.3 b/deps/cares/docs/ares_tlsa_usage_t.3 new file mode 100644 index 00000000000000..b93e4cd4e37fa8 --- /dev/null +++ b/deps/cares/docs/ares_tlsa_usage_t.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/deps/cares/include/CMakeLists.txt b/deps/cares/include/CMakeLists.txt index 4801d873b5acd8..e95a94dda16464 100644 --- a/deps/cares/include/CMakeLists.txt +++ b/deps/cares/include/CMakeLists.txt @@ -5,6 +5,6 @@ CONFIGURE_FILE (ares_build.h.cmake ${PROJECT_BINARY_DIR}/ares_build.h) # Headers installation target IF (CARES_INSTALL) - SET (CARES_HEADERS ares.h ares_version.h "${PROJECT_BINARY_DIR}/ares_build.h" ares_rules.h ares_dns.h ares_nameser.h) + SET (CARES_HEADERS ares.h ares_version.h "${PROJECT_BINARY_DIR}/ares_build.h" ares_rules.h ares_dns.h ares_dns_record.h ares_nameser.h) INSTALL (FILES ${CARES_HEADERS} COMPONENT Devel DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) ENDIF () diff --git a/deps/cares/include/Makefile.am b/deps/cares/include/Makefile.am index c9db5671d7048e..e17790da4f4cc9 100644 --- a/deps/cares/include/Makefile.am +++ b/deps/cares/include/Makefile.am @@ -4,6 +4,6 @@ AUTOMAKE_OPTIONS = foreign nostdinc 1.9.6 ACLOCAL_AMFLAGS = -I m4 --install # what headers to install on 'make install': -include_HEADERS = ares.h ares_version.h ares_build.h ares_rules.h ares_dns.h ares_nameser.h +include_HEADERS = ares.h ares_version.h ares_build.h ares_rules.h ares_dns.h ares_dns_record.h ares_nameser.h EXTRA_DIST = ares_build.h.cmake ares_build.h.in ares_build.h.dist CMakeLists.txt diff --git a/deps/cares/include/Makefile.in b/deps/cares/include/Makefile.in index bd37daee03e43f..378b64daeb2ab5 100644 --- a/deps/cares/include/Makefile.in +++ b/deps/cares/include/Makefile.in @@ -94,11 +94,15 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ $(top_srcdir)/m4/ax_ac_print_to_file.m4 \ $(top_srcdir)/m4/ax_add_am_macro_static.m4 \ $(top_srcdir)/m4/ax_am_macros_static.m4 \ + $(top_srcdir)/m4/ax_append_compile_flags.m4 \ + $(top_srcdir)/m4/ax_append_flag.m4 \ + $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_check_gnu_make.m4 \ $(top_srcdir)/m4/ax_code_coverage.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ $(top_srcdir)/m4/ax_file_escapes.m4 \ + $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_require_defined.m4 \ $(top_srcdir)/m4/cares-compilers.m4 \ $(top_srcdir)/m4/cares-confopts.m4 \ @@ -273,6 +277,10 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_CXX = @PTHREAD_CXX@ +PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -292,6 +300,7 @@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ +ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ @@ -343,7 +352,7 @@ AUTOMAKE_OPTIONS = foreign nostdinc 1.9.6 ACLOCAL_AMFLAGS = -I m4 --install # what headers to install on 'make install': -include_HEADERS = ares.h ares_version.h ares_build.h ares_rules.h ares_dns.h ares_nameser.h +include_HEADERS = ares.h ares_version.h ares_build.h ares_rules.h ares_dns.h ares_dns_record.h ares_nameser.h EXTRA_DIST = ares_build.h.cmake ares_build.h.in ares_build.h.dist CMakeLists.txt all: ares_build.h $(MAKE) $(AM_MAKEFLAGS) all-am diff --git a/deps/cares/include/ares.h b/deps/cares/include/ares.h index d2c1e9e3a6f327..6564a69da6b355 100644 --- a/deps/cares/include/ares.h +++ b/deps/cares/include/ares.h @@ -28,16 +28,16 @@ #ifndef ARES__H #define ARES__H -#include "ares_version.h" /* c-ares version defines */ -#include "ares_build.h" /* c-ares build definitions */ -#include "ares_rules.h" /* c-ares rules enforcement */ +#include "ares_version.h" /* c-ares version defines */ +#include "ares_build.h" /* c-ares build definitions */ +#include "ares_rules.h" /* c-ares rules enforcement */ /* * Define WIN32 when build target is Win32 API */ -#if (defined(_WIN32) || defined(__WIN32__)) && \ - !defined(WIN32) && !defined(__SYMBIAN32__) +#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) && \ + !defined(__SYMBIAN32__) # define WIN32 #endif @@ -47,13 +47,13 @@ libc5-based Linux systems. Only include it on system that are known to require it! */ #if defined(_AIX) || defined(__NOVELL_LIBC__) || defined(__NetBSD__) || \ - defined(__minix) || defined(__SYMBIAN32__) || defined(__INTEGRITY) || \ - defined(ANDROID) || defined(__ANDROID__) || defined(__OpenBSD__) || \ - defined(__QNXNTO__) || defined(__MVS__) || defined(__HAIKU__) -#include + defined(__minix) || defined(__SYMBIAN32__) || defined(__INTEGRITY) || \ + defined(ANDROID) || defined(__ANDROID__) || defined(__OpenBSD__) || \ + defined(__QNXNTO__) || defined(__MVS__) || defined(__HAIKU__) +# include #endif #if (defined(NETWARE) && !defined(__NOVELL_LIBC__)) -#include +# include #endif #if defined(WATT32) @@ -86,10 +86,10 @@ #endif #if defined(ANDROID) || defined(__ANDROID__) -#include +# include #endif -#ifdef __cplusplus +#ifdef __cplusplus extern "C" { #endif @@ -101,9 +101,9 @@ extern "C" { # define CARES_EXTERN #elif defined(WIN32) || defined(_WIN32) || defined(__SYMBIAN32__) # if defined(CARES_BUILDING_LIBRARY) -# define CARES_EXTERN __declspec(dllexport) +# define CARES_EXTERN __declspec(dllexport) # else -# define CARES_EXTERN __declspec(dllimport) +# define CARES_EXTERN __declspec(dllimport) # endif #elif defined(CARES_BUILDING_LIBRARY) && defined(CARES_SYMBOL_HIDING) # define CARES_EXTERN CARES_SYMBOL_SCOPE_EXTERN @@ -112,59 +112,67 @@ extern "C" { #endif -#define ARES_SUCCESS 0 - -/* Server error codes (ARES_ENODATA indicates no relevant answer) */ -#define ARES_ENODATA 1 -#define ARES_EFORMERR 2 -#define ARES_ESERVFAIL 3 -#define ARES_ENOTFOUND 4 -#define ARES_ENOTIMP 5 -#define ARES_EREFUSED 6 - -/* Locally generated error codes */ -#define ARES_EBADQUERY 7 -#define ARES_EBADNAME 8 -#define ARES_EBADFAMILY 9 -#define ARES_EBADRESP 10 -#define ARES_ECONNREFUSED 11 -#define ARES_ETIMEOUT 12 -#define ARES_EOF 13 -#define ARES_EFILE 14 -#define ARES_ENOMEM 15 -#define ARES_EDESTRUCTION 16 -#define ARES_EBADSTR 17 - -/* ares_getnameinfo error codes */ -#define ARES_EBADFLAGS 18 - -/* ares_getaddrinfo error codes */ -#define ARES_ENONAME 19 -#define ARES_EBADHINTS 20 - -/* Uninitialized library error code */ -#define ARES_ENOTINITIALIZED 21 /* introduced in 1.7.0 */ - -/* ares_library_init error codes */ -#define ARES_ELOADIPHLPAPI 22 /* introduced in 1.7.0 */ -#define ARES_EADDRGETNETWORKPARAMS 23 /* introduced in 1.7.0 */ - -/* More error codes */ -#define ARES_ECANCELLED 24 /* introduced in 1.7.0 */ - -/* More ares_getaddrinfo error codes */ -#define ARES_ESERVICE 25 /* introduced in 1.?.0 */ +typedef enum { + ARES_SUCCESS = 0, + + /* Server error codes (ARES_ENODATA indicates no relevant answer) */ + ARES_ENODATA = 1, + ARES_EFORMERR = 2, + ARES_ESERVFAIL = 3, + ARES_ENOTFOUND = 4, + ARES_ENOTIMP = 5, + ARES_EREFUSED = 6, + + /* Locally generated error codes */ + ARES_EBADQUERY = 7, + ARES_EBADNAME = 8, + ARES_EBADFAMILY = 9, + ARES_EBADRESP = 10, + ARES_ECONNREFUSED = 11, + ARES_ETIMEOUT = 12, + ARES_EOF = 13, + ARES_EFILE = 14, + ARES_ENOMEM = 15, + ARES_EDESTRUCTION = 16, + ARES_EBADSTR = 17, + + /* ares_getnameinfo error codes */ + ARES_EBADFLAGS = 18, + + /* ares_getaddrinfo error codes */ + ARES_ENONAME = 19, + ARES_EBADHINTS = 20, + + /* Uninitialized library error code */ + ARES_ENOTINITIALIZED = 21, /* introduced in 1.7.0 */ + + /* ares_library_init error codes */ + ARES_ELOADIPHLPAPI = 22, /* introduced in 1.7.0 */ + ARES_EADDRGETNETWORKPARAMS = 23, /* introduced in 1.7.0 */ + + /* More error codes */ + ARES_ECANCELLED = 24, /* introduced in 1.7.0 */ + + /* More ares_getaddrinfo error codes */ + ARES_ESERVICE = 25 /* ares_getaddrinfo() was passed a text service name that + * is not recognized. introduced in 1.16.0 */ +} ares_status_t; + +typedef enum { + ARES_FALSE = 0, + ARES_TRUE = 1 +} ares_bool_t; /* Flag values */ -#define ARES_FLAG_USEVC (1 << 0) -#define ARES_FLAG_PRIMARY (1 << 1) -#define ARES_FLAG_IGNTC (1 << 2) -#define ARES_FLAG_NORECURSE (1 << 3) -#define ARES_FLAG_STAYOPEN (1 << 4) -#define ARES_FLAG_NOSEARCH (1 << 5) -#define ARES_FLAG_NOALIASES (1 << 6) -#define ARES_FLAG_NOCHECKRESP (1 << 7) -#define ARES_FLAG_EDNS (1 << 8) +#define ARES_FLAG_USEVC (1 << 0) +#define ARES_FLAG_PRIMARY (1 << 1) +#define ARES_FLAG_IGNTC (1 << 2) +#define ARES_FLAG_NORECURSE (1 << 3) +#define ARES_FLAG_STAYOPEN (1 << 4) +#define ARES_FLAG_NOSEARCH (1 << 5) +#define ARES_FLAG_NOALIASES (1 << 6) +#define ARES_FLAG_NOCHECKRESP (1 << 7) +#define ARES_FLAG_EDNS (1 << 8) /* Option mask values */ #define ARES_OPT_FLAGS (1 << 0) @@ -187,54 +195,57 @@ extern "C" { #define ARES_OPT_RESOLVCONF (1 << 17) #define ARES_OPT_HOSTS_FILE (1 << 18) #define ARES_OPT_UDP_MAX_QUERIES (1 << 19) +#define ARES_OPT_MAXTIMEOUTMS (1 << 20) +#define ARES_OPT_QUERY_CACHE (1 << 21) /* Nameinfo flag values */ -#define ARES_NI_NOFQDN (1 << 0) -#define ARES_NI_NUMERICHOST (1 << 1) -#define ARES_NI_NAMEREQD (1 << 2) -#define ARES_NI_NUMERICSERV (1 << 3) -#define ARES_NI_DGRAM (1 << 4) -#define ARES_NI_TCP 0 -#define ARES_NI_UDP ARES_NI_DGRAM -#define ARES_NI_SCTP (1 << 5) -#define ARES_NI_DCCP (1 << 6) -#define ARES_NI_NUMERICSCOPE (1 << 7) -#define ARES_NI_LOOKUPHOST (1 << 8) -#define ARES_NI_LOOKUPSERVICE (1 << 9) +#define ARES_NI_NOFQDN (1 << 0) +#define ARES_NI_NUMERICHOST (1 << 1) +#define ARES_NI_NAMEREQD (1 << 2) +#define ARES_NI_NUMERICSERV (1 << 3) +#define ARES_NI_DGRAM (1 << 4) +#define ARES_NI_TCP 0 +#define ARES_NI_UDP ARES_NI_DGRAM +#define ARES_NI_SCTP (1 << 5) +#define ARES_NI_DCCP (1 << 6) +#define ARES_NI_NUMERICSCOPE (1 << 7) +#define ARES_NI_LOOKUPHOST (1 << 8) +#define ARES_NI_LOOKUPSERVICE (1 << 9) /* Reserved for future use */ -#define ARES_NI_IDN (1 << 10) -#define ARES_NI_IDN_ALLOW_UNASSIGNED (1 << 11) +#define ARES_NI_IDN (1 << 10) +#define ARES_NI_IDN_ALLOW_UNASSIGNED (1 << 11) #define ARES_NI_IDN_USE_STD3_ASCII_RULES (1 << 12) /* Addrinfo flag values */ -#define ARES_AI_CANONNAME (1 << 0) -#define ARES_AI_NUMERICHOST (1 << 1) -#define ARES_AI_PASSIVE (1 << 2) -#define ARES_AI_NUMERICSERV (1 << 3) -#define ARES_AI_V4MAPPED (1 << 4) -#define ARES_AI_ALL (1 << 5) -#define ARES_AI_ADDRCONFIG (1 << 6) -#define ARES_AI_NOSORT (1 << 7) -#define ARES_AI_ENVHOSTS (1 << 8) +#define ARES_AI_CANONNAME (1 << 0) +#define ARES_AI_NUMERICHOST (1 << 1) +#define ARES_AI_PASSIVE (1 << 2) +#define ARES_AI_NUMERICSERV (1 << 3) +#define ARES_AI_V4MAPPED (1 << 4) +#define ARES_AI_ALL (1 << 5) +#define ARES_AI_ADDRCONFIG (1 << 6) +#define ARES_AI_NOSORT (1 << 7) +#define ARES_AI_ENVHOSTS (1 << 8) /* Reserved for future use */ -#define ARES_AI_IDN (1 << 10) -#define ARES_AI_IDN_ALLOW_UNASSIGNED (1 << 11) +#define ARES_AI_IDN (1 << 10) +#define ARES_AI_IDN_ALLOW_UNASSIGNED (1 << 11) #define ARES_AI_IDN_USE_STD3_ASCII_RULES (1 << 12) -#define ARES_AI_CANONIDN (1 << 13) - -#define ARES_AI_MASK (ARES_AI_CANONNAME|ARES_AI_NUMERICHOST|ARES_AI_PASSIVE| \ - ARES_AI_NUMERICSERV|ARES_AI_V4MAPPED|ARES_AI_ALL| \ - ARES_AI_ADDRCONFIG) -#define ARES_GETSOCK_MAXNUM 16 /* ares_getsock() can return info about this - many sockets */ -#define ARES_GETSOCK_READABLE(bits,num) (bits & (1<< (num))) -#define ARES_GETSOCK_WRITABLE(bits,num) (bits & (1 << ((num) + \ - ARES_GETSOCK_MAXNUM))) +#define ARES_AI_CANONIDN (1 << 13) + +#define ARES_AI_MASK \ + (ARES_AI_CANONNAME | ARES_AI_NUMERICHOST | ARES_AI_PASSIVE | \ + ARES_AI_NUMERICSERV | ARES_AI_V4MAPPED | ARES_AI_ALL | ARES_AI_ADDRCONFIG) +#define ARES_GETSOCK_MAXNUM \ + 16 /* ares_getsock() can return info about this \ + many sockets */ +#define ARES_GETSOCK_READABLE(bits, num) (bits & (1 << (num))) +#define ARES_GETSOCK_WRITABLE(bits, num) \ + (bits & (1 << ((num) + ARES_GETSOCK_MAXNUM))) /* c-ares library initialization flag values */ -#define ARES_LIB_INIT_NONE (0) -#define ARES_LIB_INIT_WIN32 (1 << 0) -#define ARES_LIB_INIT_ALL (ARES_LIB_INIT_WIN32) +#define ARES_LIB_INIT_NONE (0) +#define ARES_LIB_INIT_WIN32 (1 << 0) +#define ARES_LIB_INIT_ALL (ARES_LIB_INIT_WIN32) /* @@ -242,20 +253,18 @@ extern "C" { */ #ifndef ares_socket_typedef -#ifdef WIN32 +# ifdef WIN32 typedef SOCKET ares_socket_t; -#define ARES_SOCKET_BAD INVALID_SOCKET -#else +# define ARES_SOCKET_BAD INVALID_SOCKET +# else typedef int ares_socket_t; -#define ARES_SOCKET_BAD -1 -#endif -#define ares_socket_typedef +# define ARES_SOCKET_BAD -1 +# endif +# define ares_socket_typedef #endif /* ares_socket_typedef */ -typedef void (*ares_sock_state_cb)(void *data, - ares_socket_t socket_fd, - int readable, - int writable); +typedef void (*ares_sock_state_cb)(void *data, ares_socket_t socket_fd, + int readable, int writable); struct apattern; @@ -277,27 +286,29 @@ struct apattern; */ struct ares_options { - int flags; - int timeout; /* in seconds or milliseconds, depending on options */ - int tries; - int ndots; - unsigned short udp_port; - unsigned short tcp_port; - int socket_send_buffer_size; - int socket_receive_buffer_size; - struct in_addr *servers; - int nservers; - char **domains; - int ndomains; - char *lookups; + int flags; + int timeout; /* in seconds or milliseconds, depending on options */ + int tries; + int ndots; + unsigned short udp_port; /* host byte order */ + unsigned short tcp_port; /* host byte order */ + int socket_send_buffer_size; + int socket_receive_buffer_size; + struct in_addr *servers; + int nservers; + char **domains; + int ndomains; + char *lookups; ares_sock_state_cb sock_state_cb; - void *sock_state_cb_data; - struct apattern *sortlist; - int nsort; - int ednspsz; - char *resolvconf_path; - char *hosts_path; - int udp_max_queries; + void *sock_state_cb_data; + struct apattern *sortlist; + int nsort; + int ednspsz; + char *resolvconf_path; + char *hosts_path; + int udp_max_queries; + int maxtimeout; /* in milliseconds */ + unsigned int qcache_max_ttl; /* Maximum TTL for query cache, 0=disabled */ }; struct hostent; @@ -307,109 +318,100 @@ struct ares_channeldata; struct ares_addrinfo; struct ares_addrinfo_hints; +/* Legacy typedef, don't use, you can't specify "const" */ typedef struct ares_channeldata *ares_channel; -typedef void (*ares_callback)(void *arg, - int status, - int timeouts, - unsigned char *abuf, - int alen); +/* Current main channel typedef */ +typedef struct ares_channeldata ares_channel_t; + + +typedef void (*ares_callback)(void *arg, int status, int timeouts, + unsigned char *abuf, int alen); -typedef void (*ares_host_callback)(void *arg, - int status, - int timeouts, +typedef void (*ares_host_callback)(void *arg, int status, int timeouts, struct hostent *hostent); -typedef void (*ares_nameinfo_callback)(void *arg, - int status, - int timeouts, - char *node, - char *service); +typedef void (*ares_nameinfo_callback)(void *arg, int status, int timeouts, + char *node, char *service); -typedef int (*ares_sock_create_callback)(ares_socket_t socket_fd, - int type, - void *data); +typedef int (*ares_sock_create_callback)(ares_socket_t socket_fd, int type, + void *data); -typedef int (*ares_sock_config_callback)(ares_socket_t socket_fd, - int type, - void *data); +typedef int (*ares_sock_config_callback)(ares_socket_t socket_fd, int type, + void *data); -typedef void (*ares_addrinfo_callback)(void *arg, - int status, - int timeouts, - struct ares_addrinfo *res); +typedef void (*ares_addrinfo_callback)(void *arg, int status, int timeouts, + struct ares_addrinfo *res); CARES_EXTERN int ares_library_init(int flags); -CARES_EXTERN int ares_library_init_mem(int flags, - void *(*amalloc)(size_t size), - void (*afree)(void *ptr), - void *(*arealloc)(void *ptr, size_t size)); +CARES_EXTERN int ares_library_init_mem(int flags, void *(*amalloc)(size_t size), + void (*afree)(void *ptr), + void *(*arealloc)(void *ptr, + size_t size)); #if defined(ANDROID) || defined(__ANDROID__) CARES_EXTERN void ares_library_init_jvm(JavaVM *jvm); -CARES_EXTERN int ares_library_init_android(jobject connectivity_manager); -CARES_EXTERN int ares_library_android_initialized(void); +CARES_EXTERN int ares_library_init_android(jobject connectivity_manager); +CARES_EXTERN int ares_library_android_initialized(void); #endif -CARES_EXTERN int ares_library_initialized(void); +CARES_EXTERN int ares_library_initialized(void); -CARES_EXTERN void ares_library_cleanup(void); +CARES_EXTERN void ares_library_cleanup(void); -CARES_EXTERN const char *ares_version(int *version); +CARES_EXTERN const char *ares_version(int *version); -CARES_EXTERN int ares_init(ares_channel *channelptr); +CARES_EXTERN int ares_init(ares_channel_t **channelptr); -CARES_EXTERN int ares_init_options(ares_channel *channelptr, - struct ares_options *options, - int optmask); +CARES_EXTERN int ares_init_options(ares_channel_t **channelptr, + const struct ares_options *options, + int optmask); -CARES_EXTERN int ares_save_options(ares_channel channel, - struct ares_options *options, - int *optmask); +CARES_EXTERN int ares_save_options(ares_channel_t *channel, + struct ares_options *options, int *optmask); -CARES_EXTERN void ares_destroy_options(struct ares_options *options); +CARES_EXTERN void ares_destroy_options(struct ares_options *options); -CARES_EXTERN int ares_dup(ares_channel *dest, - ares_channel src); +CARES_EXTERN int ares_dup(ares_channel_t **dest, ares_channel_t *src); -CARES_EXTERN void ares_destroy(ares_channel channel); +CARES_EXTERN ares_status_t ares_reinit(ares_channel_t *channel); -CARES_EXTERN void ares_cancel(ares_channel channel); +CARES_EXTERN void ares_destroy(ares_channel_t *channel); + +CARES_EXTERN void ares_cancel(ares_channel_t *channel); /* These next 3 configure local binding for the out-going socket * connection. Use these to specify source IP and/or network device * on multi-homed systems. */ -CARES_EXTERN void ares_set_local_ip4(ares_channel channel, unsigned int local_ip); +CARES_EXTERN void ares_set_local_ip4(ares_channel_t *channel, + unsigned int local_ip); /* local_ip6 should be 16 bytes in length */ -CARES_EXTERN void ares_set_local_ip6(ares_channel channel, - const unsigned char* local_ip6); +CARES_EXTERN void ares_set_local_ip6(ares_channel_t *channel, + const unsigned char *local_ip6); /* local_dev_name should be null terminated. */ -CARES_EXTERN void ares_set_local_dev(ares_channel channel, - const char* local_dev_name); +CARES_EXTERN void ares_set_local_dev(ares_channel_t *channel, + const char *local_dev_name); -CARES_EXTERN void ares_set_socket_callback(ares_channel channel, - ares_sock_create_callback callback, - void *user_data); +CARES_EXTERN void ares_set_socket_callback(ares_channel_t *channel, + ares_sock_create_callback callback, + void *user_data); -CARES_EXTERN void ares_set_socket_configure_callback(ares_channel channel, - ares_sock_config_callback callback, - void *user_data); +CARES_EXTERN void ares_set_socket_configure_callback( + ares_channel_t *channel, ares_sock_config_callback callback, void *user_data); -CARES_EXTERN int ares_set_sortlist(ares_channel channel, - const char *sortstr); +CARES_EXTERN int ares_set_sortlist(ares_channel_t *channel, + const char *sortstr); -CARES_EXTERN void ares_getaddrinfo(ares_channel channel, - const char* node, - const char* service, - const struct ares_addrinfo_hints* hints, - ares_addrinfo_callback callback, - void* arg); +CARES_EXTERN void ares_getaddrinfo(ares_channel_t *channel, const char *node, + const char *service, + const struct ares_addrinfo_hints *hints, + ares_addrinfo_callback callback, void *arg); -CARES_EXTERN void ares_freeaddrinfo(struct ares_addrinfo* ai); +CARES_EXTERN void ares_freeaddrinfo(struct ares_addrinfo *ai); /* * Virtual function set to have user-managed socket IO. @@ -420,111 +422,83 @@ CARES_EXTERN void ares_freeaddrinfo(struct ares_addrinfo* ai); * ares_sock_config_callback call. */ struct iovec; + struct ares_socket_functions { - ares_socket_t(*asocket)(int, int, int, void *); - int(*aclose)(ares_socket_t, void *); - int(*aconnect)(ares_socket_t, const struct sockaddr *, ares_socklen_t, void *); - ares_ssize_t(*arecvfrom)(ares_socket_t, void *, size_t, int, struct sockaddr *, ares_socklen_t *, void *); - ares_ssize_t(*asendv)(ares_socket_t, const struct iovec *, int, void *); + ares_socket_t (*asocket)(int, int, int, void *); + int (*aclose)(ares_socket_t, void *); + int (*aconnect)(ares_socket_t, const struct sockaddr *, ares_socklen_t, + void *); + ares_ssize_t (*arecvfrom)(ares_socket_t, void *, size_t, int, + struct sockaddr *, ares_socklen_t *, void *); + ares_ssize_t (*asendv)(ares_socket_t, const struct iovec *, int, void *); }; -CARES_EXTERN void ares_set_socket_functions(ares_channel channel, - const struct ares_socket_functions * funcs, - void *user_data); - -CARES_EXTERN void ares_send(ares_channel channel, - const unsigned char *qbuf, - int qlen, - ares_callback callback, - void *arg); - -CARES_EXTERN void ares_query(ares_channel channel, - const char *name, - int dnsclass, - int type, - ares_callback callback, +CARES_EXTERN void + ares_set_socket_functions(ares_channel_t *channel, + const struct ares_socket_functions *funcs, + void *user_data); + +CARES_EXTERN void ares_send(ares_channel_t *channel, const unsigned char *qbuf, + int qlen, ares_callback callback, void *arg); + +CARES_EXTERN void ares_query(ares_channel_t *channel, const char *name, + int dnsclass, int type, ares_callback callback, void *arg); -CARES_EXTERN void ares_search(ares_channel channel, - const char *name, - int dnsclass, - int type, - ares_callback callback, +CARES_EXTERN void ares_search(ares_channel_t *channel, const char *name, + int dnsclass, int type, ares_callback callback, void *arg); -CARES_EXTERN void ares_gethostbyname(ares_channel channel, - const char *name, - int family, - ares_host_callback callback, +CARES_EXTERN void ares_gethostbyname(ares_channel_t *channel, const char *name, + int family, ares_host_callback callback, void *arg); -CARES_EXTERN int ares_gethostbyname_file(ares_channel channel, - const char *name, - int family, - struct hostent **host); +CARES_EXTERN int ares_gethostbyname_file(ares_channel_t *channel, + const char *name, int family, + struct hostent **host); -CARES_EXTERN void ares_gethostbyaddr(ares_channel channel, - const void *addr, - int addrlen, - int family, - ares_host_callback callback, - void *arg); +CARES_EXTERN void ares_gethostbyaddr(ares_channel_t *channel, const void *addr, + int addrlen, int family, + ares_host_callback callback, void *arg); -CARES_EXTERN void ares_getnameinfo(ares_channel channel, +CARES_EXTERN void ares_getnameinfo(ares_channel_t *channel, const struct sockaddr *sa, - ares_socklen_t salen, - int flags, - ares_nameinfo_callback callback, - void *arg); + ares_socklen_t salen, int flags, + ares_nameinfo_callback callback, void *arg); -CARES_EXTERN int ares_fds(ares_channel channel, - fd_set *read_fds, - fd_set *write_fds); +CARES_EXTERN int ares_fds(ares_channel_t *channel, fd_set *read_fds, + fd_set *write_fds); -CARES_EXTERN int ares_getsock(ares_channel channel, - ares_socket_t *socks, - int numsocks); +CARES_EXTERN int ares_getsock(ares_channel_t *channel, ares_socket_t *socks, + int numsocks); -CARES_EXTERN struct timeval *ares_timeout(ares_channel channel, +CARES_EXTERN struct timeval *ares_timeout(ares_channel_t *channel, struct timeval *maxtv, struct timeval *tv); -CARES_EXTERN void ares_process(ares_channel channel, - fd_set *read_fds, +CARES_EXTERN void ares_process(ares_channel_t *channel, fd_set *read_fds, fd_set *write_fds); -CARES_EXTERN void ares_process_fd(ares_channel channel, - ares_socket_t read_fd, - ares_socket_t write_fd); - -CARES_EXTERN int ares_create_query(const char *name, - int dnsclass, - int type, - unsigned short id, - int rd, - unsigned char **buf, - int *buflen, - int max_udp_size); - -CARES_EXTERN int ares_mkquery(const char *name, - int dnsclass, - int type, - unsigned short id, - int rd, - unsigned char **buf, - int *buflen); - -CARES_EXTERN int ares_expand_name(const unsigned char *encoded, - const unsigned char *abuf, - int alen, - char **s, - long *enclen); - -CARES_EXTERN int ares_expand_string(const unsigned char *encoded, - const unsigned char *abuf, - int alen, - unsigned char **s, - long *enclen); +CARES_EXTERN void ares_process_fd(ares_channel_t *channel, + ares_socket_t read_fd, + ares_socket_t write_fd); + +CARES_EXTERN int ares_create_query(const char *name, int dnsclass, int type, + unsigned short id, int rd, + unsigned char **buf, int *buflen, + int max_udp_size); + +CARES_EXTERN int ares_mkquery(const char *name, int dnsclass, int type, + unsigned short id, int rd, unsigned char **buf, + int *buflen); + +CARES_EXTERN int ares_expand_name(const unsigned char *encoded, + const unsigned char *abuf, int alen, char **s, + long *enclen); + +CARES_EXTERN int ares_expand_string(const unsigned char *encoded, + const unsigned char *abuf, int alen, + unsigned char **s, long *enclen); /* * NOTE: before c-ares 1.7.0 we would most often use the system in6_addr @@ -539,6 +513,15 @@ struct ares_in6_addr { } _S6_un; }; +struct ares_addr { + int family; + + union { + struct in_addr addr4; + struct ares_in6_addr addr6; + } addr; +}; + struct ares_addrttl { struct in_addr ipaddr; int ttl; @@ -546,47 +529,47 @@ struct ares_addrttl { struct ares_addr6ttl { struct ares_in6_addr ip6addr; - int ttl; + int ttl; }; struct ares_caa_reply { - struct ares_caa_reply *next; - int critical; - unsigned char *property; - size_t plength; /* plength excludes null termination */ - unsigned char *value; - size_t length; /* length excludes null termination */ + struct ares_caa_reply *next; + int critical; + unsigned char *property; + size_t plength; /* plength excludes null termination */ + unsigned char *value; + size_t length; /* length excludes null termination */ }; struct ares_srv_reply { - struct ares_srv_reply *next; - char *host; - unsigned short priority; - unsigned short weight; - unsigned short port; + struct ares_srv_reply *next; + char *host; + unsigned short priority; + unsigned short weight; + unsigned short port; }; struct ares_mx_reply { - struct ares_mx_reply *next; - char *host; - unsigned short priority; + struct ares_mx_reply *next; + char *host; + unsigned short priority; }; struct ares_txt_reply { - struct ares_txt_reply *next; - unsigned char *txt; - size_t length; /* length excludes null termination */ + struct ares_txt_reply *next; + unsigned char *txt; + size_t length; /* length excludes null termination */ }; /* NOTE: This structure is a superset of ares_txt_reply */ struct ares_txt_ext { - struct ares_txt_ext *next; - unsigned char *txt; - size_t length; + struct ares_txt_ext *next; + unsigned char *txt; + size_t length; /* 1 - if start of new record * 0 - if a chunk in the same record */ - unsigned char record_start; + unsigned char record_start; }; struct ares_naptr_reply { @@ -610,11 +593,11 @@ struct ares_soa_reply { }; struct ares_uri_reply { - struct ares_uri_reply *next; - unsigned short priority; - unsigned short weight; - char *uri; - int ttl; + struct ares_uri_reply *next; + unsigned short priority; + unsigned short weight; + char *uri; + int ttl; }; /* @@ -664,60 +647,46 @@ struct ares_addrinfo_hints { ** so written. */ -CARES_EXTERN int ares_parse_a_reply(const unsigned char *abuf, - int alen, - struct hostent **host, - struct ares_addrttl *addrttls, - int *naddrttls); - -CARES_EXTERN int ares_parse_aaaa_reply(const unsigned char *abuf, - int alen, - struct hostent **host, - struct ares_addr6ttl *addrttls, - int *naddrttls); - -CARES_EXTERN int ares_parse_caa_reply(const unsigned char* abuf, - int alen, - struct ares_caa_reply** caa_out); - -CARES_EXTERN int ares_parse_ptr_reply(const unsigned char *abuf, - int alen, - const void *addr, - int addrlen, - int family, - struct hostent **host); +CARES_EXTERN int ares_parse_a_reply(const unsigned char *abuf, int alen, + struct hostent **host, + struct ares_addrttl *addrttls, + int *naddrttls); + +CARES_EXTERN int ares_parse_aaaa_reply(const unsigned char *abuf, int alen, + struct hostent **host, + struct ares_addr6ttl *addrttls, + int *naddrttls); -CARES_EXTERN int ares_parse_ns_reply(const unsigned char *abuf, - int alen, - struct hostent **host); +CARES_EXTERN int ares_parse_caa_reply(const unsigned char *abuf, int alen, + struct ares_caa_reply **caa_out); -CARES_EXTERN int ares_parse_srv_reply(const unsigned char* abuf, - int alen, - struct ares_srv_reply** srv_out); +CARES_EXTERN int ares_parse_ptr_reply(const unsigned char *abuf, int alen, + const void *addr, int addrlen, int family, + struct hostent **host); -CARES_EXTERN int ares_parse_mx_reply(const unsigned char* abuf, - int alen, - struct ares_mx_reply** mx_out); +CARES_EXTERN int ares_parse_ns_reply(const unsigned char *abuf, int alen, + struct hostent **host); + +CARES_EXTERN int ares_parse_srv_reply(const unsigned char *abuf, int alen, + struct ares_srv_reply **srv_out); + +CARES_EXTERN int ares_parse_mx_reply(const unsigned char *abuf, int alen, + struct ares_mx_reply **mx_out); -CARES_EXTERN int ares_parse_txt_reply(const unsigned char* abuf, - int alen, - struct ares_txt_reply** txt_out); +CARES_EXTERN int ares_parse_txt_reply(const unsigned char *abuf, int alen, + struct ares_txt_reply **txt_out); -CARES_EXTERN int ares_parse_txt_reply_ext(const unsigned char* abuf, - int alen, - struct ares_txt_ext** txt_out); +CARES_EXTERN int ares_parse_txt_reply_ext(const unsigned char *abuf, int alen, + struct ares_txt_ext **txt_out); -CARES_EXTERN int ares_parse_naptr_reply(const unsigned char* abuf, - int alen, - struct ares_naptr_reply** naptr_out); +CARES_EXTERN int ares_parse_naptr_reply(const unsigned char *abuf, int alen, + struct ares_naptr_reply **naptr_out); -CARES_EXTERN int ares_parse_soa_reply(const unsigned char* abuf, - int alen, - struct ares_soa_reply** soa_out); +CARES_EXTERN int ares_parse_soa_reply(const unsigned char *abuf, int alen, + struct ares_soa_reply **soa_out); -CARES_EXTERN int ares_parse_uri_reply(const unsigned char* abuf, - int alen, - struct ares_uri_reply** uri_out); +CARES_EXTERN int ares_parse_uri_reply(const unsigned char *abuf, int alen, + struct ares_uri_reply **uri_out); CARES_EXTERN void ares_free_string(void *str); @@ -729,7 +698,8 @@ CARES_EXTERN const char *ares_strerror(int code); struct ares_addr_node { struct ares_addr_node *next; - int family; + int family; + union { struct in_addr addr4; struct ares_in6_addr addr6; @@ -738,39 +708,50 @@ struct ares_addr_node { struct ares_addr_port_node { struct ares_addr_port_node *next; - int family; + int family; + union { struct in_addr addr4; struct ares_in6_addr addr6; } addr; + int udp_port; int tcp_port; }; -CARES_EXTERN int ares_set_servers(ares_channel channel, - struct ares_addr_node *servers); -CARES_EXTERN int ares_set_servers_ports(ares_channel channel, - struct ares_addr_port_node *servers); +CARES_EXTERN int ares_set_servers(ares_channel_t *channel, + const struct ares_addr_node *servers); +CARES_EXTERN int + ares_set_servers_ports(ares_channel_t *channel, + const struct ares_addr_port_node *servers); -/* Incomming string format: host[:port][,host[:port]]... */ -CARES_EXTERN int ares_set_servers_csv(ares_channel channel, - const char* servers); -CARES_EXTERN int ares_set_servers_ports_csv(ares_channel channel, - const char* servers); +/* Incoming string format: host[:port][,host[:port]]... */ +CARES_EXTERN int ares_set_servers_csv(ares_channel_t *channel, + const char *servers); +CARES_EXTERN int ares_set_servers_ports_csv(ares_channel_t *channel, + const char *servers); -CARES_EXTERN int ares_get_servers(ares_channel channel, - struct ares_addr_node **servers); -CARES_EXTERN int ares_get_servers_ports(ares_channel channel, - struct ares_addr_port_node **servers); +CARES_EXTERN int ares_get_servers(ares_channel_t *channel, + struct ares_addr_node **servers); +CARES_EXTERN int ares_get_servers_ports(ares_channel_t *channel, + struct ares_addr_port_node **servers); CARES_EXTERN const char *ares_inet_ntop(int af, const void *src, char *dst, ares_socklen_t size); -CARES_EXTERN int ares_inet_pton(int af, const char *src, void *dst); +CARES_EXTERN int ares_inet_pton(int af, const char *src, void *dst); +/*! Whether or not the c-ares library was built with threadsafety + * + * \return ARES_TRUE if built with threadsafety, ARES_FALSE if not + */ +CARES_EXTERN ares_bool_t ares_threadsafety(void); -#ifdef __cplusplus +#ifdef __cplusplus } #endif +/* DNS record parser, writer, and helpers */ +#include "ares_dns_record.h" + #endif /* ARES__H */ diff --git a/deps/cares/include/ares_dns.h b/deps/cares/include/ares_dns.h index e49c3d26ab1aa8..46edbbbc5289c6 100644 --- a/deps/cares/include/ares_dns.h +++ b/deps/cares/include/ares_dns.h @@ -40,84 +40,88 @@ * Macro DNS__16BIT reads a network short (16 bit) given in network * byte order, and returns its value as an unsigned short. */ -#define DNS__16BIT(p) ((unsigned short)((unsigned int) 0xffff & \ - (((unsigned int)((unsigned char)(p)[0]) << 8U) | \ - ((unsigned int)((unsigned char)(p)[1]))))) +#define DNS__16BIT(p) \ + ((unsigned short)((unsigned int)0xffff & \ + (((unsigned int)((unsigned char)(p)[0]) << 8U) | \ + ((unsigned int)((unsigned char)(p)[1]))))) /* * Macro DNS__32BIT reads a network long (32 bit) given in network * byte order, and returns its value as an unsigned int. */ -#define DNS__32BIT(p) ((unsigned int) \ - (((unsigned int)((unsigned char)(p)[0]) << 24U) | \ - ((unsigned int)((unsigned char)(p)[1]) << 16U) | \ - ((unsigned int)((unsigned char)(p)[2]) << 8U) | \ - ((unsigned int)((unsigned char)(p)[3])))) +#define DNS__32BIT(p) \ + ((unsigned int)(((unsigned int)((unsigned char)(p)[0]) << 24U) | \ + ((unsigned int)((unsigned char)(p)[1]) << 16U) | \ + ((unsigned int)((unsigned char)(p)[2]) << 8U) | \ + ((unsigned int)((unsigned char)(p)[3])))) -#define DNS__SET16BIT(p, v) (((p)[0] = (unsigned char)(((v) >> 8) & 0xff)), \ - ((p)[1] = (unsigned char)((v) & 0xff))) -#define DNS__SET32BIT(p, v) (((p)[0] = (unsigned char)(((v) >> 24) & 0xff)), \ - ((p)[1] = (unsigned char)(((v) >> 16) & 0xff)), \ - ((p)[2] = (unsigned char)(((v) >> 8) & 0xff)), \ - ((p)[3] = (unsigned char)((v) & 0xff))) +#define DNS__SET16BIT(p, v) \ + (((p)[0] = (unsigned char)(((v) >> 8) & 0xff)), \ + ((p)[1] = (unsigned char)((v) & 0xff))) +#define DNS__SET32BIT(p, v) \ + (((p)[0] = (unsigned char)(((v) >> 24) & 0xff)), \ + ((p)[1] = (unsigned char)(((v) >> 16) & 0xff)), \ + ((p)[2] = (unsigned char)(((v) >> 8) & 0xff)), \ + ((p)[3] = (unsigned char)((v) & 0xff))) #if 0 /* we cannot use this approach on systems where we can't access 16/32 bit data on un-aligned addresses */ -#define DNS__16BIT(p) ntohs(*(unsigned short*)(p)) -#define DNS__32BIT(p) ntohl(*(unsigned long*)(p)) -#define DNS__SET16BIT(p, v) *(unsigned short*)(p) = htons(v) -#define DNS__SET32BIT(p, v) *(unsigned long*)(p) = htonl(v) +# define DNS__16BIT(p) ntohs(*(unsigned short *)(p)) +# define DNS__32BIT(p) ntohl(*(unsigned long *)(p)) +# define DNS__SET16BIT(p, v) *(unsigned short *)(p) = htons(v) +# define DNS__SET32BIT(p, v) *(unsigned long *)(p) = htonl(v) #endif /* Macros for parsing a DNS header */ -#define DNS_HEADER_QID(h) DNS__16BIT(h) -#define DNS_HEADER_QR(h) (((h)[2] >> 7) & 0x1) -#define DNS_HEADER_OPCODE(h) (((h)[2] >> 3) & 0xf) -#define DNS_HEADER_AA(h) (((h)[2] >> 2) & 0x1) -#define DNS_HEADER_TC(h) (((h)[2] >> 1) & 0x1) -#define DNS_HEADER_RD(h) ((h)[2] & 0x1) -#define DNS_HEADER_RA(h) (((h)[3] >> 7) & 0x1) -#define DNS_HEADER_Z(h) (((h)[3] >> 4) & 0x7) -#define DNS_HEADER_RCODE(h) ((h)[3] & 0xf) -#define DNS_HEADER_QDCOUNT(h) DNS__16BIT((h) + 4) -#define DNS_HEADER_ANCOUNT(h) DNS__16BIT((h) + 6) -#define DNS_HEADER_NSCOUNT(h) DNS__16BIT((h) + 8) -#define DNS_HEADER_ARCOUNT(h) DNS__16BIT((h) + 10) +#define DNS_HEADER_QID(h) DNS__16BIT(h) +#define DNS_HEADER_QR(h) (((h)[2] >> 7) & 0x1) +#define DNS_HEADER_OPCODE(h) (((h)[2] >> 3) & 0xf) +#define DNS_HEADER_AA(h) (((h)[2] >> 2) & 0x1) +#define DNS_HEADER_TC(h) (((h)[2] >> 1) & 0x1) +#define DNS_HEADER_RD(h) ((h)[2] & 0x1) +#define DNS_HEADER_RA(h) (((h)[3] >> 7) & 0x1) +#define DNS_HEADER_Z(h) (((h)[3] >> 4) & 0x7) +#define DNS_HEADER_RCODE(h) ((h)[3] & 0xf) +#define DNS_HEADER_QDCOUNT(h) DNS__16BIT((h) + 4) +#define DNS_HEADER_ANCOUNT(h) DNS__16BIT((h) + 6) +#define DNS_HEADER_NSCOUNT(h) DNS__16BIT((h) + 8) +#define DNS_HEADER_ARCOUNT(h) DNS__16BIT((h) + 10) /* Macros for constructing a DNS header */ -#define DNS_HEADER_SET_QID(h, v) DNS__SET16BIT(h, v) -#define DNS_HEADER_SET_QR(h, v) ((h)[2] |= (unsigned char)(((v) & 0x1) << 7)) -#define DNS_HEADER_SET_OPCODE(h, v) ((h)[2] |= (unsigned char)(((v) & 0xf) << 3)) -#define DNS_HEADER_SET_AA(h, v) ((h)[2] |= (unsigned char)(((v) & 0x1) << 2)) -#define DNS_HEADER_SET_TC(h, v) ((h)[2] |= (unsigned char)(((v) & 0x1) << 1)) -#define DNS_HEADER_SET_RD(h, v) ((h)[2] |= (unsigned char)((v) & 0x1)) -#define DNS_HEADER_SET_RA(h, v) ((h)[3] |= (unsigned char)(((v) & 0x1) << 7)) -#define DNS_HEADER_SET_Z(h, v) ((h)[3] |= (unsigned char)(((v) & 0x7) << 4)) -#define DNS_HEADER_SET_RCODE(h, v) ((h)[3] |= (unsigned char)((v) & 0xf)) -#define DNS_HEADER_SET_QDCOUNT(h, v) DNS__SET16BIT((h) + 4, v) -#define DNS_HEADER_SET_ANCOUNT(h, v) DNS__SET16BIT((h) + 6, v) -#define DNS_HEADER_SET_NSCOUNT(h, v) DNS__SET16BIT((h) + 8, v) -#define DNS_HEADER_SET_ARCOUNT(h, v) DNS__SET16BIT((h) + 10, v) +#define DNS_HEADER_SET_QID(h, v) DNS__SET16BIT(h, v) +#define DNS_HEADER_SET_QR(h, v) ((h)[2] |= (unsigned char)(((v) & 0x1) << 7)) +#define DNS_HEADER_SET_OPCODE(h, v) \ + ((h)[2] |= (unsigned char)(((v) & 0xf) << 3)) +#define DNS_HEADER_SET_AA(h, v) ((h)[2] |= (unsigned char)(((v) & 0x1) << 2)) +#define DNS_HEADER_SET_TC(h, v) ((h)[2] |= (unsigned char)(((v) & 0x1) << 1)) +#define DNS_HEADER_SET_RD(h, v) ((h)[2] |= (unsigned char)((v) & 0x1)) +#define DNS_HEADER_SET_RA(h, v) ((h)[3] |= (unsigned char)(((v) & 0x1) << 7)) +#define DNS_HEADER_SET_Z(h, v) ((h)[3] |= (unsigned char)(((v) & 0x7) << 4)) +#define DNS_HEADER_SET_RCODE(h, v) ((h)[3] |= (unsigned char)((v) & 0xf)) +#define DNS_HEADER_SET_QDCOUNT(h, v) DNS__SET16BIT((h) + 4, v) +#define DNS_HEADER_SET_ANCOUNT(h, v) DNS__SET16BIT((h) + 6, v) +#define DNS_HEADER_SET_NSCOUNT(h, v) DNS__SET16BIT((h) + 8, v) +#define DNS_HEADER_SET_ARCOUNT(h, v) DNS__SET16BIT((h) + 10, v) /* Macros for parsing the fixed part of a DNS question */ -#define DNS_QUESTION_TYPE(q) DNS__16BIT(q) -#define DNS_QUESTION_CLASS(q) DNS__16BIT((q) + 2) +#define DNS_QUESTION_TYPE(q) DNS__16BIT(q) +#define DNS_QUESTION_CLASS(q) DNS__16BIT((q) + 2) /* Macros for constructing the fixed part of a DNS question */ -#define DNS_QUESTION_SET_TYPE(q, v) DNS__SET16BIT(q, v) -#define DNS_QUESTION_SET_CLASS(q, v) DNS__SET16BIT((q) + 2, v) +#define DNS_QUESTION_SET_TYPE(q, v) DNS__SET16BIT(q, v) +#define DNS_QUESTION_SET_CLASS(q, v) DNS__SET16BIT((q) + 2, v) /* Macros for parsing the fixed part of a DNS resource record */ -#define DNS_RR_TYPE(r) DNS__16BIT(r) -#define DNS_RR_CLASS(r) DNS__16BIT((r) + 2) -#define DNS_RR_TTL(r) DNS__32BIT((r) + 4) -#define DNS_RR_LEN(r) DNS__16BIT((r) + 8) +#define DNS_RR_TYPE(r) DNS__16BIT(r) +#define DNS_RR_CLASS(r) DNS__16BIT((r) + 2) +#define DNS_RR_TTL(r) DNS__32BIT((r) + 4) +#define DNS_RR_LEN(r) DNS__16BIT((r) + 8) /* Macros for constructing the fixed part of a DNS resource record */ -#define DNS_RR_SET_TYPE(r, v) DNS__SET16BIT(r, v) -#define DNS_RR_SET_CLASS(r, v) DNS__SET16BIT((r) + 2, v) -#define DNS_RR_SET_TTL(r, v) DNS__SET32BIT((r) + 4, v) -#define DNS_RR_SET_LEN(r, v) DNS__SET16BIT((r) + 8, v) +#define DNS_RR_SET_TYPE(r, v) DNS__SET16BIT(r, v) +#define DNS_RR_SET_CLASS(r, v) DNS__SET16BIT((r) + 2, v) +#define DNS_RR_SET_TTL(r, v) DNS__SET32BIT((r) + 4, v) +#define DNS_RR_SET_LEN(r, v) DNS__SET16BIT((r) + 8, v) #endif /* HEADER_CARES_DNS_H */ diff --git a/deps/cares/include/ares_dns_record.h b/deps/cares/include/ares_dns_record.h new file mode 100644 index 00000000000000..2cc16982ba4f1e --- /dev/null +++ b/deps/cares/include/ares_dns_record.h @@ -0,0 +1,954 @@ +/* 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_RECORD_H +#define __ARES_DNS_RECORD_H + +/* Include ares.h, not this file directly */ + +#ifdef __cplusplus +extern "C" { +#endif + +/*! \addtogroup ares_dns_record DNS Record Handling + * + * This is a set of functions to create and manipulate DNS records. + * + * @{ + */ + +/*! DNS Record types handled by c-ares. Some record types may only be valid + * on requests (e.g. ARES_REC_TYPE_ANY), and some may only be valid on + * responses */ +typedef enum { + ARES_REC_TYPE_A = 1, /*!< Host address. */ + ARES_REC_TYPE_NS = 2, /*!< Authoritative server. */ + ARES_REC_TYPE_CNAME = 5, /*!< Canonical name. */ + ARES_REC_TYPE_SOA = 6, /*!< Start of authority zone. */ + ARES_REC_TYPE_PTR = 12, /*!< Domain name pointer. */ + ARES_REC_TYPE_HINFO = 13, /*!< Host information. */ + ARES_REC_TYPE_MX = 15, /*!< Mail routing information. */ + ARES_REC_TYPE_TXT = 16, /*!< Text strings. */ + ARES_REC_TYPE_AAAA = 28, /*!< RFC 3596. Ip6 Address. */ + ARES_REC_TYPE_SRV = 33, /*!< RFC 2782. Server Selection. */ + ARES_REC_TYPE_NAPTR = 35, /*!< RFC 3403. Naming Authority Pointer */ + ARES_REC_TYPE_OPT = 41, /*!< RFC 6891. EDNS0 option (meta-RR) */ + + ARES_REC_TYPE_TLSA = 52, /*!< RFC 6698. DNS-Based Authentication of Named + * Entities (DANE) Transport Layer Security + * (TLS) Protocol: TLSA */ + ARES_REC_TYPE_SVCB = 64, /*!< RFC 9460. General Purpose Service Binding */ + ARES_REC_TYPE_HTTPS = 65, /*!< RFC 9460. Service Binding type for use with + * HTTPS */ + ARES_REC_TYPE_ANY = 255, /*!< Wildcard match. Not response RR. */ + ARES_REC_TYPE_URI = 256, /*!< RFC 7553. Uniform Resource Identifier */ + ARES_REC_TYPE_CAA = 257, /*!< RFC 6844. Certification Authority + * Authorization. */ + ARES_REC_TYPE_RAW_RR = 65536 /*!< Used as an indicator that the RR record + * is not parsed, but provided in wire + * format */ +} ares_dns_rec_type_t; + +/*! DNS Classes for requests and responses. */ +typedef enum { + ARES_CLASS_IN = 1, /*!< Internet */ + ARES_CLASS_CHAOS = 3, /*!< CHAOS */ + ARES_CLASS_HESOID = 4, /*!< Hesoid [Dyer 87] */ + ARES_CLASS_NONE = 254, /*!< RFC 2136 */ + ARES_CLASS_ANY = 255 /*!< Any class (requests only) */ +} ares_dns_class_t; + +/*! DNS RR Section type */ +typedef enum { + ARES_SECTION_ANSWER = 1, /*!< Answer section */ + ARES_SECTION_AUTHORITY = 2, /*!< Authority section */ + ARES_SECTION_ADDITIONAL = 3 /*!< Additional information section */ +} ares_dns_section_t; + +/*! DNS Header opcodes */ +typedef enum { + ARES_OPCODE_QUERY = 0, /*!< Standard query */ + ARES_OPCODE_IQUERY = 1, /*!< Inverse query. Obsolete. */ + ARES_OPCODE_STATUS = 2, /*!< Name server status query */ + ARES_OPCODE_NOTIFY = 4, /*!< Zone change notification (RFC 1996) */ + ARES_OPCODE_UPDATE = 5, /*!< Zone update message (RFC2136) */ +} ares_dns_opcode_t; + +/*! DNS Header flags */ +typedef enum { + ARES_FLAG_QR = 1 << 0, /*!< QR. If set, is a response */ + ARES_FLAG_AA = 1 << 1, /*!< Authoritative Answer. If set, is authoritative */ + ARES_FLAG_TC = 1 << 2, /*!< Truncation. If set, is truncated response */ + ARES_FLAG_RD = 1 << 3, /*!< Recursion Desired. If set, recursion is desired */ + ARES_FLAG_RA = 1 << 4, /*!< Recursion Available. If set, server supports + * recursion */ + ARES_FLAG_AD = 1 << 5, /*!< RFC 2065. Authentic Data bit indicates in a + * response that the data included has been verified by + * the server providing it */ + ARES_FLAG_CD = 1 << 6, /*!< RFC 2065. Checking Disabled bit indicates in a + * query that non-verified data is acceptable to the + * resolver sending the query. */ +} ares_dns_flags_t; + +/*! DNS Response Codes from server */ +typedef enum { + ARES_RCODE_NOERROR = 0, /*!< Success */ + ARES_RCODE_FORMERR = 1, /*!< Format error. The name server was unable + * to interpret the query. */ + ARES_RCODE_SERVFAIL = 2, /*!< Server Failure. The name server was + * unable to process this query due to a + * problem with the nameserver */ + ARES_RCODE_NXDOMAIN = 3, /*!< Name Error. Meaningful only for + * responses from an authoritative name + * server, this code signifies that the + * domain name referenced in the query does + * not exist. */ + ARES_RCODE_NOTIMP = 4, /*!< Not implemented. The name server does + * not support the requested kind of + * query */ + ARES_RCODE_REFUSED = 5, /*!< Refused. The name server refuses to + * perform the specified operation for + * policy reasons. */ + ARES_RCODE_YXDOMAIN = 6, /*!< RFC 2136. Some name that ought not to + * exist, does exist. */ + ARES_RCODE_YXRRSET = 7, /*!< RFC 2136. Some RRset that ought to not + * exist, does exist. */ + ARES_RCODE_NXRRSET = 8, /*!< RFC 2136. Some RRset that ought to exist, + * does not exist. */ + ARES_RCODE_NOTAUTH = 9, /*!< RFC 2136. The server is not authoritative + * for the zone named in the Zone section. + */ + ARES_RCODE_NOTZONE = 10, /*!< RFC 2136. A name used in the Prerequisite + * or Update Section is not within the zone + * denoted by the Zone Section. */ + ARES_RCODE_DSOTYPEI = 11, /*!< RFC 8409. DSO-TYPE Not implemented */ + ARES_RCODE_BADSIG = 16, /*!< RFC 8945. TSIG Signature Failure */ + ARES_RCODE_BADKEY = 17, /*!< RFC 8945. Key not recognized. */ + ARES_RCODE_BADTIME = 18, /*!< RFC 8945. Signature out of time window. */ + ARES_RCODE_BADMODE = 19, /*!< RFC 2930. Bad TKEY Mode */ + ARES_RCODE_BADNAME = 20, /*!< RFC 2930. Duplicate Key Name */ + ARES_RCODE_BADALG = 21, /*!< RFC 2930. Algorithm not supported */ + ARES_RCODE_BADTRUNC = 22, /*!< RFC 8945. Bad Truncation */ + ARES_RCODE_BADCOOKIE = 23, /*!< RVC 7973. Bad/missing Server Cookie */ +} ares_dns_rcode_t; + +/*! Data types used */ +typedef enum { + ARES_DATATYPE_INADDR = 1, /*!< struct in_addr * type */ + ARES_DATATYPE_INADDR6 = 2, /*!< struct ares_in6_addr * type */ + ARES_DATATYPE_U8 = 3, /*!< 8bit unsigned integer */ + ARES_DATATYPE_U16 = 4, /*!< 16bit unsigned integer */ + ARES_DATATYPE_U32 = 5, /*!< 32bit unsigned integer */ + ARES_DATATYPE_NAME = 6, /*!< Null-terminated string of a domain name */ + ARES_DATATYPE_STR = 7, /*!< Null-terminated string */ + ARES_DATATYPE_BIN = 8, /*!< Binary data */ + ARES_DATATYPE_BINP = 9, /*!< Officially defined as binary data, but likely + * printable. Guaranteed to have a NULL + * terminator for convenience (not included in + * length) */ + ARES_DATATYPE_OPT = 10, /*!< Array of options. 16bit identifier, BIN + * data. */ +} ares_dns_datatype_t; + +/*! Keys used for all RR Types. We take the record type and multiply by 100 + * to ensure we have a proper offset between keys so we can keep these sorted + */ +typedef enum { + /*! A Record. Address. Datatype: INADDR */ + ARES_RR_A_ADDR = (ARES_REC_TYPE_A * 100) + 1, + /*! NS Record. Name. Datatype: NAME */ + ARES_RR_NS_NSDNAME = (ARES_REC_TYPE_NS * 100) + 1, + /*! CNAME Record. CName. Datatype: NAME */ + ARES_RR_CNAME_CNAME = (ARES_REC_TYPE_CNAME * 100) + 1, + /*! SOA Record. MNAME, Primary Source of Data. Datatype: NAME */ + ARES_RR_SOA_MNAME = (ARES_REC_TYPE_SOA * 100) + 1, + /*! SOA Record. RNAME, Mailbox of person responsible. Datatype: NAME */ + ARES_RR_SOA_RNAME = (ARES_REC_TYPE_SOA * 100) + 2, + /*! SOA Record. Serial, version. Datatype: U32 */ + ARES_RR_SOA_SERIAL = (ARES_REC_TYPE_SOA * 100) + 3, + /*! SOA Record. Refresh, zone refersh interval. Datatype: U32 */ + ARES_RR_SOA_REFRESH = (ARES_REC_TYPE_SOA * 100) + 4, + /*! SOA Record. Retry, failed refresh retry interval. Datatype: U32 */ + ARES_RR_SOA_RETRY = (ARES_REC_TYPE_SOA * 100) + 5, + /*! SOA Record. Expire, upper limit on authority. Datatype: U32 */ + ARES_RR_SOA_EXPIRE = (ARES_REC_TYPE_SOA * 100) + 6, + /*! SOA Record. Minimum, RR TTL. Datatype: U32 */ + ARES_RR_SOA_MINIMUM = (ARES_REC_TYPE_SOA * 100) + 7, + /*! PTR Record. DNAME, pointer domain. Datatype: NAME */ + ARES_RR_PTR_DNAME = (ARES_REC_TYPE_PTR * 100) + 1, + /*! HINFO Record. CPU. Datatype: STR */ + ARES_RR_HINFO_CPU = (ARES_REC_TYPE_HINFO * 100) + 1, + /*! HINFO Record. OS. Datatype: STR */ + ARES_RR_HINFO_OS = (ARES_REC_TYPE_HINFO * 100) + 2, + /*! MX Record. Preference. Datatype: U16 */ + ARES_RR_MX_PREFERENCE = (ARES_REC_TYPE_MX * 100) + 1, + /*! MX Record. Exchange, domain. Datatype: NAME */ + ARES_RR_MX_EXCHANGE = (ARES_REC_TYPE_MX * 100) + 2, + /*! TXT Record. Data. Datatype: BINP */ + ARES_RR_TXT_DATA = (ARES_REC_TYPE_TXT * 100) + 1, + /*! AAAA Record. Address. Datatype: INADDR6 */ + ARES_RR_AAAA_ADDR = (ARES_REC_TYPE_AAAA * 100) + 1, + /*! SRV Record. Priority. Datatype: U16 */ + ARES_RR_SRV_PRIORITY = (ARES_REC_TYPE_SRV * 100) + 2, + /*! SRV Record. Weight. Datatype: U16 */ + ARES_RR_SRV_WEIGHT = (ARES_REC_TYPE_SRV * 100) + 3, + /*! SRV Record. Port. Datatype: U16 */ + ARES_RR_SRV_PORT = (ARES_REC_TYPE_SRV * 100) + 4, + /*! SRV Record. Target domain. Datatype: NAME */ + ARES_RR_SRV_TARGET = (ARES_REC_TYPE_SRV * 100) + 5, + /*! NAPTR Record. Order. Datatype: U16 */ + ARES_RR_NAPTR_ORDER = (ARES_REC_TYPE_NAPTR * 100) + 1, + /*! NAPTR Record. Preference. Datatype: U16 */ + ARES_RR_NAPTR_PREFERENCE = (ARES_REC_TYPE_NAPTR * 100) + 2, + /*! NAPTR Record. Flags. Datatype: STR */ + ARES_RR_NAPTR_FLAGS = (ARES_REC_TYPE_NAPTR * 100) + 3, + /*! NAPTR Record. Services. Datatype: STR */ + ARES_RR_NAPTR_SERVICES = (ARES_REC_TYPE_NAPTR * 100) + 4, + /*! NAPTR Record. Regexp. Datatype: STR */ + ARES_RR_NAPTR_REGEXP = (ARES_REC_TYPE_NAPTR * 100) + 5, + /*! NAPTR Record. Replacement. Datatype: NAME */ + ARES_RR_NAPTR_REPLACEMENT = (ARES_REC_TYPE_NAPTR * 100) + 6, + /*! OPT Record. UDP Size. Datatype: U16 */ + ARES_RR_OPT_UDP_SIZE = (ARES_REC_TYPE_OPT * 100) + 1, + /*! OPT Record. Version. Datatype: U8 */ + ARES_RR_OPT_VERSION = (ARES_REC_TYPE_OPT * 100) + 3, + /*! OPT Record. Flags. Datatype: U16 */ + ARES_RR_OPT_FLAGS = (ARES_REC_TYPE_OPT * 100) + 4, + /*! OPT Record. Options. Datatype: OPT */ + ARES_RR_OPT_OPTIONS = (ARES_REC_TYPE_OPT * 100) + 5, + /*! TLSA Record. Certificate Usage. Datatype: U8 */ + ARES_RR_TLSA_CERT_USAGE = (ARES_REC_TYPE_TLSA * 100) + 1, + /*! TLSA Record. Selector. Datatype: U8 */ + ARES_RR_TLSA_SELECTOR = (ARES_REC_TYPE_TLSA * 100) + 2, + /*! TLSA Record. Matching Type. Datatype: U8 */ + ARES_RR_TLSA_MATCH = (ARES_REC_TYPE_TLSA * 100) + 3, + /*! TLSA Record. Certificate Association Data. Datatype: BIN */ + ARES_RR_TLSA_DATA = (ARES_REC_TYPE_TLSA * 100) + 4, + /*! SVCB Record. SvcPriority. Datatype: U16 */ + ARES_RR_SVCB_PRIORITY = (ARES_REC_TYPE_SVCB * 100) + 1, + /*! SVCB Record. TargetName. Datatype: NAME */ + ARES_RR_SVCB_TARGET = (ARES_REC_TYPE_SVCB * 100) + 2, + /*! SVCB Record. SvcParams. Datatype: OPT */ + ARES_RR_SVCB_PARAMS = (ARES_REC_TYPE_SVCB * 100) + 3, + /*! HTTPS Record. SvcPriority. Datatype: U16 */ + ARES_RR_HTTPS_PRIORITY = (ARES_REC_TYPE_HTTPS * 100) + 1, + /*! HTTPS Record. TargetName. Datatype: NAME */ + ARES_RR_HTTPS_TARGET = (ARES_REC_TYPE_HTTPS * 100) + 2, + /*! HTTPS Record. SvcParams. Datatype: OPT */ + ARES_RR_HTTPS_PARAMS = (ARES_REC_TYPE_HTTPS * 100) + 3, + /*! URI Record. Priority. Datatype: U16 */ + ARES_RR_URI_PRIORITY = (ARES_REC_TYPE_URI * 100) + 1, + /*! URI Record. Weight. Datatype: U16 */ + ARES_RR_URI_WEIGHT = (ARES_REC_TYPE_URI * 100) + 2, + /*! URI Record. Target domain. Datatype: NAME */ + ARES_RR_URI_TARGET = (ARES_REC_TYPE_URI * 100) + 3, + /*! CAA Record. Critical flag. Datatype: U8 */ + ARES_RR_CAA_CRITICAL = (ARES_REC_TYPE_CAA * 100) + 1, + /*! CAA Record. Tag/Property. Datatype: STR */ + ARES_RR_CAA_TAG = (ARES_REC_TYPE_CAA * 100) + 2, + /*! CAA Record. Value. Datatype: BINP */ + ARES_RR_CAA_VALUE = (ARES_REC_TYPE_CAA * 100) + 3, + /*! RAW Record. RR Type. Datatype: U16 */ + ARES_RR_RAW_RR_TYPE = (ARES_REC_TYPE_RAW_RR * 100) + 1, + /*! RAW Record. RR Data. Datatype: BIN */ + ARES_RR_RAW_RR_DATA = (ARES_REC_TYPE_RAW_RR * 100) + 2, +} ares_dns_rr_key_t; + +/*! TLSA Record ARES_RR_TLSA_CERT_USAGE known values */ +typedef enum { + /*! Certificate Usage 0. CA Constraint. */ + ARES_TLSA_USAGE_CA = 0, + /*! Certificate Usage 1. Service Certificate Constraint. */ + ARES_TLSA_USAGE_SERVICE = 1, + /*! Certificate Usage 2. Trust Anchor Assertion. */ + ARES_TLSA_USAGE_TRUSTANCHOR = 2, + /*! Certificate Usage 3. Domain-issued certificate. */ + ARES_TLSA_USAGE_DOMAIN = 3 +} ares_tlsa_usage_t; + +/*! TLSA Record ARES_RR_TLSA_SELECTOR known values */ +typedef enum { + /*! Full Certificate */ + ARES_TLSA_SELECTOR_FULL = 0, + /*! DER-encoded SubjectPublicKeyInfo */ + ARES_TLSA_SELECTOR_SUBJPUBKEYINFO = 1 +} ares_tlsa_selector_t; + +/*! TLSA Record ARES_RR_TLSA_MATCH known values */ +typedef enum { + /*! Exact match */ + ARES_TLSA_MATCH_EXACT = 0, + /*! Sha256 match */ + ARES_TLSA_MATCH_SHA256 = 1, + /*! Sha512 match */ + ARES_TLSA_MATCH_SHA512 = 2 +} ares_tlsa_match_t; + +/*! SVCB (and HTTPS) RR known parameters */ +typedef enum { + /*! Mandatory keys in this RR (RFC 9460 Section 8) */ + ARES_SVCB_PARAM_MANDATORY = 0, + /*! Additional supported protocols (RFC 9460 Section 7.1) */ + ARES_SVCB_PARAM_ALPN = 1, + /*! No support for default protocol (RFC 9460 Section 7.1) */ + ARES_SVCB_PARAM_NO_DEFAULT_ALPN = 2, + /*! Port for alternative endpoint (RFC 9460 Section 7.2) */ + ARES_SVCB_PARAM_PORT = 3, + /*! IPv4 address hints (RFC 9460 Section 7.3) */ + ARES_SVCB_PARAM_IPV4HINT = 4, + /*! RESERVED (held for Encrypted ClientHello) */ + ARES_SVCB_PARAM_ECH = 5, + /*! IPv6 address hints (RFC 9460 Section 7.3) */ + ARES_SVCB_PARAM_IPV6HINT = 6 +} ares_svcb_param_t; + +/*! OPT RR known parameters */ +typedef enum { + /*! RFC 8764. Apple's DNS Long-Lived Queries Protocol */ + ARES_OPT_PARAM_LLQ = 1, + /*! http://files.dns-sd.org/draft-sekar-dns-ul.txt: Update Lease */ + ARES_OPT_PARAM_UL = 2, + /*! RFC 5001. Name Server Identification */ + ARES_OPT_PARAM_NSID = 3, + /*! RFC 6975. DNSSEC Algorithm Understood */ + ARES_OPT_PARAM_DAU = 5, + /*! RFC 6975. DS Hash Understood */ + ARES_OPT_PARAM_DHU = 6, + /*! RFC 6975. NSEC3 Hash Understood */ + ARES_OPT_PARAM_N3U = 7, + /*! RFC 7871. Client Subnet */ + ARES_OPT_PARAM_EDNS_CLIENT_SUBNET = 8, + /*! RFC 7314. Expire Timer */ + ARES_OPT_PARAM_EDNS_EXPIRE = 9, + /*! RFC 7873. Client and Server Cookies */ + ARES_OPT_PARAM_COOKIE = 10, + /*! RFC 7828. TCP Keepalive timeout */ + ARES_OPT_PARAM_EDNS_TCP_KEEPALIVE = 11, + /*! RFC 7830. Padding */ + ARES_OPT_PARAM_PADDING = 12, + /*! RFC 7901. Chain query requests */ + ARES_OPT_PARAM_CHAIN = 13, + /*! RFC 8145. Signaling Trust Anchor Knowledge in DNSSEC */ + ARES_OPT_PARAM_EDNS_KEY_TAG = 14, + /*! RFC 8914. Extended ERROR code and message */ + ARES_OPT_PARAM_EXTENDED_DNS_ERROR = 15, +} ares_opt_param_t; + +/*! Data type for option records for keys like ARES_RR_OPT_OPTIONS and + * ARES_RR_HTTPS_PARAMS returned by ares_dns_opt_get_datatype() */ +typedef enum { + /*! No value allowed for this option */ + ARES_OPT_DATATYPE_NONE = 1, + /*! List of strings, each prefixed with a single octet representing the length + */ + ARES_OPT_DATATYPE_STR_LIST = 2, + /*! List of 8bit integers, concatenated */ + ARES_OPT_DATATYPE_U8_LIST = 3, + /*! 16bit integer in network byte order */ + ARES_OPT_DATATYPE_U16 = 4, + /*! list of 16bit integer in network byte order, concatenated. */ + ARES_OPT_DATATYPE_U16_LIST = 5, + /*! 32bit integer in network byte order */ + ARES_OPT_DATATYPE_U32 = 6, + /*! list 32bit integer in network byte order, concatenated */ + ARES_OPT_DATATYPE_U32_LIST = 7, + /*! List of ipv4 addresses in network byte order, concatenated */ + ARES_OPT_DATATYPE_INADDR4_LIST = 8, + /*! List of ipv6 addresses in network byte order, concatenated */ + ARES_OPT_DATATYPE_INADDR6_LIST = 9, + /*! Binary Data */ + ARES_OPT_DATATYPE_BIN = 10, + /*! DNS Domain Name Format */ + ARES_OPT_DATATYPE_NAME = 11 +} ares_dns_opt_datatype_t; + +/*! String representation of DNS Record Type + * + * \param[in] type DNS Record Type + * \return string + */ +CARES_EXTERN const char *ares_dns_rec_type_tostr(ares_dns_rec_type_t type); + +/*! String representation of DNS Class + * + * \param[in] qclass DNS Class + * \return string + */ +CARES_EXTERN const char *ares_dns_class_tostr(ares_dns_class_t qclass); + +/*! String representation of DNS OpCode + * + * \param[in] opcode DNS OpCode + * \return string + */ +CARES_EXTERN const char *ares_dns_opcode_tostr(ares_dns_opcode_t opcode); + +/*! String representation of DNS Resource Record Parameter + * + * \param[in] key DNS Resource Record parameter + * \return string + */ +CARES_EXTERN const char *ares_dns_rr_key_tostr(ares_dns_rr_key_t key); + +/*! String representation of DNS Resource Record section + * + * \param[in] section Section + * \return string + */ +CARES_EXTERN const char *ares_dns_section_tostr(ares_dns_section_t section); + +/*! Convert DNS class name as string to ares_dns_class_t + * + * \param[out] qclass Pointer passed by reference to write class + * \param[in] str String to convert + * \return ARES_TRUE on success + */ +CARES_EXTERN ares_bool_t ares_dns_class_fromstr(ares_dns_class_t *qclass, + const char *str); + +/*! Convert DNS record type as string to ares_dns_rec_type_t + * + * \param[out] qclass Pointer passed by reference to write record type + * \param[in] str String to convert + * \return ARES_TRUE on success + */ +CARES_EXTERN ares_bool_t ares_dns_rec_type_fromstr(ares_dns_rec_type_t *qtype, + const char *str); + + +/*! Convert DNS response code as string to from ares_dns_rcode_t + * + * \param[in] rcode Response code to convert + * \return ARES_TRUE on success + */ +CARES_EXTERN const char *ares_dns_rcode_tostr(ares_dns_rcode_t rcode); + +/*! Convert any valid ip address (ipv4 or ipv6) into struct ares_addr and + * return the starting pointer of the network byte order address and the + * length of the address (4 or 16). + * + * \param[in] ipaddr ASCII string form of the ip address + * \param[in,out] addr Must set "family" member to one of AF_UNSPEC, + * AF_INET, AF_INET6 on input. + * \param[out] ptr_len Length of binary form address + * \return Pointer to start of binary address or NULL on error. + */ +CARES_EXTERN const void *ares_dns_pton(const char *ipaddr, + struct ares_addr *addr, size_t *out_len); + +/*! Convert an ip address into the PTR format for in-addr.arpa or in6.arpa + * + * \param[in] addr properly filled address structure + * \return String representing PTR, use ares_free_string() to free + */ +CARES_EXTERN char *ares_dns_addr_to_ptr(const struct ares_addr *addr); + + +/*! The options/parameters extensions to some RRs can be somewhat opaque, this + * is a helper to return the best match for a datatype for interpreting the + * option record. + * + * \param[in] key Key associated with options/parameters + * \param[in] opt Option Key/Parameter + * \return Datatype + */ +CARES_EXTERN ares_dns_opt_datatype_t + ares_dns_opt_get_datatype(ares_dns_rr_key_t key, unsigned short opt); + +/*! The options/parameters extensions to some RRs can be somewhat opaque, this + * is a helper to return the name if the option is known. + * + * \param[in] key Key associated with options/parameters + * \param[in] opt Option Key/Parameter + * \return name, or NULL if not known. + */ +CARES_EXTERN const char *ares_dns_opt_get_name(ares_dns_rr_key_t key, + unsigned short opt); + + +/*! Retrieve a list of Resource Record keys that can be set or retrieved for + * the Resource record type. + * + * \param[in] type Record Type + * \param[out] cnt Number of keys returned + * \return array of keys associated with Resource Record + */ +CARES_EXTERN const ares_dns_rr_key_t * + ares_dns_rr_get_keys(ares_dns_rec_type_t type, size_t *cnt); + +/*! Retrieve the datatype associated with a Resource Record key. + * + * \param[in] key Resource Record Key + * \return datatype + */ +CARES_EXTERN ares_dns_datatype_t + ares_dns_rr_key_datatype(ares_dns_rr_key_t key); + +/*! Retrieve the DNS Resource Record type associated with a Resource Record key. + * + * \param[in] key Resource Record Key + * \return DNS Resource Record Type + */ +CARES_EXTERN ares_dns_rec_type_t + ares_dns_rr_key_to_rec_type(ares_dns_rr_key_t key); + +/*! Opaque data type representing a DNS RR (Resource Record) */ +struct ares_dns_rr; + +/*! Typedef for opaque data type representing a DNS RR (Resource Record) */ +typedef struct ares_dns_rr ares_dns_rr_t; + +/*! Opaque data type representing a DNS Query Data QD Packet */ +struct ares_dns_qd; + +/*! Typedef for opaque data type representing a DNS Query Data QD Packet */ +typedef struct ares_dns_qd ares_dns_qd_t; + +/*! Opaque data type representing a DNS Packet */ +struct ares_dns_record; + +/*! Typedef for opaque data type representing a DNS Packet */ +typedef struct ares_dns_record ares_dns_record_t; + + +/*! Create a new DNS record object + * + * \param[out] dnsrec Pointer passed by reference for a newly allocated + * record object. Must be ares_dns_record_destroy()'d by + * caller. + * \param[in] id DNS Query ID. If structuring a new query to be sent + * with ares_send(), this value should be zero. + * \param[in] flags DNS Flags from \ares_dns_flags_t + * \param[in] opcode DNS OpCode (typically ARES_OPCODE_QUERY) + * \param[in] rcode DNS RCode + * \return ARES_SUCCESS on success + */ +CARES_EXTERN 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); + +/*! Destroy a DNS record object + * + * \param[in] dnsrec Initialized record object + */ +CARES_EXTERN void ares_dns_record_destroy(ares_dns_record_t *dnsrec); + +/*! Get the DNS Query ID + * + * \param[in] dnsrec Initialized record object + * \return DNS query id + */ +CARES_EXTERN unsigned short + ares_dns_record_get_id(const ares_dns_record_t *dnsrec); + +/*! Get the DNS Record Flags + * + * \param[in] dnsrec Initialized record object + * \return One or more \ares_dns_flags_t + */ +CARES_EXTERN unsigned short + ares_dns_record_get_flags(const ares_dns_record_t *dnsrec); + +/*! Get the DNS Record OpCode + * + * \param[in] dnsrec Initialized record object + * \return opcode + */ +CARES_EXTERN ares_dns_opcode_t + ares_dns_record_get_opcode(const ares_dns_record_t *dnsrec); + +/*! Get the DNS Record RCode + * + * \param[in] dnsrec Initialized record object + * \return rcode + */ +CARES_EXTERN ares_dns_rcode_t + ares_dns_record_get_rcode(const ares_dns_record_t *dnsrec); + +/*! Add a query to the DNS Record. Typically a record will have only 1 + * query. Most DNS servers will reject queries with more than 1 question. + * + * \param[in] dnsrec Initialized record object + * \param[in] name Name/Hostname of request + * \param[in] qtype Type of query + * \param[in] qclass Class of query (typically ARES_CLASS_IN) + * \return ARES_SUCCESS on success + */ +CARES_EXTERN 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); + +/*! Get the count of queries in the DNS Record + * + * \param[in] dnsrec Initialized record object + * \return count of queries + */ +CARES_EXTERN size_t ares_dns_record_query_cnt(const ares_dns_record_t *dnsrec); + +/*! Get the data about the query at the provided index. + * + * \param[in] dnsrec Initialized record object + * \param[in] idx Index of query + * \param[out] name Optional. Returns name, may pass NULL if not desired. + * \param[out] qtype Optional. Returns record type, may pass NULL. + * \param[out] qclass Optional. Returns class, may pass NULL. + * \return ARES_SUCCESS on success + */ +CARES_EXTERN 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); + +/*! Get the count of Resource Records in the provided section + * + * \param[in] dnsrec Initialized record object + * \param[in] sect Section. ARES_SECTION_ANSWER is most used. + * \return count of resource records. + */ +CARES_EXTERN size_t ares_dns_record_rr_cnt(const ares_dns_record_t *dnsrec, + ares_dns_section_t sect); + + +/*! Add a Resource Record to the DNS Record. + * + * \param[out] rr_out Pointer to created resource record. This pointer + * is owned by the DNS record itself, this is just made + * available to facilitate adding RR-specific fields. + * \param[in] dnsrec Initialized record object + * \param[in] sect Section to add resource record to + * \param[in] name Resource Record name/hostname + * \param[in] type Record Type + * \param[in] rclass Class + * \param[in] ttl TTL + * \return ARES_SUCCESS on success + */ +CARES_EXTERN 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); + +/*! Fetch a resource record based on the section and index. + * + * \param[in] dnsrec Initialized record object + * \param[in] sect Section for resource record + * \param[in] idx Index of resource record in section + * \return NULL on misuse, otherwise a pointer to the resource record + */ +CARES_EXTERN ares_dns_rr_t *ares_dns_record_rr_get(ares_dns_record_t *dnsrec, + ares_dns_section_t sect, + size_t idx); + + +/*! Remove the resource record based on the section and index + * + * \param[in] dnsrec Initialized record object + * \param[in] sect Section for resource record + * \param[in] idx Index of resource record in section + * \return ARES_SUCCESS on success, otherwise an error code. + */ +CARES_EXTERN ares_status_t ares_dns_record_rr_del(ares_dns_record_t *dnsrec, + ares_dns_section_t sect, + size_t idx); + + +/*! Retrieve the resource record Name/Hostname + * + * \param[in] rr Pointer to resource record + * \return Name + */ +CARES_EXTERN const char *ares_dns_rr_get_name(const ares_dns_rr_t *rr); + +/*! Retrieve the resource record type + * + * \param[in] rr Pointer to resource record + * \return type + */ +CARES_EXTERN ares_dns_rec_type_t ares_dns_rr_get_type(const ares_dns_rr_t *rr); + +/*! Retrieve the resource record class + * + * \param[in] rr Pointer to resource record + * \return class + */ +CARES_EXTERN ares_dns_class_t ares_dns_rr_get_class(const ares_dns_rr_t *rr); + +/*! Retrieve the resource record TTL + * + * \param[in] rr Pointer to resource record + * \return TTL + */ +CARES_EXTERN unsigned int ares_dns_rr_get_ttl(const ares_dns_rr_t *rr); + +/*! Set ipv4 address data type for specified resource record and key. Can + * only be used on keys with datatype ARES_DATATYPE_INADDR + * + * \param[in] dns_rr Pointer to resource record + * \param[in] key DNS Resource Record Key + * \param[in] addr Pointer to ipv4 address to use. + * \return ARES_SUCCESS on success + */ +CARES_EXTERN 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); + +/*! Set ipv6 address data type for specified resource record and key. Can + * only be used on keys with datatype ARES_DATATYPE_INADDR6 + * + * \param[in] dns_rr Pointer to resource record + * \param[in] key DNS Resource Record Key + * \param[in] addr Pointer to ipv6 address to use. + * \return ARES_SUCCESS on success + */ +CARES_EXTERN 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); + +/*! Set string data for specified resource record and key. Can + * only be used on keys with datatype ARES_DATATYPE_STR or ARES_DATATYPE_NAME. + * + * \param[in] dns_rr Pointer to resource record + * \param[in] key DNS Resource Record Key + * \param[in] val Pointer to string to set. + * \return ARES_SUCCESS on success + */ +CARES_EXTERN ares_status_t ares_dns_rr_set_str(ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, + const char *val); + +/*! Set 8bit unsigned integer for specified resource record and key. Can + * only be used on keys with datatype ARES_DATATYPE_U8 + * + * \param[in] dns_rr Pointer to resource record + * \param[in] key DNS Resource Record Key + * \param[in] val 8bit unsigned integer + * \return ARES_SUCCESS on success + */ +CARES_EXTERN ares_status_t ares_dns_rr_set_u8(ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, + unsigned char val); + +/*! Set 16bit unsigned integer for specified resource record and key. Can + * only be used on keys with datatype ARES_DATATYPE_U16 + * + * \param[in] dns_rr Pointer to resource record + * \param[in] key DNS Resource Record Key + * \param[in] val 16bit unsigned integer + * \return ARES_SUCCESS on success + */ +CARES_EXTERN ares_status_t ares_dns_rr_set_u16(ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, + unsigned short val); + +/*! Set 32bit unsigned integer for specified resource record and key. Can + * only be used on keys with datatype ARES_DATATYPE_U32 + * + * \param[in] dns_rr Pointer to resource record + * \param[in] key DNS Resource Record Key + * \param[in] val 32bit unsigned integer + * \return ARES_SUCCESS on success + */ +CARES_EXTERN ares_status_t ares_dns_rr_set_u32(ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, + unsigned int val); + +/*! Set binary (BIN or BINP) data for specified resource record and key. Can + * only be used on keys with datatype ARES_DATATYPE_BIN or ARES_DATATYPE_BINP. + * + * \param[in] dns_rr Pointer to resource record + * \param[in] key DNS Resource Record Key + * \param[in] val Pointer to binary data. + * \param[in] len Length of binary data + * \return ARES_SUCCESS on success + */ +CARES_EXTERN 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); + +/*! Set the option for the RR + * + * \param[in] dns_rr Pointer to resource record + * \param[in] key DNS Resource Record Key + * \param[in] opt Option record key id. + * \param[out] val Optional. Value to associate with option. + * \param[out] val_len Length of value passed. + * \return ARES_SUCCESS on success + */ +CARES_EXTERN 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); + +/*! Retrieve a pointer to the ipv4 address. Can only be used on keys with + * datatype ARES_DATATYPE_INADDR. + * + * \param[in] dns_rr Pointer to resource record + * \param[in] key DNS Resource Record Key + * \return pointer to ipv4 address or NULL on error + */ +CARES_EXTERN const struct in_addr * + ares_dns_rr_get_addr(const ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key); + +/*! Retrieve a pointer to the ipv6 address. Can only be used on keys with + * datatype ARES_DATATYPE_INADDR6. + * + * \param[in] dns_rr Pointer to resource record + * \param[in] key DNS Resource Record Key + * \return pointer to ipv6 address or NULL on error + */ +CARES_EXTERN const struct ares_in6_addr * + ares_dns_rr_get_addr6(const ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key); + +/*! Retrieve a pointer to the string. Can only be used on keys with + * datatype ARES_DATATYPE_STR and ARES_DATATYPE_NAME. + * + * \param[in] dns_rr Pointer to resource record + * \param[in] key DNS Resource Record Key + * \return pointer string or NULL on error + */ +CARES_EXTERN const char *ares_dns_rr_get_str(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key); + +/*! Retrieve an 8bit unsigned integer. Can only be used on keys with + * datatype ARES_DATATYPE_U8. + * + * \param[in] dns_rr Pointer to resource record + * \param[in] key DNS Resource Record Key + * \return 8bit unsigned integer + */ +CARES_EXTERN unsigned char ares_dns_rr_get_u8(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key); + +/*! Retrieve an 16bit unsigned integer. Can only be used on keys with + * datatype ARES_DATATYPE_U16. + * + * \param[in] dns_rr Pointer to resource record + * \param[in] key DNS Resource Record Key + * \return 16bit unsigned integer + */ +CARES_EXTERN unsigned short ares_dns_rr_get_u16(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key); + +/*! Retrieve an 32bit unsigned integer. Can only be used on keys with + * datatype ARES_DATATYPE_U32. + * + * \param[in] dns_rr Pointer to resource record + * \param[in] key DNS Resource Record Key + * \return 32bit unsigned integer + */ +CARES_EXTERN unsigned int ares_dns_rr_get_u32(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key); + +/*! Retrieve a pointer to the binary data. Can only be used on keys with + * datatype ARES_DATATYPE_BIN or ARES_DATATYPE_BINP. If BINP, the data is + * guaranteed to have a NULL terminator which is NOT included in the length. + * + * \param[in] dns_rr Pointer to resource record + * \param[in] key DNS Resource Record Key + * \param[out] len Length of binary data returned + * \return pointer binary data or NULL on error + */ +CARES_EXTERN const unsigned char * + ares_dns_rr_get_bin(const ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key, + size_t *len); + +/*! Retrieve the number of options stored for the RR. + * + * \param[in] dns_rr Pointer to resource record + * \param[in] key DNS Resource Record Key + * \return count, or 0 if none. + */ +CARES_EXTERN size_t ares_dns_rr_get_opt_cnt(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key); + +/*! Retrieve the option for the RR by index. + * + * \param[in] dns_rr Pointer to resource record + * \param[in] key DNS Resource Record Key + * \param[in] idx Index of option record + * \param[out] val Optional. Pointer passed by reference to hold value. + * Options may not have values. Value if returned is + * guaranteed to be NULL terminated, however in most + * cases it is not printable. + * \param[out] val_len Optional. Pointer passed by reference to hold value + * length. + * \return option key/id on success, 65535 on misuse. + */ +CARES_EXTERN 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); + +/*! Retrieve the option for the RR by the option key/id. + * + * \param[in] dns_rr Pointer to resource record + * \param[in] key DNS Resource Record Key + * \param[in] opt Option record key id (this is not the index). + * \param[out] val Optional. Pointer passed by reference to hold value. + * Options may not have values. Value if returned is + * guaranteed to be NULL terminated, however in most cases + * it is not printable. + * \param[out] val_len Optional. Pointer passed by reference to hold value + * length. + * \return ARES_TRUE on success, ARES_FALSE on misuse. + */ +CARES_EXTERN 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); + +/*! Parse a complete DNS message. + * + * \param[in] buf pointer to bytes to be parsed + * \param[in] buf_len Length of buf provided + * \param[in] flags Flags dictating how the message should be parsed. TBD. + * \param[out] dnsrec Pointer passed by reference for a new DNS record object + * that must be ares_dns_record_destroy()'d by caller. + * \return ARES_SUCCESS on success + */ +CARES_EXTERN ares_status_t ares_dns_parse(const unsigned char *buf, + size_t buf_len, unsigned int flags, + ares_dns_record_t **dnsrec); + +/*! Write a complete DNS message + * + * \param[in] dnsrec Pointer to initialized and filled DNS record object. + * \param[out] buf Pointer passed by reference to be filled in with with + * DNS message. Must be ares_free()'d by caller. + * \param[out] buf_len Length of returned buffer containing DNS message. + * \return ARES_SUCCESS on success + */ +CARES_EXTERN ares_status_t ares_dns_write(ares_dns_record_t *dnsrec, + unsigned char **buf, size_t *buf_len); +/*! @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* __ARES_DNS_RECORD_H */ diff --git a/deps/cares/include/ares_nameser.h b/deps/cares/include/ares_nameser.h index 3138d89d747fad..cf0e3b2d8abf8a 100644 --- a/deps/cares/include/ares_nameser.h +++ b/deps/cares/include/ares_nameser.h @@ -44,51 +44,51 @@ */ #ifndef NS_PACKETSZ -# define NS_PACKETSZ 512 /* maximum packet size */ +# define NS_PACKETSZ 512 /* maximum packet size */ #endif #ifndef NS_MAXDNAME -# define NS_MAXDNAME 256 /* maximum domain name */ +# define NS_MAXDNAME 256 /* maximum domain name */ #endif #ifndef NS_MAXCDNAME -# define NS_MAXCDNAME 255 /* maximum compressed domain name */ +# define NS_MAXCDNAME 255 /* maximum compressed domain name */ #endif #ifndef NS_MAXLABEL -# define NS_MAXLABEL 63 +# define NS_MAXLABEL 63 #endif #ifndef NS_HFIXEDSZ -# define NS_HFIXEDSZ 12 /* #/bytes of fixed data in header */ +# define NS_HFIXEDSZ 12 /* #/bytes of fixed data in header */ #endif #ifndef NS_QFIXEDSZ -# define NS_QFIXEDSZ 4 /* #/bytes of fixed data in query */ +# define NS_QFIXEDSZ 4 /* #/bytes of fixed data in query */ #endif #ifndef NS_RRFIXEDSZ -# define NS_RRFIXEDSZ 10 /* #/bytes of fixed data in r record */ +# define NS_RRFIXEDSZ 10 /* #/bytes of fixed data in r record */ #endif #ifndef NS_INT16SZ -# define NS_INT16SZ 2 +# define NS_INT16SZ 2 #endif #ifndef NS_INADDRSZ -# define NS_INADDRSZ 4 +# define NS_INADDRSZ 4 #endif #ifndef NS_IN6ADDRSZ -# define NS_IN6ADDRSZ 16 +# define NS_IN6ADDRSZ 16 #endif #ifndef NS_CMPRSFLGS -# define NS_CMPRSFLGS 0xc0 /* Flag bits indicating name compression. */ +# define NS_CMPRSFLGS 0xc0 /* Flag bits indicating name compression. */ #endif #ifndef NS_DEFAULTPORT -# define NS_DEFAULTPORT 53 /* For both TCP and UDP. */ +# define NS_DEFAULTPORT 53 /* For both TCP and UDP. */ #endif /* ============================================================================ @@ -99,106 +99,106 @@ #ifndef CARES_HAVE_ARPA_NAMESER_H typedef enum __ns_class { - ns_c_invalid = 0, /* Cookie. */ - ns_c_in = 1, /* Internet. */ - ns_c_2 = 2, /* unallocated/unsupported. */ - ns_c_chaos = 3, /* MIT Chaos-net. */ - ns_c_hs = 4, /* MIT Hesiod. */ - /* Query class values which do not appear in resource records */ - ns_c_none = 254, /* for prereq. sections in update requests */ - ns_c_any = 255, /* Wildcard match. */ - ns_c_max = 65536 + ns_c_invalid = 0, /* Cookie. */ + ns_c_in = 1, /* Internet. */ + ns_c_2 = 2, /* unallocated/unsupported. */ + ns_c_chaos = 3, /* MIT Chaos-net. */ + ns_c_hs = 4, /* MIT Hesiod. */ + /* Query class values which do not appear in resource records */ + ns_c_none = 254, /* for prereq. sections in update requests */ + ns_c_any = 255, /* Wildcard match. */ + ns_c_max = 65536 } ns_class; typedef enum __ns_type { - ns_t_invalid = 0, /* Cookie. */ - ns_t_a = 1, /* Host address. */ - ns_t_ns = 2, /* Authoritative server. */ - ns_t_md = 3, /* Mail destination. */ - ns_t_mf = 4, /* Mail forwarder. */ - ns_t_cname = 5, /* Canonical name. */ - ns_t_soa = 6, /* Start of authority zone. */ - ns_t_mb = 7, /* Mailbox domain name. */ - ns_t_mg = 8, /* Mail group member. */ - ns_t_mr = 9, /* Mail rename name. */ - ns_t_null = 10, /* Null resource record. */ - ns_t_wks = 11, /* Well known service. */ - ns_t_ptr = 12, /* Domain name pointer. */ - ns_t_hinfo = 13, /* Host information. */ - ns_t_minfo = 14, /* Mailbox information. */ - ns_t_mx = 15, /* Mail routing information. */ - ns_t_txt = 16, /* Text strings. */ - ns_t_rp = 17, /* Responsible person. */ - ns_t_afsdb = 18, /* AFS cell database. */ - ns_t_x25 = 19, /* X_25 calling address. */ - ns_t_isdn = 20, /* ISDN calling address. */ - ns_t_rt = 21, /* Router. */ - ns_t_nsap = 22, /* NSAP address. */ - ns_t_nsap_ptr = 23, /* Reverse NSAP lookup (deprecated). */ - ns_t_sig = 24, /* Security signature. */ - ns_t_key = 25, /* Security key. */ - ns_t_px = 26, /* X.400 mail mapping. */ - ns_t_gpos = 27, /* Geographical position (withdrawn). */ - ns_t_aaaa = 28, /* Ip6 Address. */ - ns_t_loc = 29, /* Location Information. */ - ns_t_nxt = 30, /* Next domain (security). */ - ns_t_eid = 31, /* Endpoint identifier. */ - ns_t_nimloc = 32, /* Nimrod Locator. */ - ns_t_srv = 33, /* Server Selection. */ - ns_t_atma = 34, /* ATM Address */ - ns_t_naptr = 35, /* Naming Authority PoinTeR */ - ns_t_kx = 36, /* Key Exchange */ - ns_t_cert = 37, /* Certification record */ - ns_t_a6 = 38, /* IPv6 address (deprecates AAAA) */ - ns_t_dname = 39, /* Non-terminal DNAME (for IPv6) */ - ns_t_sink = 40, /* Kitchen sink (experimentatl) */ - ns_t_opt = 41, /* EDNS0 option (meta-RR) */ - ns_t_apl = 42, /* Address prefix list (RFC3123) */ - ns_t_ds = 43, /* Delegation Signer (RFC4034) */ - ns_t_sshfp = 44, /* SSH Key Fingerprint (RFC4255) */ - ns_t_rrsig = 46, /* Resource Record Signature (RFC4034) */ - ns_t_nsec = 47, /* Next Secure (RFC4034) */ - ns_t_dnskey = 48, /* DNS Public Key (RFC4034) */ - ns_t_tkey = 249, /* Transaction key */ - ns_t_tsig = 250, /* Transaction signature. */ - ns_t_ixfr = 251, /* Incremental zone transfer. */ - ns_t_axfr = 252, /* Transfer zone of authority. */ - ns_t_mailb = 253, /* Transfer mailbox records. */ - ns_t_maila = 254, /* Transfer mail agent records. */ - ns_t_any = 255, /* Wildcard match. */ - ns_t_uri = 256, /* Uniform Resource Identifier (RFC7553) */ - ns_t_caa = 257, /* Certification Authority Authorization. */ - ns_t_max = 65536 + ns_t_invalid = 0, /* Cookie. */ + ns_t_a = 1, /* Host address. */ + ns_t_ns = 2, /* Authoritative server. */ + ns_t_md = 3, /* Mail destination. */ + ns_t_mf = 4, /* Mail forwarder. */ + ns_t_cname = 5, /* Canonical name. */ + ns_t_soa = 6, /* Start of authority zone. */ + ns_t_mb = 7, /* Mailbox domain name. */ + ns_t_mg = 8, /* Mail group member. */ + ns_t_mr = 9, /* Mail rename name. */ + ns_t_null = 10, /* Null resource record. */ + ns_t_wks = 11, /* Well known service. */ + ns_t_ptr = 12, /* Domain name pointer. */ + ns_t_hinfo = 13, /* Host information. */ + ns_t_minfo = 14, /* Mailbox information. */ + ns_t_mx = 15, /* Mail routing information. */ + ns_t_txt = 16, /* Text strings. */ + ns_t_rp = 17, /* Responsible person. */ + ns_t_afsdb = 18, /* AFS cell database. */ + ns_t_x25 = 19, /* X_25 calling address. */ + ns_t_isdn = 20, /* ISDN calling address. */ + ns_t_rt = 21, /* Router. */ + ns_t_nsap = 22, /* NSAP address. */ + ns_t_nsap_ptr = 23, /* Reverse NSAP lookup (deprecated). */ + ns_t_sig = 24, /* Security signature. */ + ns_t_key = 25, /* Security key. */ + ns_t_px = 26, /* X.400 mail mapping. */ + ns_t_gpos = 27, /* Geographical position (withdrawn). */ + ns_t_aaaa = 28, /* Ip6 Address. */ + ns_t_loc = 29, /* Location Information. */ + ns_t_nxt = 30, /* Next domain (security). */ + ns_t_eid = 31, /* Endpoint identifier. */ + ns_t_nimloc = 32, /* Nimrod Locator. */ + ns_t_srv = 33, /* Server Selection. */ + ns_t_atma = 34, /* ATM Address */ + ns_t_naptr = 35, /* Naming Authority PoinTeR */ + ns_t_kx = 36, /* Key Exchange */ + ns_t_cert = 37, /* Certification record */ + ns_t_a6 = 38, /* IPv6 address (deprecates AAAA) */ + ns_t_dname = 39, /* Non-terminal DNAME (for IPv6) */ + ns_t_sink = 40, /* Kitchen sink (experimental) */ + ns_t_opt = 41, /* EDNS0 option (meta-RR) */ + ns_t_apl = 42, /* Address prefix list (RFC3123) */ + ns_t_ds = 43, /* Delegation Signer (RFC4034) */ + ns_t_sshfp = 44, /* SSH Key Fingerprint (RFC4255) */ + ns_t_rrsig = 46, /* Resource Record Signature (RFC4034) */ + ns_t_nsec = 47, /* Next Secure (RFC4034) */ + ns_t_dnskey = 48, /* DNS Public Key (RFC4034) */ + ns_t_tkey = 249, /* Transaction key */ + ns_t_tsig = 250, /* Transaction signature. */ + ns_t_ixfr = 251, /* Incremental zone transfer. */ + ns_t_axfr = 252, /* Transfer zone of authority. */ + ns_t_mailb = 253, /* Transfer mailbox records. */ + ns_t_maila = 254, /* Transfer mail agent records. */ + ns_t_any = 255, /* Wildcard match. */ + ns_t_uri = 256, /* Uniform Resource Identifier (RFC7553) */ + ns_t_caa = 257, /* Certification Authority Authorization. */ + ns_t_max = 65536 } ns_type; typedef enum __ns_opcode { - ns_o_query = 0, /* Standard query. */ - ns_o_iquery = 1, /* Inverse query (deprecated/unsupported). */ - ns_o_status = 2, /* Name server status query (unsupported). */ - /* Opcode 3 is undefined/reserved. */ - ns_o_notify = 4, /* Zone change notification. */ - ns_o_update = 5, /* Zone update message. */ - ns_o_max = 6 + ns_o_query = 0, /* Standard query. */ + ns_o_iquery = 1, /* Inverse query (deprecated/unsupported). */ + ns_o_status = 2, /* Name server status query (unsupported). */ + /* Opcode 3 is undefined/reserved. */ + ns_o_notify = 4, /* Zone change notification. */ + ns_o_update = 5, /* Zone update message. */ + ns_o_max = 6 } ns_opcode; typedef enum __ns_rcode { - ns_r_noerror = 0, /* No error occurred. */ - ns_r_formerr = 1, /* Format error. */ - ns_r_servfail = 2, /* Server failure. */ - ns_r_nxdomain = 3, /* Name error. */ - ns_r_notimpl = 4, /* Unimplemented. */ - ns_r_refused = 5, /* Operation refused. */ - /* these are for BIND_UPDATE */ - ns_r_yxdomain = 6, /* Name exists */ - ns_r_yxrrset = 7, /* RRset exists */ - ns_r_nxrrset = 8, /* RRset does not exist */ - ns_r_notauth = 9, /* Not authoritative for zone */ - ns_r_notzone = 10, /* Zone of record different from zone section */ - ns_r_max = 11, - /* The following are TSIG extended errors */ - ns_r_badsig = 16, - ns_r_badkey = 17, - ns_r_badtime = 18 + ns_r_noerror = 0, /* No error occurred. */ + ns_r_formerr = 1, /* Format error. */ + ns_r_servfail = 2, /* Server failure. */ + ns_r_nxdomain = 3, /* Name error. */ + ns_r_notimpl = 4, /* Unimplemented. */ + ns_r_refused = 5, /* Operation refused. */ + /* these are for BIND_UPDATE */ + ns_r_yxdomain = 6, /* Name exists */ + ns_r_yxrrset = 7, /* RRset exists */ + ns_r_nxrrset = 8, /* RRset does not exist */ + ns_r_notauth = 9, /* Not authoritative for zone */ + ns_r_notzone = 10, /* Zone of record different from zone section */ + ns_r_max = 11, + /* The following are TSIG extended errors */ + ns_r_badsig = 16, + ns_r_badkey = 17, + ns_r_badtime = 18 } ns_rcode; #endif /* CARES_HAVE_ARPA_NAMESER_H */ @@ -212,45 +212,45 @@ typedef enum __ns_rcode { */ #ifndef PACKETSZ -# define PACKETSZ NS_PACKETSZ +# define PACKETSZ NS_PACKETSZ #endif #ifndef MAXDNAME -# define MAXDNAME NS_MAXDNAME +# define MAXDNAME NS_MAXDNAME #endif #ifndef MAXCDNAME -# define MAXCDNAME NS_MAXCDNAME +# define MAXCDNAME NS_MAXCDNAME #endif #ifndef MAXLABEL -# define MAXLABEL NS_MAXLABEL +# define MAXLABEL NS_MAXLABEL #endif #ifndef HFIXEDSZ -# define HFIXEDSZ NS_HFIXEDSZ +# define HFIXEDSZ NS_HFIXEDSZ #endif #ifndef QFIXEDSZ -# define QFIXEDSZ NS_QFIXEDSZ +# define QFIXEDSZ NS_QFIXEDSZ #endif #ifndef RRFIXEDSZ -# define RRFIXEDSZ NS_RRFIXEDSZ +# define RRFIXEDSZ NS_RRFIXEDSZ #endif #ifndef INDIR_MASK -# define INDIR_MASK NS_CMPRSFLGS +# define INDIR_MASK NS_CMPRSFLGS #endif #ifndef NAMESERVER_PORT -# define NAMESERVER_PORT NS_DEFAULTPORT +# define NAMESERVER_PORT NS_DEFAULTPORT #endif /* opcodes */ #ifndef O_QUERY -# define O_QUERY 0 /* ns_o_query */ +# define O_QUERY 0 /* ns_o_query */ #endif #ifndef O_IQUERY # define O_IQUERY 1 /* ns_o_iquery */ @@ -268,242 +268,242 @@ typedef enum __ns_rcode { /* response codes */ #ifndef SERVFAIL -# define SERVFAIL ns_r_servfail +# define SERVFAIL ns_r_servfail #endif #ifndef NOTIMP -# define NOTIMP ns_r_notimpl +# define NOTIMP ns_r_notimpl #endif #ifndef REFUSED -# define REFUSED ns_r_refused +# define REFUSED ns_r_refused #endif #if defined(_WIN32) && !defined(HAVE_ARPA_NAMESER_COMPAT_H) && defined(NOERROR) # undef NOERROR /* it seems this is already defined in winerror.h */ #endif #ifndef NOERROR -# define NOERROR ns_r_noerror +# define NOERROR ns_r_noerror #endif #ifndef FORMERR -# define FORMERR ns_r_formerr +# define FORMERR ns_r_formerr #endif #ifndef NXDOMAIN -# define NXDOMAIN ns_r_nxdomain +# define NXDOMAIN ns_r_nxdomain #endif /* Non-standard response codes, use numeric values */ #ifndef YXDOMAIN -# define YXDOMAIN 6 /* ns_r_yxdomain */ +# define YXDOMAIN 6 /* ns_r_yxdomain */ #endif #ifndef YXRRSET -# define YXRRSET 7 /* ns_r_yxrrset */ +# define YXRRSET 7 /* ns_r_yxrrset */ #endif #ifndef NXRRSET -# define NXRRSET 8 /* ns_r_nxrrset */ +# define NXRRSET 8 /* ns_r_nxrrset */ #endif #ifndef NOTAUTH -# define NOTAUTH 9 /* ns_r_notauth */ +# define NOTAUTH 9 /* ns_r_notauth */ #endif #ifndef NOTZONE -# define NOTZONE 10 /* ns_r_notzone */ +# define NOTZONE 10 /* ns_r_notzone */ #endif #ifndef TSIG_BADSIG -# define TSIG_BADSIG 16 /* ns_r_badsig */ +# define TSIG_BADSIG 16 /* ns_r_badsig */ #endif #ifndef TSIG_BADKEY -# define TSIG_BADKEY 17 /* ns_r_badkey */ +# define TSIG_BADKEY 17 /* ns_r_badkey */ #endif #ifndef TSIG_BADTIME -# define TSIG_BADTIME 18 /* ns_r_badtime */ +# define TSIG_BADTIME 18 /* ns_r_badtime */ #endif /* classes */ #ifndef C_IN -# define C_IN 1 /* ns_c_in */ +# define C_IN 1 /* ns_c_in */ #endif #ifndef C_CHAOS -# define C_CHAOS 3 /* ns_c_chaos */ +# define C_CHAOS 3 /* ns_c_chaos */ #endif #ifndef C_HS -# define C_HS 4 /* ns_c_hs */ +# define C_HS 4 /* ns_c_hs */ #endif #ifndef C_NONE -# define C_NONE 254 /* ns_c_none */ +# define C_NONE 254 /* ns_c_none */ #endif #ifndef C_ANY -# define C_ANY 255 /* ns_c_any */ +# define C_ANY 255 /* ns_c_any */ #endif /* types */ #ifndef T_A -# define T_A 1 /* ns_t_a */ +# define T_A 1 /* ns_t_a */ #endif #ifndef T_NS -# define T_NS 2 /* ns_t_ns */ +# define T_NS 2 /* ns_t_ns */ #endif #ifndef T_MD -# define T_MD 3 /* ns_t_md */ +# define T_MD 3 /* ns_t_md */ #endif #ifndef T_MF -# define T_MF 4 /* ns_t_mf */ +# define T_MF 4 /* ns_t_mf */ #endif #ifndef T_CNAME -# define T_CNAME 5 /* ns_t_cname */ +# define T_CNAME 5 /* ns_t_cname */ #endif #ifndef T_SOA -# define T_SOA 6 /* ns_t_soa */ +# define T_SOA 6 /* ns_t_soa */ #endif #ifndef T_MB -# define T_MB 7 /* ns_t_mb */ +# define T_MB 7 /* ns_t_mb */ #endif #ifndef T_MG -# define T_MG 8 /* ns_t_mg */ +# define T_MG 8 /* ns_t_mg */ #endif #ifndef T_MR -# define T_MR 9 /* ns_t_mr */ +# define T_MR 9 /* ns_t_mr */ #endif #ifndef T_NULL -# define T_NULL 10 /* ns_t_null */ +# define T_NULL 10 /* ns_t_null */ #endif #ifndef T_WKS -# define T_WKS 11 /* ns_t_wks */ +# define T_WKS 11 /* ns_t_wks */ #endif #ifndef T_PTR -# define T_PTR 12 /* ns_t_ptr */ +# define T_PTR 12 /* ns_t_ptr */ #endif #ifndef T_HINFO -# define T_HINFO 13 /* ns_t_hinfo */ +# define T_HINFO 13 /* ns_t_hinfo */ #endif #ifndef T_MINFO -# define T_MINFO 14 /* ns_t_minfo */ +# define T_MINFO 14 /* ns_t_minfo */ #endif #ifndef T_MX -# define T_MX 15 /* ns_t_mx */ +# define T_MX 15 /* ns_t_mx */ #endif #ifndef T_TXT -# define T_TXT 16 /* ns_t_txt */ +# define T_TXT 16 /* ns_t_txt */ #endif #ifndef T_RP -# define T_RP 17 /* ns_t_rp */ +# define T_RP 17 /* ns_t_rp */ #endif #ifndef T_AFSDB -# define T_AFSDB 18 /* ns_t_afsdb */ +# define T_AFSDB 18 /* ns_t_afsdb */ #endif #ifndef T_X25 -# define T_X25 19 /* ns_t_x25 */ +# define T_X25 19 /* ns_t_x25 */ #endif #ifndef T_ISDN -# define T_ISDN 20 /* ns_t_isdn */ +# define T_ISDN 20 /* ns_t_isdn */ #endif #ifndef T_RT -# define T_RT 21 /* ns_t_rt */ +# define T_RT 21 /* ns_t_rt */ #endif #ifndef T_NSAP -# define T_NSAP 22 /* ns_t_nsap */ +# define T_NSAP 22 /* ns_t_nsap */ #endif #ifndef T_NSAP_PTR -# define T_NSAP_PTR 23 /* ns_t_nsap_ptr */ +# define T_NSAP_PTR 23 /* ns_t_nsap_ptr */ #endif #ifndef T_SIG -# define T_SIG 24 /* ns_t_sig */ +# define T_SIG 24 /* ns_t_sig */ #endif #ifndef T_KEY -# define T_KEY 25 /* ns_t_key */ +# define T_KEY 25 /* ns_t_key */ #endif #ifndef T_PX -# define T_PX 26 /* ns_t_px */ +# define T_PX 26 /* ns_t_px */ #endif #ifndef T_GPOS -# define T_GPOS 27 /* ns_t_gpos */ +# define T_GPOS 27 /* ns_t_gpos */ #endif #ifndef T_AAAA -# define T_AAAA 28 /* ns_t_aaaa */ +# define T_AAAA 28 /* ns_t_aaaa */ #endif #ifndef T_LOC -# define T_LOC 29 /* ns_t_loc */ +# define T_LOC 29 /* ns_t_loc */ #endif #ifndef T_NXT -# define T_NXT 30 /* ns_t_nxt */ +# define T_NXT 30 /* ns_t_nxt */ #endif #ifndef T_EID -# define T_EID 31 /* ns_t_eid */ +# define T_EID 31 /* ns_t_eid */ #endif #ifndef T_NIMLOC -# define T_NIMLOC 32 /* ns_t_nimloc */ +# define T_NIMLOC 32 /* ns_t_nimloc */ #endif #ifndef T_SRV -# define T_SRV 33 /* ns_t_srv */ +# define T_SRV 33 /* ns_t_srv */ #endif #ifndef T_ATMA -# define T_ATMA 34 /* ns_t_atma */ +# define T_ATMA 34 /* ns_t_atma */ #endif #ifndef T_NAPTR -# define T_NAPTR 35 /* ns_t_naptr */ +# define T_NAPTR 35 /* ns_t_naptr */ #endif #ifndef T_KX -# define T_KX 36 /* ns_t_kx */ +# define T_KX 36 /* ns_t_kx */ #endif #ifndef T_CERT -# define T_CERT 37 /* ns_t_cert */ +# define T_CERT 37 /* ns_t_cert */ #endif #ifndef T_A6 -# define T_A6 38 /* ns_t_a6 */ +# define T_A6 38 /* ns_t_a6 */ #endif #ifndef T_DNAME -# define T_DNAME 39 /* ns_t_dname */ +# define T_DNAME 39 /* ns_t_dname */ #endif #ifndef T_SINK -# define T_SINK 40 /* ns_t_sink */ +# define T_SINK 40 /* ns_t_sink */ #endif #ifndef T_OPT -# define T_OPT 41 /* ns_t_opt */ +# define T_OPT 41 /* ns_t_opt */ #endif #ifndef T_APL -# define T_APL 42 /* ns_t_apl */ +# define T_APL 42 /* ns_t_apl */ #endif #ifndef T_DS -# define T_DS 43 /* ns_t_ds */ +# define T_DS 43 /* ns_t_ds */ #endif #ifndef T_SSHFP -# define T_SSHFP 44 /* ns_t_sshfp */ +# define T_SSHFP 44 /* ns_t_sshfp */ #endif #ifndef T_RRSIG -# define T_RRSIG 46 /* ns_t_rrsig */ +# define T_RRSIG 46 /* ns_t_rrsig */ #endif #ifndef T_NSEC -# define T_NSEC 47 /* ns_t_nsec */ +# define T_NSEC 47 /* ns_t_nsec */ #endif #ifndef T_DNSKEY -# define T_DNSKEY 48 /* ns_t_dnskey */ +# define T_DNSKEY 48 /* ns_t_dnskey */ #endif #ifndef T_TKEY -# define T_TKEY 249 /* ns_t_tkey */ +# define T_TKEY 249 /* ns_t_tkey */ #endif #ifndef T_TSIG -# define T_TSIG 250 /* ns_t_tsig */ +# define T_TSIG 250 /* ns_t_tsig */ #endif #ifndef T_IXFR -# define T_IXFR 251 /* ns_t_ixfr */ +# define T_IXFR 251 /* ns_t_ixfr */ #endif #ifndef T_AXFR -# define T_AXFR 252 /* ns_t_axfr */ +# define T_AXFR 252 /* ns_t_axfr */ #endif #ifndef T_MAILB -# define T_MAILB 253 /* ns_t_mailb */ +# define T_MAILB 253 /* ns_t_mailb */ #endif #ifndef T_MAILA -# define T_MAILA 254 /* ns_t_maila */ +# define T_MAILA 254 /* ns_t_maila */ #endif #ifndef T_ANY -# define T_ANY 255 /* ns_t_any */ +# define T_ANY 255 /* ns_t_any */ #endif #ifndef T_URI -# define T_URI 256 /* ns_t_uri */ +# define T_URI 256 /* ns_t_uri */ #endif #ifndef T_CAA -# define T_CAA 257 /* ns_t_caa */ +# define T_CAA 257 /* ns_t_caa */ #endif #ifndef T_MAX -# define T_MAX 65536 /* ns_t_max */ +# define T_MAX 65536 /* ns_t_max */ #endif diff --git a/deps/cares/include/ares_rules.h b/deps/cares/include/ares_rules.h index f6b1f663e2dbf0..450dc8ab2d5fd2 100644 --- a/deps/cares/include/ares_rules.h +++ b/deps/cares/include/ares_rules.h @@ -81,7 +81,7 @@ #ifndef CARES_TYPEOF_ARES_SOCKLEN_T # error "CARES_TYPEOF_ARES_SOCKLEN_T definition is missing!" - Error Compilation_aborted_CARES_TYPEOF_ARES_SOCKLEN_T_is_missing +Error Compilation_aborted_CARES_TYPEOF_ARES_SOCKLEN_T_is_missing #endif /* @@ -92,15 +92,14 @@ #define CareschkszGE(t1, t2) sizeof(t1) >= sizeof(t2) ? 1 : -1 -/* - * Verify that the size previously defined and expected for - * ares_socklen_t is actually the same as the one reported - * by sizeof() at compile time. - */ + /* + * Verify that the size previously defined and expected for + * ares_socklen_t is actually the same as the one reported + * by sizeof() at compile time. + */ -typedef char - __cares_rule_02__ - [CareschkszEQ(ares_socklen_t, sizeof(CARES_TYPEOF_ARES_SOCKLEN_T))]; + typedef char __cares_rule_02__[CareschkszEQ( + ares_socklen_t, sizeof(CARES_TYPEOF_ARES_SOCKLEN_T))]; /* * Verify at compile time that the size of ares_socklen_t as reported @@ -108,9 +107,7 @@ typedef char * the current compilation. */ -typedef char - __cares_rule_03__ - [CareschkszGE(ares_socklen_t, int)]; +typedef char __cares_rule_03__[CareschkszGE(ares_socklen_t, int)]; /* ================================================================ */ /* EXTERNALLY AND INTERNALLY VISIBLE DEFINITIONS */ diff --git a/deps/cares/include/ares_version.h b/deps/cares/include/ares_version.h index 34784e2ed44731..df5c8cf2a7df23 100644 --- a/deps/cares/include/ares_version.h +++ b/deps/cares/include/ares_version.h @@ -31,15 +31,15 @@ #define ARES_COPYRIGHT "2004 - 2023 Daniel Stenberg, ." #define ARES_VERSION_MAJOR 1 -#define ARES_VERSION_MINOR 20 -#define ARES_VERSION_PATCH 1 -#define ARES_VERSION ((ARES_VERSION_MAJOR<<16)|\ - (ARES_VERSION_MINOR<<8)|\ - (ARES_VERSION_PATCH)) -#define ARES_VERSION_STR "1.20.1" +#define ARES_VERSION_MINOR 23 +#define ARES_VERSION_PATCH 0 +#define ARES_VERSION \ + ((ARES_VERSION_MAJOR << 16) | (ARES_VERSION_MINOR << 8) | \ + (ARES_VERSION_PATCH)) +#define ARES_VERSION_STR "1.23.0" #if (ARES_VERSION >= 0x010700) -# define CARES_HAVE_ARES_LIBRARY_INIT 1 +# define CARES_HAVE_ARES_LIBRARY_INIT 1 # define CARES_HAVE_ARES_LIBRARY_CLEANUP 1 #else # undef CARES_HAVE_ARES_LIBRARY_INIT diff --git a/deps/cares/ltmain.sh b/deps/cares/ltmain.sh index 9b12fbb7fa9a09..1dea62ab78db21 100755 --- a/deps/cares/ltmain.sh +++ b/deps/cares/ltmain.sh @@ -31,7 +31,7 @@ PROGRAM=libtool PACKAGE=libtool -VERSION="2.4.7 Debian-2.4.7-5" +VERSION="2.4.7 Debian-2.4.7-7" package_revision=2.4.7 @@ -572,27 +572,15 @@ func_require_term_colors () # --------------------- # Append VALUE onto the existing contents of VAR. - # We should try to minimise forks, especially on Windows where they are - # unreasonably slow, so skip the feature probes when bash or zsh are - # being used: - if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then - : ${_G_HAVE_ARITH_OP="yes"} - : ${_G_HAVE_XSI_OPS="yes"} - # The += operator was introduced in bash 3.1 - case $BASH_VERSION in - [12].* | 3.0 | 3.0*) ;; - *) - : ${_G_HAVE_PLUSEQ_OP="yes"} - ;; - esac - fi - # _G_HAVE_PLUSEQ_OP # Can be empty, in which case the shell is probed, "yes" if += is # useable or anything else if it does not work. - test -z "$_G_HAVE_PLUSEQ_OP" \ - && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ - && _G_HAVE_PLUSEQ_OP=yes + if test -z "$_G_HAVE_PLUSEQ_OP" && \ + __PLUSEQ_TEST="a" && \ + __PLUSEQ_TEST+=" b" 2>/dev/null && \ + test "a b" = "$__PLUSEQ_TEST"; then + _G_HAVE_PLUSEQ_OP=yes + fi if test yes = "$_G_HAVE_PLUSEQ_OP" then @@ -2308,7 +2296,7 @@ include the following information: compiler: $LTCC compiler flags: $LTCFLAGS linker: $LD (gnu? $with_gnu_ld) - version: $progname $scriptversion Debian-2.4.7-5 + version: $progname $scriptversion Debian-2.4.7-7 automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` diff --git a/deps/cares/m4/ax_append_compile_flags.m4 b/deps/cares/m4/ax_append_compile_flags.m4 new file mode 100644 index 00000000000000..1f8e70845c20d9 --- /dev/null +++ b/deps/cares/m4/ax_append_compile_flags.m4 @@ -0,0 +1,65 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_append_compile_flags.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_APPEND_COMPILE_FLAGS([FLAG1 FLAG2 ...], [FLAGS-VARIABLE], [EXTRA-FLAGS]) +# +# DESCRIPTION +# +# For every FLAG1, FLAG2 it is checked whether the compiler works with the +# flag. If it does, the flag is added FLAGS-VARIABLE +# +# If FLAGS-VARIABLE is not specified, the current language's flags (e.g. +# CFLAGS) is used. During the check the flag is always added to the +# current language's flags. +# +# If EXTRA-FLAGS is defined, it is added to the current language's default +# flags (e.g. CFLAGS) when the check is done. The check is thus made with +# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to +# force the compiler to issue an error when a bad flag is given. +# +# NOTE: This macro depends on the AX_APPEND_FLAG and +# AX_CHECK_COMPILE_FLAG. Please keep this macro in sync with +# AX_APPEND_LINK_FLAGS. +# +# LICENSE +# +# Copyright (c) 2011 Maarten Bosmans +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 3 + +AC_DEFUN([AX_APPEND_COMPILE_FLAGS], +[AC_REQUIRE([AX_CHECK_COMPILE_FLAG]) +AC_REQUIRE([AX_APPEND_FLAG]) +for flag in $1; do + AX_CHECK_COMPILE_FLAG([$flag], [AX_APPEND_FLAG([$flag], [$2])], [], [$3]) +done +])dnl AX_APPEND_COMPILE_FLAGS diff --git a/deps/cares/m4/ax_append_flag.m4 b/deps/cares/m4/ax_append_flag.m4 new file mode 100644 index 00000000000000..1d38b76fb8e157 --- /dev/null +++ b/deps/cares/m4/ax_append_flag.m4 @@ -0,0 +1,69 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_append_flag.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_APPEND_FLAG(FLAG, [FLAGS-VARIABLE]) +# +# DESCRIPTION +# +# FLAG is appended to the FLAGS-VARIABLE shell variable, with a space +# added in between. +# +# If FLAGS-VARIABLE is not specified, the current language's flags (e.g. +# CFLAGS) is used. FLAGS-VARIABLE is not changed if it already contains +# FLAG. If FLAGS-VARIABLE is unset in the shell, it is set to exactly +# FLAG. +# +# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. +# +# LICENSE +# +# Copyright (c) 2008 Guido U. Draheim +# Copyright (c) 2011 Maarten Bosmans +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 2 + +AC_DEFUN([AX_APPEND_FLAG], +[AC_PREREQ(2.59)dnl for _AC_LANG_PREFIX +AS_VAR_PUSHDEF([FLAGS], [m4_default($2,_AC_LANG_PREFIX[FLAGS])])dnl +AS_VAR_SET_IF(FLAGS, + [case " AS_VAR_GET(FLAGS) " in + *" $1 "*) + AC_RUN_LOG([: FLAGS already contains $1]) + ;; + *) + AC_RUN_LOG([: FLAGS="$FLAGS $1"]) + AS_VAR_SET(FLAGS, ["AS_VAR_GET(FLAGS) $1"]) + ;; + esac], + [AS_VAR_SET(FLAGS,["$1"])]) +AS_VAR_POPDEF([FLAGS])dnl +])dnl AX_APPEND_FLAG diff --git a/deps/cares/m4/ax_check_compile_flag.m4 b/deps/cares/m4/ax_check_compile_flag.m4 new file mode 100644 index 00000000000000..c3a8d695a1bcda --- /dev/null +++ b/deps/cares/m4/ax_check_compile_flag.m4 @@ -0,0 +1,72 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS]) +# +# DESCRIPTION +# +# Check whether the given FLAG works with the current language's compiler +# or gives an error. (Warnings, however, are ignored) +# +# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on +# success/failure. +# +# If EXTRA-FLAGS is defined, it is added to the current language's default +# flags (e.g. CFLAGS) when the check is done. The check is thus made with +# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to +# force the compiler to issue an error when a bad flag is given. +# +# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this +# macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG. +# +# LICENSE +# +# Copyright (c) 2008 Guido U. Draheim +# Copyright (c) 2011 Maarten Bosmans +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 2 + +AC_DEFUN([AX_CHECK_COMPILE_FLAG], +[AC_PREREQ(2.59)dnl for _AC_LANG_PREFIX +AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl +AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [ + ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS + _AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1" + AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], + [AS_VAR_SET(CACHEVAR,[yes])], + [AS_VAR_SET(CACHEVAR,[no])]) + _AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags]) +AS_IF([test x"AS_VAR_GET(CACHEVAR)" = xyes], + [m4_default([$2], :)], + [m4_default([$3], :)]) +AS_VAR_POPDEF([CACHEVAR])dnl +])dnl AX_CHECK_COMPILE_FLAGS diff --git a/deps/cares/m4/cares-compilers.m4 b/deps/cares/m4/cares-compilers.m4 index e11b35c33ef1bb..ffce98165031fd 100644 --- a/deps/cares/m4/cares-compilers.m4 +++ b/deps/cares/m4/cares-compilers.m4 @@ -852,27 +852,13 @@ AC_DEFUN([CARES_SET_COMPILER_WARNING_OPTS], [ # if test "$want_warnings" = "yes"; then tmp_CFLAGS="$tmp_CFLAGS -pedantic" - tmp_CFLAGS="$tmp_CFLAGS -Wall -Wextra" - tmp_CFLAGS="$tmp_CFLAGS -Wpointer-arith -Wwrite-strings" - tmp_CFLAGS="$tmp_CFLAGS -Wshadow" - tmp_CFLAGS="$tmp_CFLAGS -Winline -Wnested-externs" - tmp_CFLAGS="$tmp_CFLAGS -Wmissing-declarations" - tmp_CFLAGS="$tmp_CFLAGS -Wmissing-prototypes" + tmp_CFLAGS="$tmp_CFLAGS -Winline" tmp_CFLAGS="$tmp_CFLAGS -Wno-long-long" - tmp_CFLAGS="$tmp_CFLAGS -Wfloat-equal" tmp_CFLAGS="$tmp_CFLAGS -Wno-multichar -Wsign-compare" - tmp_CFLAGS="$tmp_CFLAGS -Wundef" tmp_CFLAGS="$tmp_CFLAGS -Wno-format-nonliteral" - tmp_CFLAGS="$tmp_CFLAGS -Wendif-labels -Wstrict-prototypes" - tmp_CFLAGS="$tmp_CFLAGS -Wdeclaration-after-statement" - tmp_CFLAGS="$tmp_CFLAGS -Wcast-align" + tmp_CFLAGS="$tmp_CFLAGS -Wendif-labels" tmp_CFLAGS="$tmp_CFLAGS -Wno-system-headers" tmp_CFLAGS="$tmp_CFLAGS -Wshorten-64-to-32" - # - dnl Only clang 1.1 or later - if test "$compiler_num" -ge "101"; then - tmp_CFLAGS="$tmp_CFLAGS -Wunused" - fi fi ;; # @@ -896,25 +882,14 @@ AC_DEFUN([CARES_SET_COMPILER_WARNING_OPTS], [ fi # dnl Set of options we believe *ALL* gcc versions support: - tmp_CFLAGS="$tmp_CFLAGS -Wall -W" - # - dnl Only gcc 1.4 or later - if test "$compiler_num" -ge "104"; then - tmp_CFLAGS="$tmp_CFLAGS -Wpointer-arith -Wwrite-strings" - dnl If not cross-compiling with a gcc older than 3.0 - if test "x$cross_compiling" != "xyes" || - test "$compiler_num" -ge "300"; then - tmp_CFLAGS="$tmp_CFLAGS -Wunused -Wshadow" - fi - fi + tmp_CFLAGS="$tmp_CFLAGS -W" # dnl Only gcc 2.7 or later if test "$compiler_num" -ge "207"; then - tmp_CFLAGS="$tmp_CFLAGS -Winline -Wnested-externs" + tmp_CFLAGS="$tmp_CFLAGS -Winline" dnl If not cross-compiling with a gcc older than 3.0 if test "x$cross_compiling" != "xyes" || test "$compiler_num" -ge "300"; then - tmp_CFLAGS="$tmp_CFLAGS -Wmissing-declarations" tmp_CFLAGS="$tmp_CFLAGS -Wmissing-prototypes" fi fi @@ -926,12 +901,7 @@ AC_DEFUN([CARES_SET_COMPILER_WARNING_OPTS], [ # dnl Only gcc 2.96 or later if test "$compiler_num" -ge "296"; then - tmp_CFLAGS="$tmp_CFLAGS -Wfloat-equal" tmp_CFLAGS="$tmp_CFLAGS -Wno-multichar -Wsign-compare" - dnl -Wundef used only if gcc is 2.96 or later since we get - dnl lots of "`_POSIX_C_SOURCE' is not defined" in system - dnl headers with gcc 2.95.4 on FreeBSD 4.9 - tmp_CFLAGS="$tmp_CFLAGS -Wundef" fi # dnl Only gcc 2.97 or later @@ -950,12 +920,7 @@ AC_DEFUN([CARES_SET_COMPILER_WARNING_OPTS], [ # dnl Only gcc 3.3 or later if test "$compiler_num" -ge "303"; then - tmp_CFLAGS="$tmp_CFLAGS -Wendif-labels -Wstrict-prototypes" - fi - # - dnl Only gcc 3.4 or later - if test "$compiler_num" -ge "304"; then - tmp_CFLAGS="$tmp_CFLAGS -Wdeclaration-after-statement" + tmp_CFLAGS="$tmp_CFLAGS -Wendif-labels" fi # dnl Only gcc 4.0 or later @@ -963,17 +928,12 @@ AC_DEFUN([CARES_SET_COMPILER_WARNING_OPTS], [ tmp_CFLAGS="$tmp_CFLAGS -Wstrict-aliasing=3" fi # - dnl Only gcc 4.2 or later - if test "$compiler_num" -ge "402"; then - tmp_CFLAGS="$tmp_CFLAGS -Wcast-align" - fi - # dnl Only gcc 4.3 or later if test "$compiler_num" -ge "403"; then tmp_CFLAGS="$tmp_CFLAGS -Wtype-limits -Wold-style-declaration" tmp_CFLAGS="$tmp_CFLAGS -Wmissing-parameter-type -Wempty-body" tmp_CFLAGS="$tmp_CFLAGS -Wclobbered -Wignored-qualifiers" - tmp_CFLAGS="$tmp_CFLAGS -Wconversion -Wno-sign-conversion -Wvla" + tmp_CFLAGS="$tmp_CFLAGS -Wno-sign-conversion" fi # dnl Only gcc 4.5 or later @@ -1025,7 +985,7 @@ AC_DEFUN([CARES_SET_COMPILER_WARNING_OPTS], [ if test "$want_warnings" = "yes"; then if test "$compiler_num" -gt "600"; then dnl Show errors, warnings, and remarks - tmp_CPPFLAGS="$tmp_CPPFLAGS -Wall -w2" + tmp_CPPFLAGS="$tmp_CPPFLAGS -w2" dnl Perform extra compile-time code checking tmp_CPPFLAGS="$tmp_CPPFLAGS -Wcheck" dnl Warn on nested comments @@ -1036,12 +996,8 @@ AC_DEFUN([CARES_SET_COMPILER_WARNING_OPTS], [ tmp_CPPFLAGS="$tmp_CPPFLAGS -Wmissing-prototypes" dnl Enable warnings for 64-bit portability issues tmp_CPPFLAGS="$tmp_CPPFLAGS -Wp64" - dnl Enable warnings for questionable pointer arithmetic - tmp_CPPFLAGS="$tmp_CPPFLAGS -Wpointer-arith" dnl Check for function return typw issues tmp_CPPFLAGS="$tmp_CPPFLAGS -Wreturn-type" - dnl Warn on variable declarations hiding a previous one - tmp_CPPFLAGS="$tmp_CPPFLAGS -Wshadow" dnl Warn when a variable is used before initialized tmp_CPPFLAGS="$tmp_CPPFLAGS -Wuninitialized" dnl Warn if a declared function is not used @@ -1109,9 +1065,7 @@ AC_DEFUN([CARES_SET_COMPILER_WARNING_OPTS], [ # if test "$want_warnings" = "yes"; then dnl Activate all warnings - tmp_CFLAGS="$tmp_CFLAGS -Wall" - dnl Make string constants be of type const char * - tmp_CFLAGS="$tmp_CFLAGS -Wwrite-strings" + tmp_CFLAGS="$tmp_CFLAGS" dnl Warn use of unsupported GCC features ignored by TCC tmp_CFLAGS="$tmp_CFLAGS -Wunsupported" fi @@ -1121,7 +1075,7 @@ AC_DEFUN([CARES_SET_COMPILER_WARNING_OPTS], [ # if test "$want_warnings" = "yes"; then dnl Issue all warnings - tmp_CFLAGS="$tmp_CFLAGS -Wall -Wextra" + tmp_CFLAGS="$tmp_CFLAGS" fi ;; # diff --git a/deps/cares/m4/cares-confopts.m4 b/deps/cares/m4/cares-confopts.m4 index 0c6f1484fb232a..1a42eb3b72b1b1 100644 --- a/deps/cares/m4/cares-confopts.m4 +++ b/deps/cares/m4/cares-confopts.m4 @@ -229,21 +229,16 @@ AC_DEFUN([CARES_CHECK_OPTION_WARNINGS], [ AC_BEFORE([$0],[CARES_CHECK_OPTION_WERROR])dnl AC_BEFORE([$0],[XC_CHECK_PROG_CC])dnl AC_MSG_CHECKING([whether to enable strict compiler warnings]) - OPT_COMPILER_WARNINGS="default" + OPT_COMPILER_WARNINGS="yes" AC_ARG_ENABLE(warnings, AS_HELP_STRING([--enable-warnings],[Enable strict compiler warnings]) AS_HELP_STRING([--disable-warnings],[Disable strict compiler warnings]), - OPT_COMPILER_WARNINGS=$enableval) + OPT_COMPILER_WARNINGS=yes) case "$OPT_COMPILER_WARNINGS" in no) dnl --disable-warnings option used want_warnings="no" ;; - default) - dnl configure option not specified, so - dnl use same setting as --enable-debug - want_warnings="$want_debug" - ;; *) dnl --enable-warnings option used want_warnings="yes" diff --git a/deps/cares/m4/cares-functions.m4 b/deps/cares/m4/cares-functions.m4 index b12ab247257de9..84bca23fab6b32 100644 --- a/deps/cares/m4/cares-functions.m4 +++ b/deps/cares/m4/cares-functions.m4 @@ -265,6 +265,26 @@ cares_includes_sys_uio="\ ]) +dnl CARES_INCLUDES_SYS_STAT +dnl ------------------------------------------------- +dnl Set up variable with list of headers that must be +dnl included when sys/stat.h is to be included. + +AC_DEFUN([CARES_INCLUDES_SYS_STAT], [ +cares_includes_sys_stat="\ +/* includes start */ +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +/* includes end */" + AC_CHECK_HEADERS( + sys/types.h sys/stat.h, + [], [], [$cares_includes_sys_stat]) +]) + dnl CARES_INCLUDES_UNISTD dnl ------------------------------------------------- dnl Set up variable with list of headers that must be @@ -3857,6 +3877,91 @@ AC_DEFUN([CARES_CHECK_FUNC_WRITEV], [ fi ]) +dnl CARES_CHECK_FUNC_STAT +dnl ------------------------------------------------- +dnl Verify if stat is available, prototyped, and +dnl can be compiled. If all of these are true, and +dnl usage has not been previously disallowed with +dnl shell variable cares_disallow_stat, then +dnl HAVE_STAT will be defined. + +AC_DEFUN([CARES_CHECK_FUNC_STAT], [ + AC_REQUIRE([CARES_INCLUDES_SYS_STAT])dnl + # + tst_links_stat="unknown" + tst_proto_stat="unknown" + tst_compi_stat="unknown" + tst_allow_stat="unknown" + # + AC_MSG_CHECKING([if stat can be linked]) + AC_LINK_IFELSE([ + AC_LANG_FUNC_LINK_TRY([stat]) + ],[ + AC_MSG_RESULT([yes]) + tst_links_stat="yes" + ],[ + AC_MSG_RESULT([no]) + tst_links_stat="no" + ]) + # + if test "$tst_links_stat" = "yes"; then + AC_MSG_CHECKING([if stat is prototyped]) + AC_EGREP_CPP([stat],[ + $cares_includes_sys_stat + ],[ + AC_MSG_RESULT([yes]) + tst_proto_stat="yes" + ],[ + AC_MSG_RESULT([no]) + tst_proto_stat="no" + ]) + fi + # + if test "$tst_proto_stat" = "yes"; then + AC_MSG_CHECKING([if stat is compilable]) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + $cares_includes_sys_types + $cares_includes_sys_stat + ]],[[ + if(0 != stat(0, 0)) + return 1; + ]]) + ],[ + AC_MSG_RESULT([yes]) + tst_compi_stat="yes" + ],[ + AC_MSG_RESULT([no]) + tst_compi_stat="no" + ]) + fi + # + if test "$tst_compi_stat" = "yes"; then + AC_MSG_CHECKING([if stat usage allowed]) + if test "x$cares_disallow_stat" != "xyes"; then + AC_MSG_RESULT([yes]) + tst_allow_stat="yes" + else + AC_MSG_RESULT([no]) + tst_allow_stat="no" + fi + fi + # + AC_MSG_CHECKING([if stat might be used]) + if test "$tst_links_stat" = "yes" && + test "$tst_proto_stat" = "yes" && + test "$tst_compi_stat" = "yes" && + test "$tst_allow_stat" = "yes"; then + AC_MSG_RESULT([yes]) + AC_DEFINE_UNQUOTED(HAVE_STAT, 1, + [Define to 1 if you have the stat function.]) + ac_cv_func_stat="yes" + else + AC_MSG_RESULT([no]) + ac_cv_func_stat="no" + fi +]) + dnl CARES_CHECK_FUNC_ARC4RANDOM_BUF dnl ------------------------------------------------- dnl Verify if arc4random_buf is available, prototyped, and diff --git a/deps/cares/maketgz b/deps/cares/maketgz index aa1241f96ef541..e97230b2da1624 100755 --- a/deps/cares/maketgz +++ b/deps/cares/maketgz @@ -60,7 +60,7 @@ print "produce CHANGES\n"; print "running make dist\n"; `make dist VERSION=$version`; -# remove temporay sourced man pages +# remove temporary sourced man pages `make -s clean-sourced-manpages`; print "removing temporary configure.ac file\n"; diff --git a/deps/cares/src/Makefile.in b/deps/cares/src/Makefile.in index af4e680b76afdb..466d58bbe33603 100644 --- a/deps/cares/src/Makefile.in +++ b/deps/cares/src/Makefile.in @@ -93,11 +93,15 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ $(top_srcdir)/m4/ax_ac_print_to_file.m4 \ $(top_srcdir)/m4/ax_add_am_macro_static.m4 \ $(top_srcdir)/m4/ax_am_macros_static.m4 \ + $(top_srcdir)/m4/ax_append_compile_flags.m4 \ + $(top_srcdir)/m4/ax_append_flag.m4 \ + $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_check_gnu_make.m4 \ $(top_srcdir)/m4/ax_code_coverage.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ $(top_srcdir)/m4/ax_file_escapes.m4 \ + $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_require_defined.m4 \ $(top_srcdir)/m4/cares-compilers.m4 \ $(top_srcdir)/m4/cares-confopts.m4 \ @@ -284,6 +288,10 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_CXX = @PTHREAD_CXX@ +PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -303,6 +311,7 @@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ +ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ @@ -364,9 +373,9 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --foreign src/Makefile + $(AUTOMAKE) --gnu src/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ diff --git a/deps/cares/src/lib/CMakeLists.txt b/deps/cares/src/lib/CMakeLists.txt index 34dc9c3d68afed..373e1fbdaf5610 100644 --- a/deps/cares/src/lib/CMakeLists.txt +++ b/deps/cares/src/lib/CMakeLists.txt @@ -34,8 +34,16 @@ IF (CARES_SHARED) COMPILE_PDB_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} SOVERSION ${CARES_LIB_VERSION_MAJOR} VERSION "${CARES_LIB_VERSION_MAJOR}.${CARES_LIB_VERSION_MINOR}.${CARES_LIB_VERSION_RELEASE}" + C_STANDARD 90 ) + IF (CARES_SYMBOL_HIDING) + SET_TARGET_PROPERTIES (${PROJECT_NAME} PROPERTIES + C_VISIBILITY_PRESET hidden + VISIBILITY_INLINES_HIDDEN YES + ) + ENDIF () + TARGET_INCLUDE_DIRECTORIES (${PROJECT_NAME} PUBLIC "$" "$" @@ -46,7 +54,10 @@ IF (CARES_SHARED) TARGET_COMPILE_DEFINITIONS (${PROJECT_NAME} PRIVATE HAVE_CONFIG_H=1 CARES_BUILDING_LIBRARY) - TARGET_LINK_LIBRARIES (${PROJECT_NAME} PUBLIC ${CARES_DEPENDENT_LIBS}) + TARGET_LINK_LIBRARIES (${PROJECT_NAME} + PUBLIC ${CARES_DEPENDENT_LIBS} + PRIVATE ${CMAKE_THREAD_LIBS_INIT} + ) IF (CARES_INSTALL) INSTALL (TARGETS ${PROJECT_NAME} @@ -78,6 +89,7 @@ IF (CARES_STATIC) OUTPUT_NAME cares${STATIC_SUFFIX} COMPILE_PDB_NAME cares${STATIC_SUFFIX} COMPILE_PDB_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} + C_STANDARD 90 ) IF (CARES_STATIC_PIC) diff --git a/deps/cares/src/lib/Makefile.in b/deps/cares/src/lib/Makefile.in index 0dd3c19661cdb0..c785a142801242 100644 --- a/deps/cares/src/lib/Makefile.in +++ b/deps/cares/src/lib/Makefile.in @@ -15,7 +15,7 @@ @SET_MAKE@ # aminclude_static.am generated automatically by Autoconf -# from AX_AM_MACROS_STATIC on Sat Oct 7 13:47:45 CEST 2023 +# from AX_AM_MACROS_STATIC on Thu Nov 30 13:39:00 CET 2023 # Copyright (C) The c-ares project and its contributors # SPDX-License-Identifier: MIT @@ -107,11 +107,15 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ $(top_srcdir)/m4/ax_ac_print_to_file.m4 \ $(top_srcdir)/m4/ax_add_am_macro_static.m4 \ $(top_srcdir)/m4/ax_am_macros_static.m4 \ + $(top_srcdir)/m4/ax_append_compile_flags.m4 \ + $(top_srcdir)/m4/ax_append_flag.m4 \ + $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_check_gnu_make.m4 \ $(top_srcdir)/m4/ax_code_coverage.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ $(top_srcdir)/m4/ax_file_escapes.m4 \ + $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_require_defined.m4 \ $(top_srcdir)/m4/cares-compilers.m4 \ $(top_srcdir)/m4/cares-confopts.m4 \ @@ -166,17 +170,20 @@ LTLIBRARIES = $(lib_LTLIBRARIES) libcares_la_LIBADD = am__objects_1 = libcares_la-ares__addrinfo2hostent.lo \ libcares_la-ares__addrinfo_localhost.lo \ - libcares_la-ares__close_sockets.lo \ - libcares_la-ares__get_hostent.lo libcares_la-ares__htable.lo \ + libcares_la-ares__buf.lo libcares_la-ares__close_sockets.lo \ + libcares_la-ares__hosts_file.lo libcares_la-ares__htable.lo \ libcares_la-ares__htable_asvp.lo \ - libcares_la-ares__htable_stvp.lo libcares_la-ares__llist.lo \ + libcares_la-ares__htable_strvp.lo \ + libcares_la-ares__htable_szvp.lo libcares_la-ares__llist.lo \ libcares_la-ares__parse_into_addrinfo.lo \ - libcares_la-ares__buf.lo libcares_la-ares__readaddrinfo.lo \ - libcares_la-ares__slist.lo libcares_la-ares__sortaddrinfo.lo \ - libcares_la-ares__read_line.lo libcares_la-ares__timeval.lo \ + libcares_la-ares__read_line.lo libcares_la-ares__slist.lo \ + libcares_la-ares__socket.lo libcares_la-ares__sortaddrinfo.lo \ + libcares_la-ares__threads.lo libcares_la-ares__timeval.lo \ libcares_la-ares_android.lo libcares_la-ares_cancel.lo \ libcares_la-ares_data.lo libcares_la-ares_destroy.lo \ - libcares_la-ares_expand_name.lo \ + libcares_la-ares_dns_mapping.lo libcares_la-ares_dns_name.lo \ + libcares_la-ares_dns_parse.lo libcares_la-ares_dns_record.lo \ + libcares_la-ares_dns_write.lo libcares_la-ares_expand_name.lo \ libcares_la-ares_expand_string.lo libcares_la-ares_fds.lo \ libcares_la-ares_free_hostent.lo \ libcares_la-ares_free_string.lo \ @@ -186,8 +193,8 @@ am__objects_1 = libcares_la-ares__addrinfo2hostent.lo \ libcares_la-ares_gethostbyname.lo \ libcares_la-ares_getnameinfo.lo libcares_la-ares_getsock.lo \ libcares_la-ares_init.lo libcares_la-ares_library_init.lo \ - libcares_la-ares_mkquery.lo libcares_la-ares_create_query.lo \ - libcares_la-ares_nowarn.lo libcares_la-ares_options.lo \ + libcares_la-ares_math.lo libcares_la-ares_mkquery.lo \ + libcares_la-ares_create_query.lo libcares_la-ares_options.lo \ libcares_la-ares_parse_a_reply.lo \ libcares_la-ares_parse_aaaa_reply.lo \ libcares_la-ares_parse_caa_reply.lo \ @@ -200,13 +207,16 @@ am__objects_1 = libcares_la-ares__addrinfo2hostent.lo \ libcares_la-ares_parse_txt_reply.lo \ libcares_la-ares_parse_uri_reply.lo \ libcares_la-ares_platform.lo libcares_la-ares_process.lo \ - libcares_la-ares_query.lo libcares_la-ares_rand.lo \ - libcares_la-ares_search.lo libcares_la-ares_send.lo \ - libcares_la-ares_strcasecmp.lo libcares_la-ares_strdup.lo \ - libcares_la-ares_strerror.lo libcares_la-ares_strsplit.lo \ - libcares_la-ares_timeout.lo libcares_la-ares_version.lo \ - libcares_la-bitncmp.lo libcares_la-inet_net_pton.lo \ - libcares_la-inet_ntop.lo libcares_la-windows_port.lo + libcares_la-ares_qcache.lo libcares_la-ares_query.lo \ + libcares_la-ares_rand.lo libcares_la-ares_search.lo \ + libcares_la-ares_send.lo libcares_la-ares_strcasecmp.lo \ + libcares_la-ares_str.lo libcares_la-ares_strerror.lo \ + libcares_la-ares_strsplit.lo libcares_la-ares_sysconfig.lo \ + libcares_la-ares_sysconfig_files.lo \ + libcares_la-ares_timeout.lo libcares_la-ares_update_servers.lo \ + libcares_la-ares_version.lo libcares_la-bitncmp.lo \ + libcares_la-inet_net_pton.lo libcares_la-inet_ntop.lo \ + libcares_la-windows_port.lo am__objects_2 = am_libcares_la_OBJECTS = $(am__objects_1) $(am__objects_2) libcares_la_OBJECTS = $(am_libcares_la_OBJECTS) @@ -237,22 +247,29 @@ am__depfiles_remade = \ ./$(DEPDIR)/libcares_la-ares__addrinfo_localhost.Plo \ ./$(DEPDIR)/libcares_la-ares__buf.Plo \ ./$(DEPDIR)/libcares_la-ares__close_sockets.Plo \ - ./$(DEPDIR)/libcares_la-ares__get_hostent.Plo \ + ./$(DEPDIR)/libcares_la-ares__hosts_file.Plo \ ./$(DEPDIR)/libcares_la-ares__htable.Plo \ ./$(DEPDIR)/libcares_la-ares__htable_asvp.Plo \ - ./$(DEPDIR)/libcares_la-ares__htable_stvp.Plo \ + ./$(DEPDIR)/libcares_la-ares__htable_strvp.Plo \ + ./$(DEPDIR)/libcares_la-ares__htable_szvp.Plo \ ./$(DEPDIR)/libcares_la-ares__llist.Plo \ ./$(DEPDIR)/libcares_la-ares__parse_into_addrinfo.Plo \ ./$(DEPDIR)/libcares_la-ares__read_line.Plo \ - ./$(DEPDIR)/libcares_la-ares__readaddrinfo.Plo \ ./$(DEPDIR)/libcares_la-ares__slist.Plo \ + ./$(DEPDIR)/libcares_la-ares__socket.Plo \ ./$(DEPDIR)/libcares_la-ares__sortaddrinfo.Plo \ + ./$(DEPDIR)/libcares_la-ares__threads.Plo \ ./$(DEPDIR)/libcares_la-ares__timeval.Plo \ ./$(DEPDIR)/libcares_la-ares_android.Plo \ ./$(DEPDIR)/libcares_la-ares_cancel.Plo \ ./$(DEPDIR)/libcares_la-ares_create_query.Plo \ ./$(DEPDIR)/libcares_la-ares_data.Plo \ ./$(DEPDIR)/libcares_la-ares_destroy.Plo \ + ./$(DEPDIR)/libcares_la-ares_dns_mapping.Plo \ + ./$(DEPDIR)/libcares_la-ares_dns_name.Plo \ + ./$(DEPDIR)/libcares_la-ares_dns_parse.Plo \ + ./$(DEPDIR)/libcares_la-ares_dns_record.Plo \ + ./$(DEPDIR)/libcares_la-ares_dns_write.Plo \ ./$(DEPDIR)/libcares_la-ares_expand_name.Plo \ ./$(DEPDIR)/libcares_la-ares_expand_string.Plo \ ./$(DEPDIR)/libcares_la-ares_fds.Plo \ @@ -267,8 +284,8 @@ am__depfiles_remade = \ ./$(DEPDIR)/libcares_la-ares_getsock.Plo \ ./$(DEPDIR)/libcares_la-ares_init.Plo \ ./$(DEPDIR)/libcares_la-ares_library_init.Plo \ + ./$(DEPDIR)/libcares_la-ares_math.Plo \ ./$(DEPDIR)/libcares_la-ares_mkquery.Plo \ - ./$(DEPDIR)/libcares_la-ares_nowarn.Plo \ ./$(DEPDIR)/libcares_la-ares_options.Plo \ ./$(DEPDIR)/libcares_la-ares_parse_a_reply.Plo \ ./$(DEPDIR)/libcares_la-ares_parse_aaaa_reply.Plo \ @@ -283,15 +300,19 @@ am__depfiles_remade = \ ./$(DEPDIR)/libcares_la-ares_parse_uri_reply.Plo \ ./$(DEPDIR)/libcares_la-ares_platform.Plo \ ./$(DEPDIR)/libcares_la-ares_process.Plo \ + ./$(DEPDIR)/libcares_la-ares_qcache.Plo \ ./$(DEPDIR)/libcares_la-ares_query.Plo \ ./$(DEPDIR)/libcares_la-ares_rand.Plo \ ./$(DEPDIR)/libcares_la-ares_search.Plo \ ./$(DEPDIR)/libcares_la-ares_send.Plo \ + ./$(DEPDIR)/libcares_la-ares_str.Plo \ ./$(DEPDIR)/libcares_la-ares_strcasecmp.Plo \ - ./$(DEPDIR)/libcares_la-ares_strdup.Plo \ ./$(DEPDIR)/libcares_la-ares_strerror.Plo \ ./$(DEPDIR)/libcares_la-ares_strsplit.Plo \ + ./$(DEPDIR)/libcares_la-ares_sysconfig.Plo \ + ./$(DEPDIR)/libcares_la-ares_sysconfig_files.Plo \ ./$(DEPDIR)/libcares_la-ares_timeout.Plo \ + ./$(DEPDIR)/libcares_la-ares_update_servers.Plo \ ./$(DEPDIR)/libcares_la-ares_version.Plo \ ./$(DEPDIR)/libcares_la-bitncmp.Plo \ ./$(DEPDIR)/libcares_la-inet_net_pton.Plo \ @@ -471,6 +492,10 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_CXX = @PTHREAD_CXX@ +PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -490,6 +515,7 @@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ +ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ @@ -587,23 +613,30 @@ libcares_la_CFLAGS = $(AM_CFLAGS) $(libcares_la_CFLAGS_EXTRA) libcares_la_CPPFLAGS = $(AM_CPPFLAGS) $(libcares_la_CPPFLAGS_EXTRA) CSOURCES = ares__addrinfo2hostent.c \ ares__addrinfo_localhost.c \ + ares__buf.c \ ares__close_sockets.c \ - ares__get_hostent.c \ + ares__hosts_file.c \ ares__htable.c \ ares__htable_asvp.c \ - ares__htable_stvp.c \ + ares__htable_strvp.c \ + ares__htable_szvp.c \ ares__llist.c \ ares__parse_into_addrinfo.c \ - ares__buf.c \ - ares__readaddrinfo.c \ - ares__slist.c \ - ares__sortaddrinfo.c \ ares__read_line.c \ + ares__slist.c \ + ares__socket.c \ + ares__sortaddrinfo.c \ + ares__threads.c \ ares__timeval.c \ ares_android.c \ ares_cancel.c \ ares_data.c \ ares_destroy.c \ + ares_dns_mapping.c \ + ares_dns_name.c \ + ares_dns_parse.c \ + ares_dns_record.c \ + ares_dns_write.c \ ares_expand_name.c \ ares_expand_string.c \ ares_fds.c \ @@ -618,9 +651,9 @@ CSOURCES = ares__addrinfo2hostent.c \ ares_getsock.c \ ares_init.c \ ares_library_init.c \ + ares_math.c \ ares_mkquery.c \ ares_create_query.c \ - ares_nowarn.c \ ares_options.c \ ares_parse_a_reply.c \ ares_parse_aaaa_reply.c \ @@ -635,38 +668,43 @@ CSOURCES = ares__addrinfo2hostent.c \ ares_parse_uri_reply.c \ ares_platform.c \ ares_process.c \ + ares_qcache.c \ ares_query.c \ ares_rand.c \ ares_search.c \ ares_send.c \ ares_strcasecmp.c \ - ares_strdup.c \ + ares_str.c \ ares_strerror.c \ ares_strsplit.c \ + ares_sysconfig.c \ + ares_sysconfig_files.c \ ares_timeout.c \ + ares_update_servers.c \ ares_version.c \ bitncmp.c \ inet_net_pton.c \ inet_ntop.c \ windows_port.c -HHEADERS = ares__htable.h \ +HHEADERS = ares__buf.h \ + ares__htable.h \ ares__htable_asvp.h \ - ares__htable_stvp.h \ + ares__htable_strvp.h \ + ares__htable_szvp.h \ ares__llist.h \ - ares__buf.h \ ares__slist.h \ ares_android.h \ ares_data.h \ + ares_dns_private.h \ ares_getenv.h \ ares_inet_net_pton.h \ ares_iphlpapi.h \ ares_ipv6.h \ - ares_nowarn.h \ ares_platform.h \ ares_private.h \ ares_strcasecmp.h \ - ares_strdup.h \ + ares_str.h \ ares_strsplit.h \ bitncmp.h \ ares_setup.h \ @@ -774,22 +812,29 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__addrinfo_localhost.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__buf.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__close_sockets.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__get_hostent.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__hosts_file.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__htable.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__htable_asvp.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__htable_stvp.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__htable_strvp.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__htable_szvp.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__llist.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__parse_into_addrinfo.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__read_line.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__readaddrinfo.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__slist.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__socket.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__sortaddrinfo.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__threads.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__timeval.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_android.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_cancel.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_create_query.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_data.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_destroy.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_dns_mapping.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_dns_name.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_dns_parse.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_dns_record.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_dns_write.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_expand_name.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_expand_string.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_fds.Plo@am__quote@ # am--include-marker @@ -804,8 +849,8 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_getsock.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_init.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_library_init.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_math.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_mkquery.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_nowarn.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_options.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_parse_a_reply.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_parse_aaaa_reply.Plo@am__quote@ # am--include-marker @@ -820,15 +865,19 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_parse_uri_reply.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_platform.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_process.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_qcache.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_query.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_rand.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_search.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_send.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_str.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_strcasecmp.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_strdup.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_strerror.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_strsplit.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_sysconfig.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_sysconfig_files.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_timeout.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_update_servers.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_version.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-bitncmp.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-inet_net_pton.Plo@am__quote@ # am--include-marker @@ -879,6 +928,13 @@ libcares_la-ares__addrinfo_localhost.lo: ares__addrinfo_localhost.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__addrinfo_localhost.lo `test -f 'ares__addrinfo_localhost.c' || echo '$(srcdir)/'`ares__addrinfo_localhost.c +libcares_la-ares__buf.lo: ares__buf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__buf.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__buf.Tpo -c -o libcares_la-ares__buf.lo `test -f 'ares__buf.c' || echo '$(srcdir)/'`ares__buf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__buf.Tpo $(DEPDIR)/libcares_la-ares__buf.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares__buf.c' object='libcares_la-ares__buf.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__buf.lo `test -f 'ares__buf.c' || echo '$(srcdir)/'`ares__buf.c + libcares_la-ares__close_sockets.lo: ares__close_sockets.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__close_sockets.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__close_sockets.Tpo -c -o libcares_la-ares__close_sockets.lo `test -f 'ares__close_sockets.c' || echo '$(srcdir)/'`ares__close_sockets.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__close_sockets.Tpo $(DEPDIR)/libcares_la-ares__close_sockets.Plo @@ -886,12 +942,12 @@ libcares_la-ares__close_sockets.lo: ares__close_sockets.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__close_sockets.lo `test -f 'ares__close_sockets.c' || echo '$(srcdir)/'`ares__close_sockets.c -libcares_la-ares__get_hostent.lo: ares__get_hostent.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__get_hostent.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__get_hostent.Tpo -c -o libcares_la-ares__get_hostent.lo `test -f 'ares__get_hostent.c' || echo '$(srcdir)/'`ares__get_hostent.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__get_hostent.Tpo $(DEPDIR)/libcares_la-ares__get_hostent.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares__get_hostent.c' object='libcares_la-ares__get_hostent.lo' libtool=yes @AMDEPBACKSLASH@ +libcares_la-ares__hosts_file.lo: ares__hosts_file.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__hosts_file.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__hosts_file.Tpo -c -o libcares_la-ares__hosts_file.lo `test -f 'ares__hosts_file.c' || echo '$(srcdir)/'`ares__hosts_file.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__hosts_file.Tpo $(DEPDIR)/libcares_la-ares__hosts_file.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares__hosts_file.c' object='libcares_la-ares__hosts_file.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__get_hostent.lo `test -f 'ares__get_hostent.c' || echo '$(srcdir)/'`ares__get_hostent.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__hosts_file.lo `test -f 'ares__hosts_file.c' || echo '$(srcdir)/'`ares__hosts_file.c libcares_la-ares__htable.lo: ares__htable.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__htable.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__htable.Tpo -c -o libcares_la-ares__htable.lo `test -f 'ares__htable.c' || echo '$(srcdir)/'`ares__htable.c @@ -907,12 +963,19 @@ libcares_la-ares__htable_asvp.lo: ares__htable_asvp.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__htable_asvp.lo `test -f 'ares__htable_asvp.c' || echo '$(srcdir)/'`ares__htable_asvp.c -libcares_la-ares__htable_stvp.lo: ares__htable_stvp.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__htable_stvp.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__htable_stvp.Tpo -c -o libcares_la-ares__htable_stvp.lo `test -f 'ares__htable_stvp.c' || echo '$(srcdir)/'`ares__htable_stvp.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__htable_stvp.Tpo $(DEPDIR)/libcares_la-ares__htable_stvp.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares__htable_stvp.c' object='libcares_la-ares__htable_stvp.lo' libtool=yes @AMDEPBACKSLASH@ +libcares_la-ares__htable_strvp.lo: ares__htable_strvp.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__htable_strvp.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__htable_strvp.Tpo -c -o libcares_la-ares__htable_strvp.lo `test -f 'ares__htable_strvp.c' || echo '$(srcdir)/'`ares__htable_strvp.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__htable_strvp.Tpo $(DEPDIR)/libcares_la-ares__htable_strvp.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares__htable_strvp.c' object='libcares_la-ares__htable_strvp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__htable_stvp.lo `test -f 'ares__htable_stvp.c' || echo '$(srcdir)/'`ares__htable_stvp.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__htable_strvp.lo `test -f 'ares__htable_strvp.c' || echo '$(srcdir)/'`ares__htable_strvp.c + +libcares_la-ares__htable_szvp.lo: ares__htable_szvp.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__htable_szvp.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__htable_szvp.Tpo -c -o libcares_la-ares__htable_szvp.lo `test -f 'ares__htable_szvp.c' || echo '$(srcdir)/'`ares__htable_szvp.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__htable_szvp.Tpo $(DEPDIR)/libcares_la-ares__htable_szvp.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares__htable_szvp.c' object='libcares_la-ares__htable_szvp.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__htable_szvp.lo `test -f 'ares__htable_szvp.c' || echo '$(srcdir)/'`ares__htable_szvp.c libcares_la-ares__llist.lo: ares__llist.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__llist.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__llist.Tpo -c -o libcares_la-ares__llist.lo `test -f 'ares__llist.c' || echo '$(srcdir)/'`ares__llist.c @@ -928,19 +991,12 @@ libcares_la-ares__parse_into_addrinfo.lo: ares__parse_into_addrinfo.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__parse_into_addrinfo.lo `test -f 'ares__parse_into_addrinfo.c' || echo '$(srcdir)/'`ares__parse_into_addrinfo.c -libcares_la-ares__buf.lo: ares__buf.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__buf.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__buf.Tpo -c -o libcares_la-ares__buf.lo `test -f 'ares__buf.c' || echo '$(srcdir)/'`ares__buf.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__buf.Tpo $(DEPDIR)/libcares_la-ares__buf.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares__buf.c' object='libcares_la-ares__buf.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__buf.lo `test -f 'ares__buf.c' || echo '$(srcdir)/'`ares__buf.c - -libcares_la-ares__readaddrinfo.lo: ares__readaddrinfo.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__readaddrinfo.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__readaddrinfo.Tpo -c -o libcares_la-ares__readaddrinfo.lo `test -f 'ares__readaddrinfo.c' || echo '$(srcdir)/'`ares__readaddrinfo.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__readaddrinfo.Tpo $(DEPDIR)/libcares_la-ares__readaddrinfo.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares__readaddrinfo.c' object='libcares_la-ares__readaddrinfo.lo' libtool=yes @AMDEPBACKSLASH@ +libcares_la-ares__read_line.lo: ares__read_line.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__read_line.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__read_line.Tpo -c -o libcares_la-ares__read_line.lo `test -f 'ares__read_line.c' || echo '$(srcdir)/'`ares__read_line.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__read_line.Tpo $(DEPDIR)/libcares_la-ares__read_line.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares__read_line.c' object='libcares_la-ares__read_line.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__readaddrinfo.lo `test -f 'ares__readaddrinfo.c' || echo '$(srcdir)/'`ares__readaddrinfo.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__read_line.lo `test -f 'ares__read_line.c' || echo '$(srcdir)/'`ares__read_line.c libcares_la-ares__slist.lo: ares__slist.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__slist.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__slist.Tpo -c -o libcares_la-ares__slist.lo `test -f 'ares__slist.c' || echo '$(srcdir)/'`ares__slist.c @@ -949,6 +1005,13 @@ libcares_la-ares__slist.lo: ares__slist.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__slist.lo `test -f 'ares__slist.c' || echo '$(srcdir)/'`ares__slist.c +libcares_la-ares__socket.lo: ares__socket.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__socket.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__socket.Tpo -c -o libcares_la-ares__socket.lo `test -f 'ares__socket.c' || echo '$(srcdir)/'`ares__socket.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__socket.Tpo $(DEPDIR)/libcares_la-ares__socket.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares__socket.c' object='libcares_la-ares__socket.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__socket.lo `test -f 'ares__socket.c' || echo '$(srcdir)/'`ares__socket.c + libcares_la-ares__sortaddrinfo.lo: ares__sortaddrinfo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__sortaddrinfo.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__sortaddrinfo.Tpo -c -o libcares_la-ares__sortaddrinfo.lo `test -f 'ares__sortaddrinfo.c' || echo '$(srcdir)/'`ares__sortaddrinfo.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__sortaddrinfo.Tpo $(DEPDIR)/libcares_la-ares__sortaddrinfo.Plo @@ -956,12 +1019,12 @@ libcares_la-ares__sortaddrinfo.lo: ares__sortaddrinfo.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__sortaddrinfo.lo `test -f 'ares__sortaddrinfo.c' || echo '$(srcdir)/'`ares__sortaddrinfo.c -libcares_la-ares__read_line.lo: ares__read_line.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__read_line.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__read_line.Tpo -c -o libcares_la-ares__read_line.lo `test -f 'ares__read_line.c' || echo '$(srcdir)/'`ares__read_line.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__read_line.Tpo $(DEPDIR)/libcares_la-ares__read_line.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares__read_line.c' object='libcares_la-ares__read_line.lo' libtool=yes @AMDEPBACKSLASH@ +libcares_la-ares__threads.lo: ares__threads.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__threads.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__threads.Tpo -c -o libcares_la-ares__threads.lo `test -f 'ares__threads.c' || echo '$(srcdir)/'`ares__threads.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__threads.Tpo $(DEPDIR)/libcares_la-ares__threads.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares__threads.c' object='libcares_la-ares__threads.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__read_line.lo `test -f 'ares__read_line.c' || echo '$(srcdir)/'`ares__read_line.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__threads.lo `test -f 'ares__threads.c' || echo '$(srcdir)/'`ares__threads.c libcares_la-ares__timeval.lo: ares__timeval.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__timeval.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__timeval.Tpo -c -o libcares_la-ares__timeval.lo `test -f 'ares__timeval.c' || echo '$(srcdir)/'`ares__timeval.c @@ -998,6 +1061,41 @@ libcares_la-ares_destroy.lo: ares_destroy.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_destroy.lo `test -f 'ares_destroy.c' || echo '$(srcdir)/'`ares_destroy.c +libcares_la-ares_dns_mapping.lo: ares_dns_mapping.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_dns_mapping.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_dns_mapping.Tpo -c -o libcares_la-ares_dns_mapping.lo `test -f 'ares_dns_mapping.c' || echo '$(srcdir)/'`ares_dns_mapping.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_dns_mapping.Tpo $(DEPDIR)/libcares_la-ares_dns_mapping.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_dns_mapping.c' object='libcares_la-ares_dns_mapping.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_dns_mapping.lo `test -f 'ares_dns_mapping.c' || echo '$(srcdir)/'`ares_dns_mapping.c + +libcares_la-ares_dns_name.lo: ares_dns_name.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_dns_name.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_dns_name.Tpo -c -o libcares_la-ares_dns_name.lo `test -f 'ares_dns_name.c' || echo '$(srcdir)/'`ares_dns_name.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_dns_name.Tpo $(DEPDIR)/libcares_la-ares_dns_name.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_dns_name.c' object='libcares_la-ares_dns_name.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_dns_name.lo `test -f 'ares_dns_name.c' || echo '$(srcdir)/'`ares_dns_name.c + +libcares_la-ares_dns_parse.lo: ares_dns_parse.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_dns_parse.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_dns_parse.Tpo -c -o libcares_la-ares_dns_parse.lo `test -f 'ares_dns_parse.c' || echo '$(srcdir)/'`ares_dns_parse.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_dns_parse.Tpo $(DEPDIR)/libcares_la-ares_dns_parse.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_dns_parse.c' object='libcares_la-ares_dns_parse.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_dns_parse.lo `test -f 'ares_dns_parse.c' || echo '$(srcdir)/'`ares_dns_parse.c + +libcares_la-ares_dns_record.lo: ares_dns_record.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_dns_record.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_dns_record.Tpo -c -o libcares_la-ares_dns_record.lo `test -f 'ares_dns_record.c' || echo '$(srcdir)/'`ares_dns_record.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_dns_record.Tpo $(DEPDIR)/libcares_la-ares_dns_record.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_dns_record.c' object='libcares_la-ares_dns_record.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_dns_record.lo `test -f 'ares_dns_record.c' || echo '$(srcdir)/'`ares_dns_record.c + +libcares_la-ares_dns_write.lo: ares_dns_write.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_dns_write.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_dns_write.Tpo -c -o libcares_la-ares_dns_write.lo `test -f 'ares_dns_write.c' || echo '$(srcdir)/'`ares_dns_write.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_dns_write.Tpo $(DEPDIR)/libcares_la-ares_dns_write.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_dns_write.c' object='libcares_la-ares_dns_write.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_dns_write.lo `test -f 'ares_dns_write.c' || echo '$(srcdir)/'`ares_dns_write.c + libcares_la-ares_expand_name.lo: ares_expand_name.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_expand_name.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_expand_name.Tpo -c -o libcares_la-ares_expand_name.lo `test -f 'ares_expand_name.c' || echo '$(srcdir)/'`ares_expand_name.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_expand_name.Tpo $(DEPDIR)/libcares_la-ares_expand_name.Plo @@ -1096,6 +1194,13 @@ libcares_la-ares_library_init.lo: ares_library_init.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_library_init.lo `test -f 'ares_library_init.c' || echo '$(srcdir)/'`ares_library_init.c +libcares_la-ares_math.lo: ares_math.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_math.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_math.Tpo -c -o libcares_la-ares_math.lo `test -f 'ares_math.c' || echo '$(srcdir)/'`ares_math.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_math.Tpo $(DEPDIR)/libcares_la-ares_math.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_math.c' object='libcares_la-ares_math.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_math.lo `test -f 'ares_math.c' || echo '$(srcdir)/'`ares_math.c + libcares_la-ares_mkquery.lo: ares_mkquery.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_mkquery.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_mkquery.Tpo -c -o libcares_la-ares_mkquery.lo `test -f 'ares_mkquery.c' || echo '$(srcdir)/'`ares_mkquery.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_mkquery.Tpo $(DEPDIR)/libcares_la-ares_mkquery.Plo @@ -1110,13 +1215,6 @@ libcares_la-ares_create_query.lo: ares_create_query.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_create_query.lo `test -f 'ares_create_query.c' || echo '$(srcdir)/'`ares_create_query.c -libcares_la-ares_nowarn.lo: ares_nowarn.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_nowarn.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_nowarn.Tpo -c -o libcares_la-ares_nowarn.lo `test -f 'ares_nowarn.c' || echo '$(srcdir)/'`ares_nowarn.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_nowarn.Tpo $(DEPDIR)/libcares_la-ares_nowarn.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_nowarn.c' object='libcares_la-ares_nowarn.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_nowarn.lo `test -f 'ares_nowarn.c' || echo '$(srcdir)/'`ares_nowarn.c - libcares_la-ares_options.lo: ares_options.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_options.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_options.Tpo -c -o libcares_la-ares_options.lo `test -f 'ares_options.c' || echo '$(srcdir)/'`ares_options.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_options.Tpo $(DEPDIR)/libcares_la-ares_options.Plo @@ -1215,6 +1313,13 @@ libcares_la-ares_process.lo: ares_process.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_process.lo `test -f 'ares_process.c' || echo '$(srcdir)/'`ares_process.c +libcares_la-ares_qcache.lo: ares_qcache.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_qcache.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_qcache.Tpo -c -o libcares_la-ares_qcache.lo `test -f 'ares_qcache.c' || echo '$(srcdir)/'`ares_qcache.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_qcache.Tpo $(DEPDIR)/libcares_la-ares_qcache.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_qcache.c' object='libcares_la-ares_qcache.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_qcache.lo `test -f 'ares_qcache.c' || echo '$(srcdir)/'`ares_qcache.c + libcares_la-ares_query.lo: ares_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_query.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_query.Tpo -c -o libcares_la-ares_query.lo `test -f 'ares_query.c' || echo '$(srcdir)/'`ares_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_query.Tpo $(DEPDIR)/libcares_la-ares_query.Plo @@ -1250,12 +1355,12 @@ libcares_la-ares_strcasecmp.lo: ares_strcasecmp.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_strcasecmp.lo `test -f 'ares_strcasecmp.c' || echo '$(srcdir)/'`ares_strcasecmp.c -libcares_la-ares_strdup.lo: ares_strdup.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_strdup.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_strdup.Tpo -c -o libcares_la-ares_strdup.lo `test -f 'ares_strdup.c' || echo '$(srcdir)/'`ares_strdup.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_strdup.Tpo $(DEPDIR)/libcares_la-ares_strdup.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_strdup.c' object='libcares_la-ares_strdup.lo' libtool=yes @AMDEPBACKSLASH@ +libcares_la-ares_str.lo: ares_str.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_str.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_str.Tpo -c -o libcares_la-ares_str.lo `test -f 'ares_str.c' || echo '$(srcdir)/'`ares_str.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_str.Tpo $(DEPDIR)/libcares_la-ares_str.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_str.c' object='libcares_la-ares_str.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_strdup.lo `test -f 'ares_strdup.c' || echo '$(srcdir)/'`ares_strdup.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_str.lo `test -f 'ares_str.c' || echo '$(srcdir)/'`ares_str.c libcares_la-ares_strerror.lo: ares_strerror.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_strerror.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_strerror.Tpo -c -o libcares_la-ares_strerror.lo `test -f 'ares_strerror.c' || echo '$(srcdir)/'`ares_strerror.c @@ -1271,6 +1376,20 @@ libcares_la-ares_strsplit.lo: ares_strsplit.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_strsplit.lo `test -f 'ares_strsplit.c' || echo '$(srcdir)/'`ares_strsplit.c +libcares_la-ares_sysconfig.lo: ares_sysconfig.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_sysconfig.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_sysconfig.Tpo -c -o libcares_la-ares_sysconfig.lo `test -f 'ares_sysconfig.c' || echo '$(srcdir)/'`ares_sysconfig.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_sysconfig.Tpo $(DEPDIR)/libcares_la-ares_sysconfig.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_sysconfig.c' object='libcares_la-ares_sysconfig.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_sysconfig.lo `test -f 'ares_sysconfig.c' || echo '$(srcdir)/'`ares_sysconfig.c + +libcares_la-ares_sysconfig_files.lo: ares_sysconfig_files.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_sysconfig_files.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_sysconfig_files.Tpo -c -o libcares_la-ares_sysconfig_files.lo `test -f 'ares_sysconfig_files.c' || echo '$(srcdir)/'`ares_sysconfig_files.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_sysconfig_files.Tpo $(DEPDIR)/libcares_la-ares_sysconfig_files.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_sysconfig_files.c' object='libcares_la-ares_sysconfig_files.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_sysconfig_files.lo `test -f 'ares_sysconfig_files.c' || echo '$(srcdir)/'`ares_sysconfig_files.c + libcares_la-ares_timeout.lo: ares_timeout.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_timeout.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_timeout.Tpo -c -o libcares_la-ares_timeout.lo `test -f 'ares_timeout.c' || echo '$(srcdir)/'`ares_timeout.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_timeout.Tpo $(DEPDIR)/libcares_la-ares_timeout.Plo @@ -1278,6 +1397,13 @@ libcares_la-ares_timeout.lo: ares_timeout.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_timeout.lo `test -f 'ares_timeout.c' || echo '$(srcdir)/'`ares_timeout.c +libcares_la-ares_update_servers.lo: ares_update_servers.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_update_servers.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_update_servers.Tpo -c -o libcares_la-ares_update_servers.lo `test -f 'ares_update_servers.c' || echo '$(srcdir)/'`ares_update_servers.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_update_servers.Tpo $(DEPDIR)/libcares_la-ares_update_servers.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_update_servers.c' object='libcares_la-ares_update_servers.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_update_servers.lo `test -f 'ares_update_servers.c' || echo '$(srcdir)/'`ares_update_servers.c + libcares_la-ares_version.lo: ares_version.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_version.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_version.Tpo -c -o libcares_la-ares_version.lo `test -f 'ares_version.c' || echo '$(srcdir)/'`ares_version.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_version.Tpo $(DEPDIR)/libcares_la-ares_version.Plo @@ -1524,22 +1650,29 @@ distclean: distclean-recursive -rm -f ./$(DEPDIR)/libcares_la-ares__addrinfo_localhost.Plo -rm -f ./$(DEPDIR)/libcares_la-ares__buf.Plo -rm -f ./$(DEPDIR)/libcares_la-ares__close_sockets.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares__get_hostent.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares__hosts_file.Plo -rm -f ./$(DEPDIR)/libcares_la-ares__htable.Plo -rm -f ./$(DEPDIR)/libcares_la-ares__htable_asvp.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares__htable_stvp.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares__htable_strvp.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares__htable_szvp.Plo -rm -f ./$(DEPDIR)/libcares_la-ares__llist.Plo -rm -f ./$(DEPDIR)/libcares_la-ares__parse_into_addrinfo.Plo -rm -f ./$(DEPDIR)/libcares_la-ares__read_line.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares__readaddrinfo.Plo -rm -f ./$(DEPDIR)/libcares_la-ares__slist.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares__socket.Plo -rm -f ./$(DEPDIR)/libcares_la-ares__sortaddrinfo.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares__threads.Plo -rm -f ./$(DEPDIR)/libcares_la-ares__timeval.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_android.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_cancel.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_create_query.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_data.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_destroy.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_dns_mapping.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_dns_name.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_dns_parse.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_dns_record.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_dns_write.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_expand_name.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_expand_string.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_fds.Plo @@ -1554,8 +1687,8 @@ distclean: distclean-recursive -rm -f ./$(DEPDIR)/libcares_la-ares_getsock.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_init.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_library_init.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_math.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_mkquery.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_nowarn.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_options.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_parse_a_reply.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_parse_aaaa_reply.Plo @@ -1570,15 +1703,19 @@ distclean: distclean-recursive -rm -f ./$(DEPDIR)/libcares_la-ares_parse_uri_reply.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_platform.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_process.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_qcache.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_query.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_rand.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_search.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_send.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_str.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_strcasecmp.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_strdup.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_strerror.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_strsplit.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_sysconfig.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_sysconfig_files.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_timeout.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_update_servers.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_version.Plo -rm -f ./$(DEPDIR)/libcares_la-bitncmp.Plo -rm -f ./$(DEPDIR)/libcares_la-inet_net_pton.Plo @@ -1633,22 +1770,29 @@ maintainer-clean: maintainer-clean-recursive -rm -f ./$(DEPDIR)/libcares_la-ares__addrinfo_localhost.Plo -rm -f ./$(DEPDIR)/libcares_la-ares__buf.Plo -rm -f ./$(DEPDIR)/libcares_la-ares__close_sockets.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares__get_hostent.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares__hosts_file.Plo -rm -f ./$(DEPDIR)/libcares_la-ares__htable.Plo -rm -f ./$(DEPDIR)/libcares_la-ares__htable_asvp.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares__htable_stvp.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares__htable_strvp.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares__htable_szvp.Plo -rm -f ./$(DEPDIR)/libcares_la-ares__llist.Plo -rm -f ./$(DEPDIR)/libcares_la-ares__parse_into_addrinfo.Plo -rm -f ./$(DEPDIR)/libcares_la-ares__read_line.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares__readaddrinfo.Plo -rm -f ./$(DEPDIR)/libcares_la-ares__slist.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares__socket.Plo -rm -f ./$(DEPDIR)/libcares_la-ares__sortaddrinfo.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares__threads.Plo -rm -f ./$(DEPDIR)/libcares_la-ares__timeval.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_android.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_cancel.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_create_query.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_data.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_destroy.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_dns_mapping.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_dns_name.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_dns_parse.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_dns_record.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_dns_write.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_expand_name.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_expand_string.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_fds.Plo @@ -1663,8 +1807,8 @@ maintainer-clean: maintainer-clean-recursive -rm -f ./$(DEPDIR)/libcares_la-ares_getsock.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_init.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_library_init.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_math.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_mkquery.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_nowarn.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_options.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_parse_a_reply.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_parse_aaaa_reply.Plo @@ -1679,15 +1823,19 @@ maintainer-clean: maintainer-clean-recursive -rm -f ./$(DEPDIR)/libcares_la-ares_parse_uri_reply.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_platform.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_process.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_qcache.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_query.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_rand.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_search.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_send.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_str.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_strcasecmp.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_strdup.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_strerror.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_strsplit.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_sysconfig.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_sysconfig_files.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_timeout.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_update_servers.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_version.Plo -rm -f ./$(DEPDIR)/libcares_la-bitncmp.Plo -rm -f ./$(DEPDIR)/libcares_la-inet_net_pton.Plo diff --git a/deps/cares/src/lib/Makefile.inc b/deps/cares/src/lib/Makefile.inc index ef0a8aca98104a..8324a3553cbbc4 100644 --- a/deps/cares/src/lib/Makefile.inc +++ b/deps/cares/src/lib/Makefile.inc @@ -3,23 +3,30 @@ CSOURCES = ares__addrinfo2hostent.c \ ares__addrinfo_localhost.c \ + ares__buf.c \ ares__close_sockets.c \ - ares__get_hostent.c \ + ares__hosts_file.c \ ares__htable.c \ ares__htable_asvp.c \ - ares__htable_stvp.c \ + ares__htable_strvp.c \ + ares__htable_szvp.c \ ares__llist.c \ ares__parse_into_addrinfo.c \ - ares__buf.c \ - ares__readaddrinfo.c \ - ares__slist.c \ - ares__sortaddrinfo.c \ ares__read_line.c \ + ares__slist.c \ + ares__socket.c \ + ares__sortaddrinfo.c \ + ares__threads.c \ ares__timeval.c \ ares_android.c \ ares_cancel.c \ ares_data.c \ ares_destroy.c \ + ares_dns_mapping.c \ + ares_dns_name.c \ + ares_dns_parse.c \ + ares_dns_record.c \ + ares_dns_write.c \ ares_expand_name.c \ ares_expand_string.c \ ares_fds.c \ @@ -34,9 +41,9 @@ CSOURCES = ares__addrinfo2hostent.c \ ares_getsock.c \ ares_init.c \ ares_library_init.c \ + ares_math.c \ ares_mkquery.c \ ares_create_query.c \ - ares_nowarn.c \ ares_options.c \ ares_parse_a_reply.c \ ares_parse_aaaa_reply.c \ @@ -51,41 +58,45 @@ CSOURCES = ares__addrinfo2hostent.c \ ares_parse_uri_reply.c \ ares_platform.c \ ares_process.c \ + ares_qcache.c \ ares_query.c \ ares_rand.c \ ares_search.c \ ares_send.c \ ares_strcasecmp.c \ - ares_strdup.c \ + ares_str.c \ ares_strerror.c \ ares_strsplit.c \ + ares_sysconfig.c \ + ares_sysconfig_files.c \ ares_timeout.c \ + ares_update_servers.c \ ares_version.c \ bitncmp.c \ inet_net_pton.c \ inet_ntop.c \ windows_port.c -HHEADERS = ares__htable.h \ +HHEADERS = ares__buf.h \ + ares__htable.h \ ares__htable_asvp.h \ - ares__htable_stvp.h \ + ares__htable_strvp.h \ + ares__htable_szvp.h \ ares__llist.h \ - ares__buf.h \ ares__slist.h \ ares_android.h \ ares_data.h \ + ares_dns_private.h \ ares_getenv.h \ ares_inet_net_pton.h \ ares_iphlpapi.h \ ares_ipv6.h \ - ares_nowarn.h \ ares_platform.h \ ares_private.h \ ares_strcasecmp.h \ - ares_strdup.h \ + ares_str.h \ ares_strsplit.h \ bitncmp.h \ ares_setup.h \ setup_once.h - diff --git a/deps/cares/src/lib/ares__addrinfo2hostent.c b/deps/cares/src/lib/ares__addrinfo2hostent.c index 1798fc69fa2abc..ec1121778978c7 100644 --- a/deps/cares/src/lib/ares__addrinfo2hostent.c +++ b/deps/cares/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 = 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); - } + + 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; + } + + 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 @@ int ares__addrinfo2hostent(const struct ares_addrinfo *ai, int family, 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/deps/cares/src/lib/ares__addrinfo_localhost.c b/deps/cares/src/lib/ares__addrinfo_localhost.c index a086d3f12fd340..baa9b37212bb94 100644 --- a/deps/cares/src/lib/ares__addrinfo_localhost.c +++ b/deps/cares/src/lib/ares__addrinfo_localhost.c @@ -38,164 +38,152 @@ #endif #if defined(_WIN32) && defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0600 -#include -#include +# include +#endif + +#if defined(USE_WINSOCK) +# if defined(HAVE_IPHLPAPI_H) +# include +# endif +# if defined(HAVE_NETIOAPI_H) +# include +# 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; iNumEntries; 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 @@ static int ares__system_loopback_addrs(int aftype, #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/deps/cares/src/lib/ares__buf.c b/deps/cares/src/lib/ares__buf.c index 777a5300c9942d..a885db3b04b4ce 100644 --- a/deps/cares/src/lib/ares__buf.c +++ b/deps/cares/src/lib/ares__buf.c @@ -33,40 +33,82 @@ #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_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__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 +116,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 +202,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 +239,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,113 +389,258 @@ 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; 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; 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); -int ares__buf_fetch_bytes(ares__buf_t *buf, unsigned char *bytes, - size_t len) + if (buf == NULL || u32 == NULL || remaining_len < sizeof(*u32)) { + return ARES_EBADRESP; + } + + *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; -size_t ares__buf_consume_whitespace(ares__buf_t *buf, int include_linefeed) + 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); +} + +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 0) + if (i > 0) { ares__buf_consume(buf, i); + } return i; } @@ -392,11 +670,12 @@ 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 0) + 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_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) + if (ptr == NULL) { return 0; + } - for (i=0; i 0) + if (include_linefeed && i < remaining_len && ptr[i] == '\n') { + i++; + } + + if (i > 0) { ares__buf_consume(buf, i); + } return i; } - -int ares__buf_begins_with(ares__buf_t *buf, const unsigned char *data, - size_t data_len) +ares_status_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_EFORMERR; + } - if (data_len > remaining_len) + if (data_len > remaining_len) { return ARES_EBADRESP; + } - if (memcmp(ptr, data, data_len) == 0) + if (memcmp(ptr, data, data_len) == 0) { return ARES_EBADRESP; + } return ARES_SUCCESS; } - size_t ares__buf_len(const ares__buf_t *buf) { size_t len = 0; @@ -468,9 +750,225 @@ size_t ares__buf_len(const ares__buf_t *buf) return len; } - 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 (idx > buf->data_len) { + return ARES_EFORMERR; + } + + 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"; + + 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) +{ + 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; + + /* 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) +{ + 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; +} diff --git a/deps/cares/src/lib/ares__buf.h b/deps/cares/src/lib/ares__buf.h index d81fc26f426993..baa28e06a397af 100644 --- a/deps/cares/src/lib/ares__buf.h +++ b/deps/cares/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] data_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,17 @@ 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 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); /*! Check the unprocessed buffer to see if it begins with the sequence of @@ -224,8 +391,8 @@ size_t ares__buf_consume_line(ares__buf_t *buf, int include_linefeed); * \param[in] data_len Length of data to compare. * \return ARES_SUCCESS or one of the c-ares error codes */ -int ares__buf_begins_with(ares__buf_t *buf, const unsigned char *data, - size_t data_len); +ares_status_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 +400,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,10 +410,99 @@ 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] str 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); /*! @} */ #endif /* __ARES__BUF_H */ diff --git a/deps/cares/src/lib/ares__close_sockets.c b/deps/cares/src/lib/ares__close_sockets.c index fe64e54037d0b3..3aba9f649eeae5 100644 --- a/deps/cares/src/lib/ares__close_sockets.c +++ b/deps/cares/src/lib/ares__close_sockets.c @@ -31,38 +31,47 @@ #include "ares_private.h" #include +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,33 @@ 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 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/deps/cares/src/lib/ares__get_hostent.c b/deps/cares/src/lib/ares__get_hostent.c deleted file mode 100644 index 8ac2425ed46106..00000000000000 --- a/deps/cares/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 -#endif -#ifdef HAVE_NETDB_H -# include -#endif -#ifdef HAVE_ARPA_INET_H -# include -#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/deps/cares/src/lib/ares__hosts_file.c b/deps/cares/src/lib/ares__hosts_file.c new file mode 100644 index 00000000000000..09f3f72b0faefd --- /dev/null +++ b/deps/cares/src/lib/ares__hosts_file.c @@ -0,0 +1,1119 @@ +/* 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 +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef HAVE_NETINET_IN_H +# include +#endif +#ifdef HAVE_NETDB_H +# include +#endif +#ifdef HAVE_ARPA_INET_H +# include +#endif +#include +#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; +}; + +static ares_status_t ares__read_file_into_buf(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; +} + +static 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; +} + +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__read_file_into_buf(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 = 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 = 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 = (int)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/deps/cares/src/lib/ares__htable.c b/deps/cares/src/lib/ares__htable.c index 3ea65642d98c68..20ce9ca729eb75 100644 --- a/deps/cares/src/lib/ares__htable.c +++ b/deps/cares/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,6 +41,7 @@ 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 @@ -50,35 +51,38 @@ struct ares__htable { 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; ibuckets, 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,7 +135,6 @@ ares__htable_t *ares__htable_create(ares__htable_hashfunc_t hash_func, return NULL; } - /*! 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. * We are doing "hash & (size - 1)" since we are guaranteeing a power of @@ -142,106 +142,172 @@ ares__htable_t *ares__htable_create(ares__htable_hashfunc_t hash_func, * 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; inum_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; } + } - if (ares__llist_insert_first(buckets[idx], val) == NULL) { - goto fail; + /* 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; + } + + /* 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 +316,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,13 +387,13 @@ 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; @@ -321,53 +402,40 @@ unsigned int ares__htable_hash_FNV1a(const unsigned char *key, size_t key_len, /* 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 + 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 *= 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/deps/cares/src/lib/ares__htable.h b/deps/cares/src/lib/ares__htable.h index bbd36f779b4623..89103bdd5d8f75 100644 --- a/deps/cares/src/lib/ares__htable.h +++ b/deps/cares/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); +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); +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 - * +/*! Destroy the initialized hashtable + * * \param[in] 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,40 @@ 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); /*! 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 +146,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/deps/cares/src/lib/ares__htable_asvp.c b/deps/cares/src/lib/ares__htable_asvp.c index 70265241592c28..f6991c3b1b80ad 100644 --- a/deps/cares/src/lib/ares__htable_asvp.c +++ b/deps/cares/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,83 @@ ares__htable_asvp_t *ares__htable_asvp_create( return NULL; } - -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) { 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/deps/cares/src/lib/ares__htable_asvp.h b/deps/cares/src/lib/ares__htable_asvp.h index f53b2775e02e1e..1ee505a2f0ba7c 100644 --- a/deps/cares/src/lib/ares__htable_asvp.h +++ b/deps/cares/src/lib/ares__htable_asvp.h @@ -48,72 +48,72 @@ 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); +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); /*! 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/deps/cares/src/lib/ares__htable_strvp.c b/deps/cares/src/lib/ares__htable_strvp.c new file mode 100644 index 00000000000000..bfae4c3622891c --- /dev/null +++ b/deps/cares/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/deps/cares/src/lib/ares__htable_strvp.h b/deps/cares/src/lib/ares__htable_strvp.h new file mode 100644 index 00000000000000..80d375c06804a5 --- /dev/null +++ b/deps/cares/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/deps/cares/src/lib/ares__htable_stvp.c b/deps/cares/src/lib/ares__htable_szvp.c similarity index 58% rename from deps/cares/src/lib/ares__htable_stvp.c rename to deps/cares/src/lib/ares__htable_szvp.c index 7a4cd40a763573..2ff64784bcd6dd 100644 --- a/deps/cares/src/lib/ares__htable_stvp.c +++ b/deps/cares/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 @@ ares__htable_stvp_t *ares__htable_stvp_create( 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/deps/cares/src/lib/ares__htable_stvp.h b/deps/cares/src/lib/ares__htable_szvp.h similarity index 71% rename from deps/cares/src/lib/ares__htable_stvp.h rename to deps/cares/src/lib/ares__htable_szvp.h index 11d9d5ed4cfc1f..9857afe79604d3 100644 --- a/deps/cares/src/lib/ares__htable_stvp.h +++ b/deps/cares/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/deps/cares/src/lib/ares__llist.c b/deps/cares/src/lib/ares__llist.c index 9ccda81a6ad6b8..d175da2bd3baf6 100644 --- a/deps/cares/src/lib/ares__llist.c +++ b/deps/cares/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/deps/cares/src/lib/ares__llist.h b/deps/cares/src/lib/ares__llist.h index 950c7ac1d0c5eb..bd18bb9ec1d54c 100644 --- a/deps/cares/src/lib/ares__llist.h +++ b/deps/cares/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); +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] 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] 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/deps/cares/src/lib/ares__parse_into_addrinfo.c b/deps/cares/src/lib/ares__parse_into_addrinfo.c index 73a17ea0ed697d..308cc21458b63f 100644 --- a/deps/cares/src/lib/ares__parse_into_addrinfo.c +++ b/deps/cares/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 #endif -#include "ares_nameser.h" - #ifdef HAVE_STRINGS_H # include #endif @@ -46,194 +45,140 @@ #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 unsigned char *abuf, size_t alen, + 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; + ares_dns_record_t *dnsrec = NULL; + 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; + + status = ares_dns_parse(abuf, alen, 0, &dnsrec); + if (status != ARES_SUCCESS) { + goto done; + } + + /* 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++) { + const char *rname = NULL; + ares_dns_rec_type_t rtype; + const ares_dns_rr_t *rr = + ares_dns_record_rr_get(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); + rname = ares_dns_rr_get_name(rr); + + /* Old code did this hostname sanity check */ + if ((rtype == ARES_REC_TYPE_A || rtype == ARES_REC_TYPE_AAAA) && + strcasecmp(rname, hostname) != 0) { + 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 (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 (!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); + ares_dns_record_destroy(dnsrec); + + /* compatibility */ + if (status == ARES_EBADNAME) { + status = ARES_EBADRESP; + } + return status; } diff --git a/deps/cares/src/lib/ares__read_line.c b/deps/cares/src/lib/ares__read_line.c index 38beda6fb06120..d65ac1fcf85a18 100644 --- a/deps/cares/src/lib/ares__read_line.c +++ b/deps/cares/src/lib/ares__read_line.c @@ -28,7 +28,6 @@ #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 @@ -39,46 +38,45 @@ * 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) +ares_status_t ares__read_line(FILE *fp, char **buf, size_t *bufsize) { - char *newbuf; + char *newbuf; size_t offset = 0; size_t len; - if (*buf == NULL) - { - *buf = ares_malloc(128); - if (!*buf) - return ARES_ENOMEM; - *bufsize = 128; + if (*buf == NULL) { + *buf = ares_malloc(128); + if (!*buf) { + return ARES_ENOMEM; } + *bufsize = 128; + } - for (;;) - { - int bytestoread = aresx_uztosi(*bufsize - offset); + for (;;) { + int bytestoread = (int)(*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; + if (!fgets(*buf + offset, bytestoread, fp)) { + return (offset != 0) ? 0 : (ferror(fp)) ? ARES_EFILE : ARES_EOF; + } + len = offset + ares_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; + /* 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/deps/cares/src/lib/ares__readaddrinfo.c b/deps/cares/src/lib/ares__readaddrinfo.c deleted file mode 100644 index fe999467828dd0..00000000000000 --- a/deps/cares/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 -#endif -#ifdef HAVE_NETDB_H -# include -#endif -#ifdef HAVE_ARPA_INET_H -# include -#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/deps/cares/src/lib/ares__slist.c b/deps/cares/src/lib/ares__slist.c index 9974bc045a357d..5b8098435513ae 100644 --- a/deps/cares/src/lib/ares__slist.c +++ b/deps/cares/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 @@ ares__slist_node_t *ares__slist_insert(ares__slist_t *list, void *val) 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/deps/cares/src/lib/ares__slist.h b/deps/cares/src/lib/ares__slist.h index 2cce2171647b95..04cd50806ebc2d 100644 --- a/deps/cares/src/lib/ares__slist.h +++ b/deps/cares/src/lib/ares__slist.h @@ -60,40 +60,40 @@ 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); +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 */ -typedef int (*ares__slist_cmp_t)(const void *data1, const void *data2); +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/deps/cares/src/lib/ares__socket.c b/deps/cares/src/lib/ares__socket.c new file mode 100644 index 00000000000000..67cd9376588aa0 --- /dev/null +++ b/deps/cares/src/lib/ares__socket.c @@ -0,0 +1,457 @@ +/* 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 +#endif +#ifdef HAVE_NETINET_IN_H +# include +#endif +#ifdef HAVE_NETINET_TCP_H +# include +#endif +#ifdef HAVE_NETDB_H +# include +#endif +#ifdef HAVE_ARPA_INET_H +# include +#endif + +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_SYS_IOCTL_H +# include +#endif +#ifdef NETWARE +# include +#endif + +#include +#include +#include + +#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 recvfrom(s, data, 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); + } + + 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 (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_t *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] && + 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; + } + } + } else if (family == AF_INET6) { + if (memcmp(channel->local_ip6, ares_in6addr_any._S6_un._S6_u8, + 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 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; + + 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)); + 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->addr.family, channel) < 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) +{ + 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) +{ + 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) +{ + channel->sock_funcs = funcs; + channel->sock_func_cb_data = data; +} diff --git a/deps/cares/src/lib/ares__sortaddrinfo.c b/deps/cares/src/lib/ares__sortaddrinfo.c index 78d8891614aa66..155cc8caf4441d 100644 --- a/deps/cares/src/lib/ares__sortaddrinfo.c +++ b/deps/cares/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 . */ /* 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/deps/cares/src/lib/ares__threads.c b/deps/cares/src/lib/ares__threads.c new file mode 100644 index 00000000000000..fe924785787654 --- /dev/null +++ b/deps/cares/src/lib/ares__threads.c @@ -0,0 +1,193 @@ +/* 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; +}; + +static 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; +} + +static void ares__thread_mutex_destroy(ares__thread_mutex_t *mut) +{ + if (mut == NULL) { + return; + } + DeleteCriticalSection(&mut->mutex); + ares_free(mut); +} + +static void ares__thread_mutex_lock(ares__thread_mutex_t *mut) +{ + if (mut == NULL) { + return; + } + EnterCriticalSection(&mut->mutex); +} + +static void ares__thread_mutex_unlock(ares__thread_mutex_t *mut) +{ + if (mut == NULL) { + return; + } + LeaveCriticalSection(&mut->mutex); +} + +# else +# include + +struct ares__thread_mutex { + pthread_mutex_t mutex; +}; + +static 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; +} + +static void ares__thread_mutex_destroy(ares__thread_mutex_t *mut) +{ + if (mut == NULL) { + return; + } + pthread_mutex_destroy(&mut->mutex); + ares_free(mut); +} + +static void ares__thread_mutex_lock(ares__thread_mutex_t *mut) +{ + if (mut == NULL) { + return; + } + pthread_mutex_lock(&mut->mutex); +} + +static void ares__thread_mutex_unlock(ares__thread_mutex_t *mut) +{ + if (mut == NULL) { + return; + } + pthread_mutex_unlock(&mut->mutex); +} +# endif + +ares_status_t ares__channel_threading_init(ares_channel_t *channel) +{ + channel->lock = ares__thread_mutex_create(); + if (channel->lock == NULL) { + return ARES_ENOMEM; + } + return ARES_SUCCESS; +} + +void ares__channel_threading_destroy(ares_channel_t *channel) +{ + ares__thread_mutex_destroy(channel->lock); + channel->lock = 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); +} + +ares_bool_t ares_threadsafety(void) +{ + return ARES_TRUE; +} + +#else +/* NoOp */ +ares_status_t ares__channel_threading_init(ares_channel_t *channel) +{ + (void)channel; + return ARES_SUCCESS; +} + +void ares__channel_threading_destroy(ares_channel_t *channel) +{ + (void)channel; +} + +void ares__channel_lock(ares_channel_t *channel) +{ + (void)channel; +} + +void ares__channel_unlock(ares_channel_t *channel) +{ + (void)channel; +} + +ares_bool_t ares_threadsafety(void) +{ + return ARES_FALSE; +} +#endif diff --git a/deps/cares/src/lib/ares__timeval.c b/deps/cares/src/lib/ares__timeval.c index 5716c53e5021ef..11996f9f11ea35 100644 --- a/deps/cares/src/lib/ares__timeval.c +++ b/deps/cares/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/deps/cares/src/lib/ares_android.c b/deps/cares/src/lib/ares_android.c index ec0a33872d6ff3..778d4d10607fa3 100644 --- a/deps/cares/src/lib/ares_android.c +++ b/deps/cares/src/lib/ares_android.c @@ -25,15 +25,15 @@ */ #if defined(ANDROID) || defined(__ANDROID__) -#include +# include -#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/deps/cares/src/lib/ares_android.h b/deps/cares/src/lib/ares_android.h index 73b8d8ee83ce96..5caadb4fe4b8d7 100644 --- a/deps/cares/src/lib/ares_android.h +++ b/deps/cares/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/deps/cares/src/lib/ares_cancel.c b/deps/cares/src/lib/ares_cancel.c index 353624a111693f..9841f9bf64fc0d 100644 --- a/deps/cares/src/lib/ares_cancel.c +++ b/deps/cares/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,40 @@ 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); 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); } +done: + ares__channel_unlock(channel); } diff --git a/deps/cares/src/lib/ares_config.h.cmake b/deps/cares/src/lib/ares_config.h.cmake index a33eb9caa6a32f..84880695c48076 100644 --- a/deps/cares/src/lib/ares_config.h.cmake +++ b/deps/cares/src/lib/ares_config.h.cmake @@ -17,10 +17,10 @@ #undef CARES_EXPOSE_STATICS /* Defined for build with symbol hiding. */ -#undef CARES_SYMBOL_HIDING +#cmakedefine CARES_SYMBOL_HIDING /* Definition to make a library symbol externally visible. */ -#undef CARES_SYMBOL_SCOPE_EXTERN +#define CARES_SYMBOL_SCOPE_EXTERN @CARES_SYMBOL_SCOPE_EXTERN@ /* Use resolver library to configure cares */ #cmakedefine CARES_USE_LIBRESOLV @@ -179,6 +179,12 @@ /* Define to 1 if you have the `resolve' library (-lresolve). */ #cmakedefine HAVE_LIBRESOLV +/* Define to 1 if you have iphlpapi.h */ +#cmakedefine HAVE_IPHLPAPI_H + +/* Define to 1 if you have netioapi.h */ +#cmakedefine HAVE_NETIOAPI_H + /* Define to 1 if you have the header file. */ #cmakedefine HAVE_LIMITS_H @@ -356,6 +362,9 @@ /* Define if have arc4random_buf() */ #cmakedefine HAVE_ARC4RANDOM_BUF +/* Define if have stat() */ +#cmakedefine HAVE_STAT + /* a suitable file/device to read random data from */ #cmakedefine CARES_RANDOM_FILE "@CARES_RANDOM_FILE@" @@ -440,3 +449,15 @@ /* 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. */ +#cmakedefine HAVE_PTHREAD_H + +/* Define to 1 if you have the pthread_np.h header file. */ +#cmakedefine HAVE_PTHREAD_NP_H + +/* Define to 1 if threads are enabled */ +#cmakedefine CARES_THREADS + +/* Define to 1 if pthread_init() exists */ +#cmakedefine HAVE_PTHREAD_INIT + diff --git a/deps/cares/src/lib/ares_config.h.in b/deps/cares/src/lib/ares_config.h.in index 2e4a60e627c48e..e43e6a53490aec 100644 --- a/deps/cares/src/lib/ares_config.h.in +++ b/deps/cares/src/lib/ares_config.h.in @@ -18,6 +18,9 @@ /* Definition to make a library symbol externally visible. */ #undef CARES_SYMBOL_SCOPE_EXTERN +/* Threading enabled */ +#undef CARES_THREADS + /* the signed version of size_t */ #undef CARES_TYPEOF_ARES_SSIZE_T @@ -175,6 +178,9 @@ /* Define to 1 if you have a working ioctl SIOCGIFADDR function. */ #undef HAVE_IOCTL_SIOCGIFADDR +/* Define to 1 if you have the header file. */ +#undef HAVE_IPHLPAPI_H + /* Define to 1 if you have the `resolve' library (-lresolve). */ #undef HAVE_LIBRESOLVE @@ -205,12 +211,24 @@ /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_TCP_H +/* Define to 1 if you have the header file. */ +#undef HAVE_NETIOAPI_H + /* Define to 1 if you have the header file. */ #undef HAVE_NET_IF_H /* Define to 1 if you have PF_INET6. */ #undef HAVE_PF_INET6 +/* Define to 1 if you have the header file. */ +#undef HAVE_PTHREAD_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_PTHREAD_NP_H + +/* Have PTHREAD_PRIO_INHERIT. */ +#undef HAVE_PTHREAD_PRIO_INHERIT + /* Define to 1 if you have the recv function. */ #undef HAVE_RECV @@ -244,6 +262,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_SOCKET_H +/* Define to 1 if you have the stat function. */ +#undef HAVE_STAT + /* Define to 1 if you have the header file. */ #undef HAVE_STDBOOL_H @@ -391,6 +412,10 @@ /* Define to the version of this package. */ #undef PACKAGE_VERSION +/* Define to necessary symbol if this constant uses a non-standard name on + your system. */ +#undef PTHREAD_CREATE_JOINABLE + /* Define to the type qualifier pointed by arg 5 for recvfrom. */ #undef RECVFROM_QUAL_ARG5 diff --git a/deps/cares/src/lib/ares_create_query.c b/deps/cares/src/lib/ares_create_query.c index 21c6be08bddabe..f66b0ff6e0693d 100644 --- a/deps/cares/src/lib/ares_create_query.c +++ b/deps/cares/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,83 @@ */ #include "ares_setup.h" - -#ifdef HAVE_NETINET_IN_H -# include -#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) { - 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; + + 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); + if (ares__is_onion_domain(name)) { + status = ARES_ENOTFOUND; + goto done; } - else { - DNS_HEADER_SET_RD(q, 0); + + status = ares_dns_record_create(&dnsrec, id, rd ? ARES_FLAG_RD : 0, + ARES_OPCODE_QUERY, ARES_RCODE_NOERROR); + 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_record_query_add(dnsrec, name, (ares_dns_rec_type_t)type, + (ares_dns_class_t)dnsclass); + 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++; - - /* 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; + /* max_udp_size > 0 indicates EDNS, so send OPT RR as an additional record */ + if (max_udp_size > 0) { + ares_dns_rr_t *rr = NULL; + + 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; + } + + if (max_udp_size > 65535) { + status = ARES_EFORMERR; + 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; } - /* 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); + status = ares_dns_rr_set_u16(rr, ARES_RR_OPT_FLAGS, 0); + if (status != ARES_SUCCESS) { + goto done; + } } - 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; + + status = ares_dns_write(dnsrec, bufp, &len); + if (status != ARES_SUCCESS) { + goto done; } - /* we know this fits in an int at this point */ - *buflenp = (int) buflen; - *bufp = buf; + *buflenp = (int)len; - return ARES_SUCCESS; +done: + ares_dns_record_destroy(dnsrec); + return (int)status; } diff --git a/deps/cares/src/lib/ares_data.c b/deps/cares/src/lib/ares_data.c index 9e22339327b407..e37088283bafeb 100644 --- a/deps/cares/src/lib/ares_data.c +++ b/deps/cares/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/deps/cares/src/lib/ares_data.h b/deps/cares/src/lib/ares_data.h index 6965cf2a73dd92..b2c4d22b869a1c 100644 --- a/deps/cares/src/lib/ares_data.h +++ b/deps/cares/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/deps/cares/src/lib/ares_destroy.c b/deps/cares/src/lib/ares_destroy.c index 560082fd0cccc0..d7cfb3bb08facd 100644 --- a/deps/cares/src/lib/ares_destroy.c +++ b/deps/cares/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); @@ -73,13 +57,12 @@ void ares_destroy(ares_channel channel) node = next; } - #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 +72,58 @@ 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); + 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); + 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->lookups) - ares_free(channel->lookups); + ares__hosts_file_destroy(channel->hf); - if (channel->resolvconf_path) - ares_free(channel->resolvconf_path); + ares__qcache_destroy(channel->qcache); - if (channel->hosts_path) - ares_free(channel->hosts_path); - - 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/deps/cares/src/lib/ares_dns_mapping.c b/deps/cares/src/lib/ares_dns_mapping.c new file mode 100644 index 00000000000000..55f1af7939c32f --- /dev/null +++ b/deps/cares/src/lib/ares_dns_mapping.c @@ -0,0 +1,885 @@ +/* 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"; +} diff --git a/deps/cares/src/lib/ares_dns_name.c b/deps/cares/src/lib/ares_dns_name.c new file mode 100644 index 00000000000000..f4085ab2cb9d85 --- /dev/null +++ b/deps/cares/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/deps/cares/src/lib/ares_dns_parse.c b/deps/cares/src/lib/ares_dns_parse.c new file mode 100644 index 00000000000000..da26ffdc0595fd --- /dev/null +++ b/deps/cares/src/lib/ares_dns_parse.c @@ -0,0 +1,1234 @@ +/* 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 +#ifdef HAVE_STDINT_H +# include +#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; + + (void)flags; /* currently unused */ + + /* 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; + } + + /* 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; + } + + /* 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/deps/cares/src/lib/ares_dns_private.h b/deps/cares/src/lib/ares_dns_private.h new file mode 100644 index 00000000000000..91635e74cd8010 --- /dev/null +++ b/deps/cares/src/lib/ares_dns_private.h @@ -0,0 +1,236 @@ +/* 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); + +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/deps/cares/src/lib/ares_dns_record.c b/deps/cares/src/lib/ares_dns_record.c new file mode 100644 index 00000000000000..30219003e24a57 --- /dev/null +++ b/deps/cares/src/lib/ares_dns_record.c @@ -0,0 +1,1316 @@ +/* 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 +#ifdef HAVE_STDINT_H +# include +#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_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]; +} + +static 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; +} diff --git a/deps/cares/src/lib/ares_dns_write.c b/deps/cares/src/lib/ares_dns_write.c new file mode 100644 index 00000000000000..2e99c5ba88aee7 --- /dev/null +++ b/deps/cares/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 +#ifdef HAVE_STDINT_H +# include +#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(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(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(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/deps/cares/src/lib/ares_expand_name.c b/deps/cares/src/lib/ares_expand_name.c index 21c4e93d85bd9c..280490b86a3310 100644 --- a/deps/cares/src/lib/ares_expand_name.c +++ b/deps/cares/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/deps/cares/src/lib/ares_expand_string.c b/deps/cares/src/lib/ares_expand_string.c index 2d6daa1497508b..be7034e2719df1 100644 --- a/deps/cares/src/lib/ares_expand_string.c +++ b/deps/cares/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/deps/cares/src/lib/ares_fds.c b/deps/cares/src/lib/ares_fds.c index 5ee149f9046cc9..e726d4f012879a 100644 --- a/deps/cares/src/lib/ares_fds.c +++ b/deps/cares/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/deps/cares/src/lib/ares_free_hostent.c b/deps/cares/src/lib/ares_free_hostent.c index 0d20673163aac8..a088c1b15cdf8d 100644 --- a/deps/cares/src/lib/ares_free_hostent.c +++ b/deps/cares/src/lib/ares_free_hostent.c @@ -28,7 +28,7 @@ #include "ares_setup.h" #ifdef HAVE_NETDB_H -#include +# include #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/deps/cares/src/lib/ares_freeaddrinfo.c b/deps/cares/src/lib/ares_freeaddrinfo.c index fe458735ee5e19..45d931a3f86f8e 100644 --- a/deps/cares/src/lib/ares_freeaddrinfo.c +++ b/deps/cares/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/deps/cares/src/lib/ares_getaddrinfo.c b/deps/cares/src/lib/ares_getaddrinfo.c index a3a2add1a2f2c1..d5c440b2e445c8 100644 --- a/deps/cares/src/lib/ares_getaddrinfo.c +++ b/deps/cares/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,12 +48,12 @@ #include "ares_nameser.h" #ifdef HAVE_STRINGS_H -#include +# include #endif #include #ifdef HAVE_LIMITS_H -#include +# include #endif #include "ares.h" @@ -62,31 +62,33 @@ #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 */ - + char **domains; /* duplicate from channel for ares_reinit() safety */ + size_t ndomains; + 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 */ + ares_ssize_t next_domain; /* next search domain to try */ + size_t + nodata_cnt; /* Track nodata responses to possibly override final result */ }; static const struct ares_addrinfo_hints default_hints = { @@ -96,139 +98,88 @@ 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 struct ares_addrinfo_cname *ares__malloc_addrinfo_cname(void) +static void host_callback(void *arg, int status, int timeouts, + unsigned char *abuf, int alen); +static ares_bool_t as_is_first(const struct host_query *hquery); +static ares_bool_t as_is_only(const struct host_query *hquery); +static ares_bool_t next_dns_lookup(struct host_query *hquery); + +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,377 +189,312 @@ 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 end_hquery(struct host_query *hquery, ares_status_t status) { - struct ares_addrinfo_node sentinel; + struct ares_addrinfo_node sentinel; struct ares_addrinfo_node *next; - 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; - } + 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); + hquery->callback(hquery->arg, (int)status, (int)hquery->timeouts, hquery->ai); + ares__strsplit_free(hquery->domains, hquery->ndomains); + ares_free(hquery->lookups); ares_free(hquery->name); ares_free(hquery); } -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) { - 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; + unsigned short qid = 0; + hquery->timeouts += (size_t)timeouts; hquery->remaining--; if (status == ARES_SUCCESS) { - addinfostatus = ares__parse_into_addrinfo(abuf, alen, 1, hquery->port, - hquery->ai); + if (alen < 0) { + addinfostatus = ARES_EBADRESP; + } else { + addinfostatus = ares__parse_into_addrinfo(abuf, (size_t)alen, ARES_TRUE, + hquery->port, hquery->ai); + } if (addinfostatus == ARES_SUCCESS && alen >= HFIXEDSZ) { qid = DNS_HEADER_QID(abuf); /* Converts to host byte order */ terminate_retries(hquery, qid); @@ -630,248 +516,260 @@ static void host_callback(void *arg, int status, int timeouts, 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); + end_hquery(hquery, (ares_status_t)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 : (ares_status_t)status); } else { - end_hquery(hquery, status); + end_hquery(hquery, (ares_status_t)status); } } /* 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; + char *alias_name = NULL; + 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 (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 (ares__is_onion_domain(name)) { + callback(arg, ARES_ENOTFOUND, 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); + callback(arg, (int)status, 0, NULL); return; } - if (alias_name) + 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) { + 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; + } } + } - 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) { + ares_free(alias_name); + 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)) { + ares_free(alias_name); + 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; - } + hquery = ares_malloc_zero(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) - { + if (!hquery->name) { + ares_free(hquery); + ares_freeaddrinfo(ai); + callback(arg, ARES_ENOMEM, 0, NULL); + return; + } + hquery->lookups = ares_strdup(channel->lookups); + if (!hquery->lookups) { + ares_free(hquery->name); + ares_free(hquery); + ares_freeaddrinfo(ai); + callback(arg, ARES_ENOMEM, 0, NULL); + return; + } + + if (channel->ndomains) { + /* Duplicate for ares_reinit() safety */ + hquery->domains = + ares__strsplit_duplicate(channel->domains, channel->ndomains); + if (hquery->domains == NULL) { + ares_free(hquery->lookups); + ares_free(hquery->name); ares_free(hquery); ares_freeaddrinfo(ai); callback(arg, ARES_ENOMEM, 0, NULL); return; } + hquery->ndomains = channel->ndomains; + } - 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->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 = hquery->lookups; + hquery->ai = ai; + hquery->next_domain = -1; /* Start performing lookups according to channel->lookups. */ next_lookup(hquery, ARES_ECONNREFUSED /* initial error code */); } -static int next_dns_lookup(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 *s = NULL; - int is_s_allocated = 0; - int status; + if (channel == NULL) { + return; + } + ares__channel_lock(channel); + ares_getaddrinfo_int(channel, name, service, hints, callback, arg); + ares__channel_unlock(channel); +} + +static ares_bool_t next_dns_lookup(struct host_query *hquery) +{ + char *s = NULL; + ares_bool_t is_s_allocated = ARES_FALSE; + ares_status_t 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 (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; - } + if (!s && (size_t)hquery->next_domain == hquery->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; - } + if (!s && (size_t)hquery->next_domain < hquery->ndomains && + !as_is_only(hquery)) { + status = ares__cat_domain(hquery->name, + hquery->domains[hquery->next_domain++], &s); + if (status == ARES_SUCCESS) { + is_s_allocated = ARES_TRUE; } + } - 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; + 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; } - else - { - assert(!hquery->ai->nodes); - return 0; + if (is_s_allocated) { + ares_free(s); } + return ARES_TRUE; + } else { + assert(!hquery->ai->nodes); + return ARES_FALSE; + } } -static int as_is_first(const struct host_query* hquery) +static ares_bool_t as_is_first(const struct host_query *hquery) { - 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; + const char *p; + size_t ndots = 0; + for (p = hquery->name; p && *p; p++) { + if (*p == '.') { + ndots++; } - return ndots >= hquery->channel->ndots; + } + if (as_is_only(hquery)) { + /* prevent ARES_EBADNAME for valid FQDN, where ndots < channel->ndots */ + return ARES_TRUE; + } + return ndots >= hquery->channel->ndots ? ARES_TRUE : ARES_FALSE; } -static int as_is_only(const struct host_query* hquery) +static ares_bool_t as_is_only(const struct host_query *hquery) { - size_t nname = hquery->name?strlen(hquery->name):0; - if (nname && hquery->name[nname-1] == '.') - return 1; - return 0; + size_t nname = ares_strlen(hquery->name); + if (hquery->channel->flags & ARES_FLAG_NOSEARCH) { + return ARES_TRUE; + } + if (hquery->name != NULL && nname && hquery->name[nname - 1] == '.') { + return ARES_TRUE; + } + return ARES_FALSE; } - diff --git a/deps/cares/src/lib/ares_gethostbyaddr.c b/deps/cares/src/lib/ares_gethostbyaddr.c index 628813057b53bc..ab54706ba96889 100644 --- a/deps/cares/src/lib/ares_gethostbyaddr.c +++ b/deps/cares/src/lib/ares_gethostbyaddr.c @@ -45,255 +45,189 @@ #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, - 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); - -void ares_gethostbyaddr(ares_channel channel, const void *addr, int addrlen, - int family, ares_host_callback callback, void *arg) +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, ares_status_t status, + struct hostent *host); +static ares_status_t file_lookup(ares_channel_t *channel, + const struct ares_addr *addr, + struct hostent **host); + +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(aquery->channel, name, C_IN, T_PTR, addr_callback, aquery); + 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) { - 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); + struct addr_query *aquery = (struct addr_query *)arg; + struct hostent *host; + size_t addrlen; + + aquery->timeouts += (size_t)timeouts; + if (status == ARES_SUCCESS) { + if (aquery->addr.family == AF_INET) { + addrlen = sizeof(aquery->addr.addr.addr4); + status = ares_parse_ptr_reply(abuf, alen, &aquery->addr.addr.addr4, + (int)addrlen, AF_INET, &host); + } else { + addrlen = sizeof(aquery->addr.addr.addr6); + status = ares_parse_ptr_reply(abuf, alen, &aquery->addr.addr.addr6, + (int)addrlen, AF_INET6, &host); } - else if (status == ARES_EDESTRUCTION || status == ARES_ECANCELLED) - end_aquery(aquery, status, NULL); - else + end_aquery(aquery, (ares_status_t)status, host); + } else if (status == ARES_EDESTRUCTION || status == ARES_ECANCELLED) { + end_aquery(aquery, (ares_status_t)status, NULL); + } 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/deps/cares/src/lib/ares_gethostbyname.c b/deps/cares/src/lib/ares_gethostbyname.c index 343bd7b73328ad..24deeb692c5e33 100644 --- a/deps/cares/src/lib/ares_gethostbyname.c +++ b/deps/cares/src/lib/ares_gethostbyname.c @@ -40,60 +40,58 @@ #include "ares_nameser.h" #ifdef HAVE_STRINGS_H -#include +# include #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 +100,227 @@ 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; + + 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].addr.addr4.s_addr) { + break; + } + } else { + if (!ares__bitncmp(&addr->s_addr, &sortlist[i].addr.addr4.s_addr, + sortlist[i].mask.bits)) { + 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; - 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; + for (i = 0; i < nsort; i++) { + if (sortlist[i].family != AF_INET6) { + continue; + } + if (!ares__bitncmp(addr, &sortlist[i].addr.addr6, sortlist[i].mask.bits)) { + 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; -static int file_lookup(const char *name, int family, struct hostent **host); + 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; + } + + 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/deps/cares/src/lib/ares_getnameinfo.c b/deps/cares/src/lib/ares_getnameinfo.c index 0d97a318bfd082..2afcfade688dc6 100644 --- a/deps/cares/src/lib/ares_getnameinfo.c +++ b/deps/cares/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 +# include +#endif +#if defined(USE_WINSOCK) && defined(HAVE_IPHLPAPI_H) +# include #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) +# 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); +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_SOCKADDR_IN6_SIN6_SCOPE_ID -static void append_scopeid(struct sockaddr_in6 *addr6, unsigned int scopeid, - char *buf, size_t buflen); +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); -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 */ + 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)); + 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; + } 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); + 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)); + 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, +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) { - 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/deps/cares/src/lib/ares_getsock.c b/deps/cares/src/lib/ares_getsock.c index 48c9076a668e3e..0353bad6391e28 100644 --- a/deps/cares/src/lib/ares_getsock.c +++ b/deps/cares/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/deps/cares/src/lib/ares_inet_net_pton.h b/deps/cares/src/lib/ares_inet_net_pton.h index 179d36d972efb7..0a52855bd8c966 100644 --- a/deps/cares/src/lib/ares_inet_net_pton.h +++ b/deps/cares/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/deps/cares/src/lib/ares_init.c b/deps/cares/src/lib/ares_init.c index 4a671e6ae4ea1f..d737b5853dc0ae 100644 --- a/deps/cares/src/lib/ares_init.c +++ b/deps/cares/src/lib/ares_init.c @@ -28,87 +28,50 @@ #include "ares_setup.h" #ifdef HAVE_SYS_PARAM_H -#include +# include #endif #ifdef HAVE_NETINET_IN_H -#include +# include #endif #ifdef HAVE_NETDB_H -#include +# include #endif #ifdef HAVE_ARPA_INET_H -#include +# include #endif #include "ares_nameser.h" #if defined(ANDROID) || defined(__ANDROID__) -#include -#include "ares_android.h" +# include +# 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 +# include #endif -#if defined(USE_WINSOCK) +#if defined(USE_WINSOCK) && defined(HAVE_IPHLPAPI_H) # include #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 */ +# 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); -#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,1542 +81,109 @@ 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) - 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->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); - (*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->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; - } - - 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_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; - } - - /* 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; - } - - /* 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) -{ - /* 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 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 (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; - } - } - } - - /* 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 0; - } - - return 1; -} - -/* - * 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) -{ - 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); - } - - return *outptr != NULL; -} - -#endif - -static int init_by_resolv_conf(ares_channel channel) -{ -#if !defined(ANDROID) && !defined(__ANDROID__) && !defined(WATT32) && \ - !defined(CARES_USE_LIBRESOLV) - char *line = NULL; -#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); - } - - 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; - } - - 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; - } - } -# 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); - } -#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 (q1->timeout.tv_sec > q2->timeout.tv_sec) { + return 1; + } + if (q1->timeout.tv_sec < q2->timeout.tv_sec) { + return -1; } -#endif + if (q1->timeout.tv_usec > q2->timeout.tv_usec) { + return 1; + } + if (q1->timeout.tv_usec < q2->timeout.tv_usec) { + return -1; + } - /* Handle errors. */ - if (status != ARES_EOF) - { - if (servers != NULL) - ares_free(servers); - if (sortlist != NULL) - ares_free(sortlist); - return status; - } + return 0; +} - /* If we got any name server entries, fill them in. */ - if (servers) - { - channel->servers = servers; - channel->nservers = nservers; - } +static int server_sort_cb(const void *data1, const void *data2) +{ + const struct server_state *s1 = data1; + const struct server_state *s2 = data2; - /* If we got any sortlist entries, fill them in. */ - if (sortlist) - { - channel->sortlist = sortlist; - channel->nsort = nsort; - } + if (s1->consec_failures < s2->consec_failures) { + return -1; + } + if (s1->consec_failures > s2->consec_failures) { + return 1; + } + if (s1->idx < s2->idx) { + return -1; + } + if (s1->idx > s2->idx) { + return 1; + } + return 0; +} - return ARES_SUCCESS; +static void server_destroy_cb(void *data) +{ + if (data == NULL) { + return; + } + ares__destroy_server(data); } -static int init_by_defaults(ares_channel channel) +static ares_status_t init_by_defaults(ares_channel_t *channel) { - char *hostname = NULL; - int rc = ARES_SUCCESS; + char *hostname = NULL; + ares_status_t rc = ARES_SUCCESS; #ifdef HAVE_GETHOSTNAME - char *dot; + const char *dot; #endif - if (channel->flags == -1) - channel->flags = 0; - if (channel->timeout == -1) + /* Enable EDNS by default */ + if (!(channel->optmask & ARES_OPT_FLAGS)) { + channel->flags = ARES_FLAG_EDNS; + } + if (channel->ednspsz == 0) { + channel->ednspsz = EDNSPACKETSZ; + } + + if (channel->timeout == 0) { channel->timeout = DEFAULT_TIMEOUT; - if (channel->tries == -1) + } + + if (channel->tries == 0) { channel->tries = DEFAULT_TRIES; - if (channel->ndots == -1) + } + + if (channel->ndots == 0) { 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; + } - 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; - goto error; + if (ares__slist_len(channel->servers) == 0) { + struct ares_addr addr; + ares__llist_t *sconfig = NULL; + + addr.family = AF_INET; + addr.addr.addr4.s_addr = htonl(INADDR_LOOPBACK); + + rc = ares__sconfig_append(&sconfig, &addr, 0, 0); + if (rc != ARES_SUCCESS) { + return rc; + } + + rc = ares__servers_update(channel, sconfig, ARES_FALSE); + ares__llist_destroy(sconfig); + + if (rc != ARES_SUCCESS) { + return rc; } - 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. */ @@ -1661,12 +191,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; } @@ -1674,19 +204,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'; @@ -1713,716 +242,326 @@ 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]) +error: + if (rc) { + if (channel->domains && channel->domains[0]) { ares_free(channel->domains[0]); - if(channel->domains) { + } + if (channel->domains) { ares_free(channel->domains); channel->domains = NULL; } - if(channel->lookups) { + if (channel->lookups) { ares_free(channel->lookups); channel->lookups = NULL; } - if(channel->resolvconf_path) { + if (channel->resolvconf_path) { ares_free(channel->resolvconf_path); channel->resolvconf_path = NULL; } - if(channel->hosts_path) { + if (channel->hosts_path) { ares_free(channel->hosts_path); channel->hosts_path = NULL; } } - if(hostname) + 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; - - 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 */ + ares_channel_t *channel; + ares_status_t status = ARES_SUCCESS; -#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; + if (ares_library_initialized() != ARES_SUCCESS) { + return ARES_ENOTINITIALIZED; /* LCOV_EXCL_LINE: n/a on non-WinSock */ + } - /* Misuse */ - if (netmask > 128) - return 0; + channel = ares_malloc_zero(sizeof(*channel)); + if (!channel) { + *channelptr = NULL; + return ARES_ENOMEM; + } - /* 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); - - if (port_start) { - mylen = (port_end-port_start)+1; - /* Larger than buffer with null term */ - if (mylen+1 > sizeof(ipport)) { - return ARES_EBADSTR; - } - memset(ipport, 0, sizeof(ipport)); - memcpy(ipport, port_start, mylen); - } else { - snprintf(ipport, sizeof(ipport), "0"); + /* + * 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))); } - /* 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; - - /* Pointer to start of IPv4 or IPv6 address part. */ - txtaddr = p; + ares_status_t status; - /* Advance past this address. */ - while (*p && !ISSPACE(*p) && (*p != ',')) - p++; + if (channel == NULL) { + return ARES_EFORMERR; + } - if (parse_dnsaddrport(txtaddr, p-txtaddr, &host, &port) != - ARES_SUCCESS) { - continue; - } + ares__channel_lock(channel); - /* 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; + struct ares_addr_port_node *servers; + 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, "retry:"); - 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; - 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. */ - 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) { + rc = (ares_status_t)ares_get_servers_ports(src, &servers); + if (rc != ARES_SUCCESS) { + ares_destroy(*dest); + *dest = NULL; + 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(*dest, servers); + ares_free_data(servers); + 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) +void ares_set_local_dev(ares_channel_t *channel, const char *local_dev_name) { - 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) -{ - 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/deps/cares/src/lib/ares_iphlpapi.h b/deps/cares/src/lib/ares_iphlpapi.h index 31db7d3829a9aa..0eaacd18f69b0f 100644 --- a/deps/cares/src/lib/ares_iphlpapi.h +++ b/deps/cares/src/lib/ares_iphlpapi.h @@ -29,58 +29,57 @@ #if defined(USE_WINSOCK) -#ifndef INET_ADDRSTRLEN -#define INET_ADDRSTRLEN 22 -#endif +# ifndef INET_ADDRSTRLEN +# define INET_ADDRSTRLEN 22 +# endif -#ifndef INET6_ADDRSTRLEN -#define INET6_ADDRSTRLEN 65 -#endif +# ifndef INET6_ADDRSTRLEN +# define INET6_ADDRSTRLEN 65 +# endif /* ---------------------------------- */ -#if !defined(_WS2DEF_) && \ - !defined(__CSADDR_DEFINED__) && \ +# if !defined(_WS2DEF_) && !defined(__CSADDR_DEFINED__) && \ !defined(__CSADDR_T_DEFINED) /* ---------------------------------- */ typedef struct _SOCKET_ADDRESS { LPSOCKADDR lpSockaddr; - INT iSockaddrLength; + INT iSockaddrLength; } SOCKET_ADDRESS, *PSOCKET_ADDRESS; typedef struct _CSADDR_INFO { SOCKET_ADDRESS LocalAddr; SOCKET_ADDRESS RemoteAddr; - INT iSocketType; - INT iProtocol; + INT iSocketType; + INT iProtocol; } CSADDR_INFO, *PCSADDR_INFO; /* --------------------------------- */ -#endif /* ! _WS2DEF_ && \ */ +# endif /* ! _WS2DEF_ && \ */ /* ! __CSADDR_DEFINED__ && \ */ /* ! __CSADDR_T_DEFINED */ /* --------------------------------- */ /* ------------------------------- */ -#if !defined(IP_ADAPTER_DDNS_ENABLED) +# if !defined(IP_ADAPTER_DDNS_ENABLED) /* ------------------------------- */ -#define IP_ADAPTER_ADDRESS_DNS_ELIGIBLE 0x0001 -#define IP_ADAPTER_ADDRESS_TRANSIENT 0x0002 +# define IP_ADAPTER_ADDRESS_DNS_ELIGIBLE 0x0001 +# define IP_ADAPTER_ADDRESS_TRANSIENT 0x0002 -#define IP_ADAPTER_DDNS_ENABLED 0x0001 -#define IP_ADAPTER_REGISTER_ADAPTER_SUFFIX 0x0002 -#define IP_ADAPTER_DHCP_ENABLED 0x0004 -#define IP_ADAPTER_RECEIVE_ONLY 0x0008 -#define IP_ADAPTER_NO_MULTICAST 0x0010 -#define IP_ADAPTER_IPV6_OTHER_STATEFUL_CONFIG 0x0020 +# define IP_ADAPTER_DDNS_ENABLED 0x0001 +# define IP_ADAPTER_REGISTER_ADAPTER_SUFFIX 0x0002 +# define IP_ADAPTER_DHCP_ENABLED 0x0004 +# define IP_ADAPTER_RECEIVE_ONLY 0x0008 +# define IP_ADAPTER_NO_MULTICAST 0x0010 +# define IP_ADAPTER_IPV6_OTHER_STATEFUL_CONFIG 0x0020 -#define GAA_FLAG_SKIP_UNICAST 0x0001 -#define GAA_FLAG_SKIP_ANYCAST 0x0002 -#define GAA_FLAG_SKIP_MULTICAST 0x0004 -#define GAA_FLAG_SKIP_DNS_SERVER 0x0008 -#define GAA_FLAG_INCLUDE_PREFIX 0x0010 -#define GAA_FLAG_SKIP_FRIENDLY_NAME 0x0020 +# define GAA_FLAG_SKIP_UNICAST 0x0001 +# define GAA_FLAG_SKIP_ANYCAST 0x0002 +# define GAA_FLAG_SKIP_MULTICAST 0x0004 +# define GAA_FLAG_SKIP_DNS_SERVER 0x0008 +# define GAA_FLAG_INCLUDE_PREFIX 0x0010 +# define GAA_FLAG_SKIP_FRIENDLY_NAME 0x0020 typedef enum { IpPrefixOriginOther = 0, @@ -130,100 +129,106 @@ typedef enum { typedef struct _IP_ADAPTER_UNICAST_ADDRESS { union { ULONGLONG Alignment; + struct { ULONG Length; DWORD Flags; } s; } u; struct _IP_ADAPTER_UNICAST_ADDRESS *Next; - SOCKET_ADDRESS Address; - IP_PREFIX_ORIGIN PrefixOrigin; - IP_SUFFIX_ORIGIN SuffixOrigin; - IP_DAD_STATE DadState; - ULONG ValidLifetime; - ULONG PreferredLifetime; - ULONG LeaseLifetime; + SOCKET_ADDRESS Address; + IP_PREFIX_ORIGIN PrefixOrigin; + IP_SUFFIX_ORIGIN SuffixOrigin; + IP_DAD_STATE DadState; + ULONG ValidLifetime; + ULONG PreferredLifetime; + ULONG LeaseLifetime; } IP_ADAPTER_UNICAST_ADDRESS, *PIP_ADAPTER_UNICAST_ADDRESS; typedef struct _IP_ADAPTER_ANYCAST_ADDRESS { union { ULONGLONG Alignment; + struct { ULONG Length; DWORD Flags; } s; } u; struct _IP_ADAPTER_ANYCAST_ADDRESS *Next; - SOCKET_ADDRESS Address; + SOCKET_ADDRESS Address; } IP_ADAPTER_ANYCAST_ADDRESS, *PIP_ADAPTER_ANYCAST_ADDRESS; typedef struct _IP_ADAPTER_MULTICAST_ADDRESS { union { ULONGLONG Alignment; + struct { ULONG Length; DWORD Flags; } s; } u; struct _IP_ADAPTER_MULTICAST_ADDRESS *Next; - SOCKET_ADDRESS Address; + SOCKET_ADDRESS Address; } IP_ADAPTER_MULTICAST_ADDRESS, *PIP_ADAPTER_MULTICAST_ADDRESS; typedef struct _IP_ADAPTER_DNS_SERVER_ADDRESS { union { ULONGLONG Alignment; + struct { ULONG Length; DWORD Reserved; } s; } u; struct _IP_ADAPTER_DNS_SERVER_ADDRESS *Next; - SOCKET_ADDRESS Address; + SOCKET_ADDRESS Address; } IP_ADAPTER_DNS_SERVER_ADDRESS, *PIP_ADAPTER_DNS_SERVER_ADDRESS; typedef struct _IP_ADAPTER_PREFIX { union { ULONGLONG Alignment; + struct { ULONG Length; DWORD Flags; } s; } u; struct _IP_ADAPTER_PREFIX *Next; - SOCKET_ADDRESS Address; - ULONG PrefixLength; + SOCKET_ADDRESS Address; + ULONG PrefixLength; } IP_ADAPTER_PREFIX, *PIP_ADAPTER_PREFIX; typedef struct _IP_ADAPTER_ADDRESSES { union { ULONGLONG Alignment; + struct { ULONG Length; DWORD IfIndex; } s; } u; - struct _IP_ADAPTER_ADDRESSES *Next; - PCHAR AdapterName; - PIP_ADAPTER_UNICAST_ADDRESS FirstUnicastAddress; - PIP_ADAPTER_ANYCAST_ADDRESS FirstAnycastAddress; - PIP_ADAPTER_MULTICAST_ADDRESS FirstMulticastAddress; + struct _IP_ADAPTER_ADDRESSES *Next; + PCHAR AdapterName; + PIP_ADAPTER_UNICAST_ADDRESS FirstUnicastAddress; + PIP_ADAPTER_ANYCAST_ADDRESS FirstAnycastAddress; + PIP_ADAPTER_MULTICAST_ADDRESS FirstMulticastAddress; PIP_ADAPTER_DNS_SERVER_ADDRESS FirstDnsServerAddress; - PWCHAR DnsSuffix; - PWCHAR Description; - PWCHAR FriendlyName; - BYTE PhysicalAddress[MAX_ADAPTER_ADDRESS_LENGTH]; - DWORD PhysicalAddressLength; - DWORD Flags; - DWORD Mtu; - DWORD IfType; - IF_OPER_STATUS OperStatus; - DWORD Ipv6IfIndex; - DWORD ZoneIndices[16]; - PIP_ADAPTER_PREFIX FirstPrefix; + PWCHAR DnsSuffix; + PWCHAR Description; + PWCHAR FriendlyName; + BYTE PhysicalAddress[MAX_ADAPTER_ADDRESS_LENGTH]; + DWORD PhysicalAddressLength; + DWORD Flags; + DWORD Mtu; + DWORD IfType; + IF_OPER_STATUS OperStatus; + DWORD Ipv6IfIndex; + DWORD ZoneIndices[16]; + PIP_ADAPTER_PREFIX FirstPrefix; } IP_ADAPTER_ADDRESSES, *PIP_ADAPTER_ADDRESSES; /* -------------------------------- */ -#endif /* ! IP_ADAPTER_DDNS_ENABLED */ +# endif /* ! IP_ADAPTER_DDNS_ENABLED */ /* -------------------------------- */ #endif /* USE_WINSOCK */ diff --git a/deps/cares/src/lib/ares_ipv6.h b/deps/cares/src/lib/ares_ipv6.h index edb305324bcac4..be8cbe989396c2 100644 --- a/deps/cares/src/lib/ares_ipv6.h +++ b/deps/cares/src/lib/ares_ipv6.h @@ -28,12 +28,11 @@ #define ARES_IPV6_H #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 +41,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 +61,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/deps/cares/src/lib/ares_library_init.c b/deps/cares/src/lib/ares_library_init.c index 1cf30f0b0fe55c..5cd39dc244ba4b 100644 --- a/deps/cares/src/lib/ares_library_init.c +++ b/deps/cares/src/lib/ares_library_init.c @@ -33,7 +33,7 @@ /* 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 */ @@ -43,31 +43,67 @@ 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(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 */ @@ -77,28 +113,31 @@ int ares_library_init(int flags) return ARES_SUCCESS; } -int ares_library_init_mem(int flags, - void *(*amalloc)(size_t size), - void (*afree)(void *ptr), +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(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 */ @@ -107,17 +146,17 @@ void ares_library_cleanup(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; } - int ares_library_initialized(void) { #ifdef USE_WINSOCK - if (!ares_initialized) + if (!ares_initialized) { return ARES_ENOTINITIALIZED; + } #endif return ARES_SUCCESS; } diff --git a/deps/cares/src/lib/ares_math.c b/deps/cares/src/lib/ares_math.c new file mode 100644 index 00000000000000..977fb78e1ce3dc --- /dev/null +++ b/deps/cares/src/lib/ares_math.c @@ -0,0 +1,114 @@ +/* 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 */ + +size_t ares__round_up_pow2(size_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; + if (sizeof(size_t) > 4) { + n |= n >> 32; + } + n++; + return 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; +} diff --git a/deps/cares/src/lib/ares_nowarn.c b/deps/cares/src/lib/ares_nowarn.c deleted file mode 100644 index 65cabb37b29a52..00000000000000 --- a/deps/cares/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 -#endif - -#ifdef HAVE_LIMITS_H -#include -#endif - -#if defined(__INTEL_COMPILER) && defined(__unix__) - -#ifdef HAVE_NETINET_IN_H -# include -#endif -#ifdef HAVE_ARPA_INET_H -# include -#endif - -#endif /* __INTEL_COMPILER && __unix__ */ - -#define BUILDING_ARES_NOWARN_C 1 - -#include "ares_nowarn.h" - -#ifndef HAVE_LIMITS_H -/* systems without 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/deps/cares/src/lib/ares_nowarn.h b/deps/cares/src/lib/ares_nowarn.h deleted file mode 100644 index 3f5612dbb91ffa..00000000000000 --- a/deps/cares/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/deps/cares/src/lib/ares_options.c b/deps/cares/src/lib/ares_options.c index 78e16bb5d2f405..7fa64499a7e332 100644 --- a/deps/cares/src/lib/ares_options.c +++ b/deps/cares/src/lib/ares_options.c @@ -36,382 +36,370 @@ #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; + } - ares__destroy_servers_state(channel); + /* 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; + } - for (srvr = servers; srvr; srvr = srvr->next) - { - num_srvrs++; + 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; + } + + 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; + } + + 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; + } - return ARES_SUCCESS; -} + if (channel->optmask & ARES_OPT_LOOKUPS) { + options->lookups = ares_strdup(channel->lookups); + if (!options->lookups && channel->lookups) { + return ARES_ENOMEM; + } + } -int ares_set_servers_ports(ares_channel channel, - struct ares_addr_port_node *servers) -{ - struct ares_addr_port_node *srvr; - int num_srvrs = 0; - int i; + 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 (ares_library_initialized() != ARES_SUCCESS) - return ARES_ENOTINITIALIZED; /* LCOV_EXCL_LINE: n/a on non-WinSock */ + if (channel->optmask & ARES_OPT_RESOLVCONF) { + options->resolvconf_path = ares_strdup(channel->resolvconf_path); + if (!options->resolvconf_path) { + return ARES_ENOMEM; + } + } - if (!channel) - return ARES_ENODATA; + if (channel->optmask & ARES_OPT_HOSTS_FILE) { + options->hosts_path = ares_strdup(channel->hosts_path); + if (!options->hosts_path) { + return ARES_ENOMEM; + } + } - if (ares__llist_len(channel->all_queries) != 0) - return ARES_ENOTIMP; + if (channel->optmask & ARES_OPT_SOCK_SNDBUF && + channel->socket_send_buffer_size > 0) { + options->socket_send_buffer_size = channel->socket_send_buffer_size; + } - ares__destroy_servers_state(channel); + if (channel->optmask & ARES_OPT_SOCK_RCVBUF && + channel->socket_receive_buffer_size > 0) { + options->socket_receive_buffer_size = channel->socket_receive_buffer_size; + } - for (srvr = servers; srvr; srvr = srvr->next) - { - num_srvrs++; - } + if (channel->optmask & ARES_OPT_EDNSPSZ) { + options->ednspsz = (int)channel->ednspsz; + } - 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 (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; + } + + *optmask = (int)channel->optmask; return ARES_SUCCESS; } -/* 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) +static ares_status_t ares__init_options_servers(ares_channel_t *channel, + const struct in_addr *servers, + size_t nservers) +{ + 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; + } + + status = ares__servers_update(channel, slist, ARES_TRUE); + + 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; - 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) + + if (channel == NULL) { return ARES_ENODATA; + } - i = strlen(_csv); - if (i == 0) - return ARES_SUCCESS; /* blank all servers */ + if (options == NULL) { + if (optmask != 0) { + return ARES_ENODATA; + } + return ARES_SUCCESS; + } - csv = ares_malloc(i + 2); - if (!csv) - return ARES_ENOMEM; + /* Easy stuff. */ + if (optmask & ARES_OPT_FLAGS) { + channel->flags = (unsigned int)options->flags; + } - strcpy(csv, _csv); - if (csv[i-1] != ',') { /* make parsing easier by ensuring ending ',' */ - csv[i] = ','; - csv[i+1] = 0; + if (optmask & ARES_OPT_TIMEOUTMS) { + channel->timeout = (unsigned int)options->timeout; + } else if (optmask & ARES_OPT_TIMEOUT) { + /* Convert to milliseconds */ + optmask |= ARES_OPT_TIMEOUTMS; + optmask &= ~(ARES_OPT_TIMEOUT); + channel->timeout = (unsigned int)options->timeout * 1000; } - 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++; - } - else if (*ptr == '[') { - /* move start_host if an open square bracket is found wrapping an IPv6 - address */ - start_host = ptr + 1; + if (optmask & ARES_OPT_TRIES) { + channel->tries = (size_t)options->tries; + } + + if (optmask & ARES_OPT_NDOTS) { + channel->ndots = (size_t)options->ndots; + } + + if (optmask & ARES_OPT_MAXTIMEOUTMS) { + 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; + } + + 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; + } + + if (optmask & ARES_OPT_SOCK_SNDBUF && options->socket_send_buffer_size > 0) { + channel->socket_send_buffer_size = options->socket_send_buffer_size; + } + + if (optmask & ARES_OPT_SOCK_RCVBUF && + options->socket_receive_buffer_size > 0) { + channel->socket_receive_buffer_size = options->socket_receive_buffer_size; + } + + if (optmask & ARES_OPT_EDNSPSZ) { + channel->ednspsz = (size_t)options->ednspsz; + } + + /* 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 */ - } - } - /* 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)); - } - 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)); - } - 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; - } + 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; } + } + } - /* Set up for next one */ - start_host = ptr + 1; - cc = 0; + /* Set lookups, if given. */ + if (optmask & ARES_OPT_LOOKUPS) { + channel->lookups = ares_strdup(options->lookups); + if (!channel->lookups) { + return ARES_ENOMEM; } } - rv = ares_set_servers_ports(channel, servers); + /* 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]; + } + } - out: - if (csv) - ares_free(csv); - while (servers) { - struct ares_addr_port_node *s = servers; - servers = servers->next; - ares_free(s); + /* Set path for resolv.conf file, if given. */ + if (optmask & ARES_OPT_RESOLVCONF) { + channel->resolvconf_path = ares_strdup(options->resolvconf_path); + if (!channel->resolvconf_path && options->resolvconf_path) { + return ARES_ENOMEM; + } } - return rv; -} + /* Set path for hosts file, if given. */ + if (optmask & ARES_OPT_HOSTS_FILE) { + channel->hosts_path = ares_strdup(options->hosts_path); + if (!channel->hosts_path && options->hosts_path) { + return ARES_ENOMEM; + } + } -int ares_set_servers_csv(ares_channel channel, - const char* _csv) -{ - return set_servers_csv(channel, _csv, FALSE); -} + if (optmask & ARES_OPT_UDP_MAX_QUERIES) { + channel->udp_max_queries = (size_t)options->udp_max_queries; + } -int ares_set_servers_ports_csv(ares_channel channel, - const char* _csv) -{ - return set_servers_csv(channel, _csv, TRUE); -} + if (optmask & ARES_OPT_QUERY_CACHE) { + channel->qcache_max_ttl = options->qcache_max_ttl; + } + + /* Initialize the ipv4 servers if provided */ + if (optmask & ARES_OPT_SERVERS && options->nservers > 0) { + ares_status_t status; + status = ares__init_options_servers(channel, options->servers, + (size_t)options->nservers); + if (status != ARES_SUCCESS) { + return status; + } + } + + channel->optmask = (unsigned int)optmask; + return ARES_SUCCESS; +} diff --git a/deps/cares/src/lib/ares_parse_a_reply.c b/deps/cares/src/lib/ares_parse_a_reply.c index b50dea3884cfbb..f576575fe4b2fd 100644 --- a/deps/cares/src/lib/ares_parse_a_reply.c +++ b/deps/cares/src/lib/ares_parse_a_reply.c @@ -56,38 +56,39 @@ 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; + + 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__parse_into_addrinfo(abuf, (size_t)alen, 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: @@ -96,5 +97,5 @@ int ares_parse_a_reply(const unsigned char *abuf, int alen, ares_free(ai.name); ares_free(question_hostname); - return status; + return (int)status; } diff --git a/deps/cares/src/lib/ares_parse_aaaa_reply.c b/deps/cares/src/lib/ares_parse_aaaa_reply.c index 7a839829eb57c5..cef4ad7f80948f 100644 --- a/deps/cares/src/lib/ares_parse_aaaa_reply.c +++ b/deps/cares/src/lib/ares_parse_aaaa_reply.c @@ -58,38 +58,39 @@ 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; + char *question_hostname = NULL; + ares_status_t status; + size_t req_naddrttls = 0; - if (naddrttls) - { - req_naddrttls = *naddrttls; - *naddrttls = 0; - } + 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__parse_into_addrinfo(abuf, (size_t)alen, 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 (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); @@ -97,6 +98,5 @@ int ares_parse_aaaa_reply(const unsigned char *abuf, int alen, ares_free(question_hostname); ares_free(ai.name); - return status; + return (int)status; } - diff --git a/deps/cares/src/lib/ares_parse_caa_reply.c b/deps/cares/src/lib/ares_parse_caa_reply.c index f4581c124a2049..6c30305ee18935 100644 --- a/deps/cares/src/lib/ares_parse_caa_reply.c +++ b/deps/cares/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 - * - * 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 -#endif -#ifdef HAVE_NETDB_H -# include -#endif -#ifdef HAVE_ARPA_INET_H -# include -#endif - -#include "ares_nameser.h" - -#ifdef HAVE_STRINGS_H -# include -#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/deps/cares/src/lib/ares_parse_mx_reply.c b/deps/cares/src/lib/ares_parse_mx_reply.c index 36dfe3d933b4ac..db7155d2e8fe4b 100644 --- a/deps/cares/src/lib/ares_parse_mx_reply.c +++ b/deps/cares/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 -#endif -#ifdef HAVE_NETDB_H -# include -#endif -#ifdef HAVE_ARPA_INET_H -# include -#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/deps/cares/src/lib/ares_parse_naptr_reply.c b/deps/cares/src/lib/ares_parse_naptr_reply.c index 81dfb02a2af9eb..1a304ccdd3a12d 100644 --- a/deps/cares/src/lib/ares_parse_naptr_reply.c +++ b/deps/cares/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 -#endif -#ifdef HAVE_NETDB_H -# include -#endif -#ifdef HAVE_ARPA_INET_H -# include -#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/deps/cares/src/lib/ares_parse_ns_reply.c b/deps/cares/src/lib/ares_parse_ns_reply.c index 28083d44c11202..18fda82f412174 100644 --- a/deps/cares/src/lib/ares_parse_ns_reply.c +++ b/deps/cares/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 - * on behalf of AVIRA Gmbh - http://www.avira.com - */ - #include "ares_setup.h" #ifdef HAVE_NETINET_IN_H @@ -42,148 +36,122 @@ # include #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/deps/cares/src/lib/ares_parse_ptr_reply.c b/deps/cares/src/lib/ares_parse_ptr_reply.c index 0606d35f1e8254..f03f601d4c376b 100644 --- a/deps/cares/src/lib/ares_parse_ptr_reply.c +++ b/deps/cares/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,166 @@ # include #endif -#include "ares_nameser.h" - -#ifdef HAVE_STRINGS_H -# include -#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) +int ares_parse_ptr_reply(const unsigned char *abuf, int alen_int, + 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 alen; + size_t ptrcount = 0; + struct hostent *hostent = NULL; + const char *hostname = NULL; + const char *ptrname = 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, &ptrname, &len, 0); - if (status != ARES_SUCCESS) - return status; - if (aptr + len + QFIXEDSZ > abuf + alen) - { - ares_free(ptrname); - return ARES_EBADRESP; - } - 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; - } - 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 */ - } + status = ares_dns_parse(abuf, alen, 0, &dnsrec); + if (status != ARES_SUCCESS) { + goto done; + } + + /* 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; + } - if (status == ARES_SUCCESS && !hostname) + ancount = ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER); + if (ancount == 0) { status = ARES_ENODATA; - if (status == ARES_SUCCESS) - { - /* If we don't reach the end, we must have failed due to out of memory */ + 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 = family; + hostent->h_length = 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 char *rname = NULL; + 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; + } - /* We got our answer. Allocate memory to build the host entry. */ - hostent = ares_malloc(sizeof(*hostent)); - if (!hostent) - goto fail; + if (ares_dns_rr_get_class(rr) != ARES_CLASS_IN) { + continue; + } - /* If we don't memset here, cleanups may fail */ - memset(hostent, 0, sizeof(*hostent)); + /* 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; + } + } - hostent->h_addr_list = ares_malloc(2 * sizeof(char *)); - if (!hostent->h_addr_list) - goto fail; + /* Handling for PTR records below this, otherwise skip */ + if (ares_dns_rr_get_type(rr) != ARES_REC_TYPE_PTR) { + continue; + } + /* Old code compared the name in the rr to the ptrname, so we'll do that + * check here, but I'm not sure its necessary */ + rname = ares_dns_rr_get_name(rr); + if (rname == NULL) { + /* Shouldn't be possible */ + status = ARES_EBADRESP; + goto done; + } + if (strcasecmp(ptrname, rname) != 0) { + continue; + } - 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; - } + /* 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; + } - 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 ; ih_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; + /* Append as an alias */ + hostent->h_aliases[ptrcount] = ares_strdup(hostname); + if (hostent->h_aliases[ptrcount] == NULL) { + status = ARES_ENOMEM; + goto done; } + ptrcount++; + } -fail: - ares_free_hostent(hostent); - - for (i=0 ; ih_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; + } + ares_dns_record_destroy(dnsrec); + return (int)status; } diff --git a/deps/cares/src/lib/ares_parse_soa_reply.c b/deps/cares/src/lib/ares_parse_soa_reply.c index f37ba191733d44..2777dbcb0bbe11 100644 --- a/deps/cares/src/lib/ares_parse_soa_reply.c +++ b/deps/cares/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 -#endif -#ifdef HAVE_NETDB_H -# include -#endif -#ifdef HAVE_ARPA_INET_H -# include -#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/deps/cares/src/lib/ares_parse_srv_reply.c b/deps/cares/src/lib/ares_parse_srv_reply.c index 0125092c02d10c..f27bcce7330eb0 100644 --- a/deps/cares/src/lib/ares_parse_srv_reply.c +++ b/deps/cares/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 -#endif -#ifdef HAVE_NETDB_H -# include -#endif -#ifdef HAVE_ARPA_INET_H -# include -#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/deps/cares/src/lib/ares_parse_txt_reply.c b/deps/cares/src/lib/ares_parse_txt_reply.c index 083cbf4dff7b3b..85c3644b8cbf34 100644 --- a/deps/cares/src/lib/ares_parse_txt_reply.c +++ b/deps/cares/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 -#endif -#ifdef HAVE_NETDB_H -# include -#endif -#ifdef HAVE_ARPA_INET_H -# include -#endif - -#include "ares_nameser.h" - -#ifdef HAVE_STRINGS_H -# include -#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/deps/cares/src/lib/ares_parse_uri_reply.c b/deps/cares/src/lib/ares_parse_uri_reply.c index d5bb7ee45d7660..bff7023f78a29a 100644 --- a/deps/cares/src/lib/ares_parse_uri_reply.c +++ b/deps/cares/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 -#endif -#ifdef HAVE_NETDB_H -# include -#endif -#ifdef HAVE_ARPA_INET_H -# include -#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/deps/cares/src/lib/ares_platform.c b/deps/cares/src/lib/ares_platform.c index 6fcbd49bb8f664..0727ae001c8432 100644 --- a/deps/cares/src/lib/ares_platform.c +++ b/deps/cares/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/deps/cares/src/lib/ares_private.h b/deps/cares/src/lib/ares_private.h index 8bd12fc1182d79..c4d705b4108083 100644 --- a/deps/cares/src/lib/ares_private.h +++ b/deps/cares/src/lib/ares_private.h @@ -32,79 +32,82 @@ */ #if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) -#define WIN32 +# define WIN32 #endif #ifdef HAVE_NETINET_IN_H -#include +# include #endif #ifdef WATT32 -#include -#include +# include +# include #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 +# define INADDR_NONE 0xffffffff #endif #ifdef CARES_EXPOSE_STATICS /* Make some internal functions visible for testing */ -#define STATIC_TESTABLE +# define STATIC_TESTABLE #else -#define STATIC_TESTABLE static +# define STATIC_TESTABLE static #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 +118,39 @@ 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" #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 \ + 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 */ + /********* 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 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,8 +167,13 @@ struct server_connection { }; struct server_state { - size_t idx; /* index for server in ares_channel */ - struct ares_addr addr; + size_t idx; /* index for server in system configuration */ + size_t consec_failures; /* Consecutive query failure count + * can be hard errors or timeouts + */ + struct ares_addr addr; + unsigned short udp_port; /* host byte order */ + unsigned short tcp_port; /* host byte order */ ares__llist_t *connections; struct server_connection *tcp_conn; @@ -184,59 +185,42 @@ 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 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 */ -}; - -/* 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? */ + 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 */ }; /* An IP address pattern; matches an IP address X if X & mask == addr */ @@ -244,203 +228,372 @@ struct query_server_info { #define PATTERN_CIDR 0x2 struct apattern { - union - { + union { struct in_addr addr4; struct ares_in6_addr addr6; } addr; - union - { + + union { struct in_addr addr4; struct ares_in6_addr addr6; unsigned short bits; } mask; - int family; + + int family; unsigned short type; }; +struct ares__qcache; +typedef struct ares__qcache ares__qcache_t; + +struct ares_hosts_file; +typedef struct ares_hosts_file ares_hosts_file_t; + +struct ares__thread_mutex; +typedef struct ares__thread_mutex ares__thread_mutex_t; + struct ares_channeldata { /* Configuration data */ - int flags; - int timeout; /* in milliseconds */ - 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; + 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]; - - int optmask; /* the option bitfield passed in at init time */ - - /* Server addresses and communications state */ - struct server_state *servers; - int nservers; + char local_dev_name[32]; + unsigned int local_ip4; + unsigned char local_ip6[16]; - /* random state to use when generating new ids */ - ares_rand_state *rand_state; + /* Thread safety lock */ + ares__thread_mutex_t *lock; - /* Generation number to use for the next TCP socket open/close */ - int tcp_connection_generation; + /* Server addresses and communications state. Sorted by least consecutive + * failures, followed by the configuration order if failures are equal. */ + ares__slist_t *servers; - /* 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; }; /* 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); +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); +ares_status_t ares__send_query(struct query *query, struct timeval *now); +ares_status_t ares__requeue_query(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); +ares_status_t ares_query_qid(ares_channel_t *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); -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__free_query(struct query *query); +ares_status_t ares_send_ex(ares_channel_t *channel, const unsigned char *qbuf, + size_t qlen, ares_callback callback, void *arg, + unsigned short *qid); +void ares__close_connection(struct server_connection *conn); +void ares__close_sockets(struct server_state *server); +void ares__check_cleanup_conn(const ares_channel_t *channel, + struct server_connection *conn); +ares_status_t ares__read_line(FILE *fp, char **buf, size_t *bufsize); +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); +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_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); +ares_status_t ares__single_domain(const ares_channel_t *channel, + const char *name, char **s); +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); - -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); +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 unsigned char *abuf, size_t alen, + ares_bool_t cname_only_is_enodata, + unsigned short port, + struct ares_addrinfo *ai); + +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); +ares_bool_t ares__is_hostnamech(int ch); +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); +ares_status_t ares__sconfig_append_fromstr(ares__llist_t **sconfig, + const char *str); +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); +ares_bool_t ares__isprint(int ch); + + +/*! 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); -#if 0 /* Not used */ -long ares__tvdiff(struct timeval t1, struct timeval t2); +/*! 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); + +#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->ndots > 0 && \ + x->timeout > 0 && x->tries > 0) + +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); +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 unsigned char *qbuf, size_t qlen, + unsigned char **abuf, size_t *alen); + +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); + +#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 - #endif /* __ARES_PRIVATE_H */ diff --git a/deps/cares/src/lib/ares_process.c b/deps/cares/src/lib/ares_process.c index 06e712160192c3..ca6d9db1509978 100644 --- a/deps/cares/src/lib/ares_process.c +++ b/deps/cares/src/lib/ares_process.c @@ -27,23 +27,6 @@ #include "ares_setup.h" -#ifdef HAVE_SYS_UIO_H -# include -#endif -#ifdef HAVE_NETINET_IN_H -# include -#endif -#ifdef HAVE_NETINET_TCP_H -# include -#endif -#ifdef HAVE_NETDB_H -# include -#endif -#ifdef HAVE_ARPA_INET_H -# include -#endif - -#include "ares_nameser.h" #ifdef HAVE_STRINGS_H # include @@ -54,64 +37,97 @@ #ifdef NETWARE # include #endif +#ifdef HAVE_STDINT_H +# include +#endif #include #include #include #include "ares.h" -#include "ares_dns.h" -#include "ares_nowarn.h" #include "ares_private.h" +#include "ares_nameser.h" +#include "ares_dns.h" +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(const ares_channel_t *channel, struct query *query, + ares_status_t status, const unsigned char *abuf, + size_t alen); + +static void server_increment_failures(struct server_state *server) +{ + ares__slist_node_t *node; + const ares_channel_t *channel = server->channel; -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); +} + +static void server_set_good(struct server_state *server) +{ + ares__slist_node_t *node; + const ares_channel_t *channel = server->channel; + + if (!server->consec_failures) { + return; + } + + node = ares__slist_node_find(channel->servers, server); + if (node == NULL) { + return; + } + + server->consec_failures = 0; + ares__slist_node_reinsert(node); +} /* 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 +136,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 +168,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 +183,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 +253,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 +268,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 +316,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 +337,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 +356,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 +369,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 (i=0; inservers; i++) { - ares__llist_node_t *node; - for (node = ares__llist_node_first(channel->servers[i].connections); - node != 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 (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 +410,23 @@ static ares_socket_t *channel_socket_list(ares_channel channel, size_t *num) } /* 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 +440,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 +450,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 +465,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 +484,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 +507,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; iconnnode_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 +542,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 +561,102 @@ 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; + 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; + } + + /* 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. */ -static void process_answer(ares_channel channel, const unsigned char *abuf, - int alen, struct server_connection *conn, int tcp, - struct timeval *now) +/* 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; + + /* 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, 0); + 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 +666,243 @@ 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, 0); + 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; } + } + + /* If cache insertion was successful, it took ownership. We ignore + * other cache insertion failures. */ + if (ares_qcache_insert(channel, now, query, rdnsrec) == ARES_SUCCESS) { + rdnsrec = NULL; + } + server_set_good(server); end_query(channel, query, ARES_SUCCESS, abuf, alen); - ares__check_cleanup_conn(channel, fd); -} + status = ARES_SUCCESS; +cleanup: + ares_dns_record_destroy(rdnsrec); + ares_dns_record_destroy(qdnsrec); + return status; +} -static void handle_error(struct server_connection *conn, - struct timeval *now) +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; + + /* 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); + if (critical_failure) { + server_increment_failures(server); + } +} + +ares_status_t ares__requeue_query(struct query *query, struct timeval *now) +{ + const ares_channel_t *channel = query->channel; + size_t max_tries = ares__slist_len(channel->servers) * channel->tries; + + query->try_count++; - 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 (query->try_count < max_tries && !query->no_retries) { + return ares__send_query(query, now); } - ares__llist_destroy(list_copy); -} + /* If we are here, all attempts to perform query failed. */ + if (query->error_status == ARES_SUCCESS) { + query->error_status = ARES_ETIMEOUT; + } + end_query(channel, query, query->error_status, NULL, 0); + return ARES_ETIMEOUT; +} -static void skip_server(ares_channel channel, struct query *query, - struct server_state *server) +/* 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) { - /* 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). - */ - if (channel->nservers > 1) - { - query->server_info[server->idx].skip_server = 1; + 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; + + 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; } -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) { + server = ares__random_server(channel); + } else { + /* Pull first */ + server = ares__slist_first_val(channel->servers); + } + + if (server == NULL) { + end_query(channel, query, ARES_ESERVFAIL /* ? */, NULL, 0); + return ARES_ECONNREFUSED; + } - 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 +911,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, 0); + return status; } } @@ -807,18 +926,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; + + /* 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 +953,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 +970,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, 0); + return status; } node = ares__llist_node_first(server->connections); } @@ -860,45 +985,36 @@ 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); - } - } + server_increment_failures(server); + status = ares__requeue_query(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; + /* 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; } } + 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); + /* 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; } @@ -907,497 +1023,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; - } - } - 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; + if (query->node_queries_to_conn == NULL) { + end_query(channel, query, ARES_ENOMEM, NULL, 0); + /* 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); } - 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; + size_t i; + ares_bool_t rv = ARES_FALSE; - 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 */ + if (ares_dns_record_query_cnt(qrec) != ares_dns_record_query_cnt(arec)) { + goto done; } - /* 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; - } - -#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; - } - } - } -#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; + 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; } - } - - /* 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 (ares_dns_record_query_get(arec, i, &aname, &atype, &aclass) != + ARES_SUCCESS || + aname == NULL) { + 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; + if (strcasecmp(qname, aname) != 0 || qtype != atype || qclass != aclass) { + goto done; } } - 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; - } + rv = ARES_TRUE; - /* 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; - } - 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; + break; + default: + break; /* LCOV_EXCL_LINE */ } - - /* 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); @@ -1406,19 +1121,17 @@ 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(const ares_channel_t *channel, struct query *query, + ares_status_t status, const unsigned char *abuf, + size_t alen) { (void)channel; - ares_detach_query(query); - /* Invoke the callback. */ - query->callback(query->arg, status, query->timeouts, + query->callback(query->arg, (int)status, (int)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); + (unsigned char *)((void *)((size_t)abuf)), (int)alen); ares__free_query(query); } @@ -1427,66 +1140,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_free(query->qbuf); -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); -} - -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/deps/cares/src/lib/ares_qcache.c b/deps/cares/src/lib/ares_qcache.c new file mode 100644 index 00000000000000..ce5a19f8841385 --- /dev/null +++ b/deps/cares/src/lib/ares_qcache.c @@ -0,0 +1,455 @@ +/* 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; + 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; + } + + status = ares__buf_append_str(buf, name); + 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 + 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; +} + +static ares_status_t ares__qcache_fetch(ares__qcache_t *qcache, + const ares_dns_record_t *dnsrec, + const struct timeval *now, + unsigned char **buf, size_t *buf_len) +{ + char *key = NULL; + ares__qcache_entry_t *entry; + ares_status_t status; + + if (qcache == NULL || dnsrec == NULL) { + return ARES_EFORMERR; + } + + ares__qcache_expire(qcache, now); + + key = ares__qcache_calc_key(dnsrec); + if (key == NULL) { + status = ARES_ENOMEM; + goto done; + } + + entry = ares__htable_strvp_get_direct(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)); + + status = ares_dns_write(entry->dnsrec, buf, buf_len); + +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); +} + +ares_status_t ares_qcache_fetch(ares_channel_t *channel, + const struct timeval *now, + const unsigned char *qbuf, size_t qlen, + unsigned char **abuf, size_t *alen) +{ + ares_status_t status; + ares_dns_record_t *dnsrec = NULL; + + if (channel->qcache == NULL) { + return ARES_ENOTFOUND; + } + + status = ares_dns_parse(qbuf, qlen, 0, &dnsrec); + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares__qcache_fetch(channel->qcache, dnsrec, now, abuf, alen); + +done: + ares_dns_record_destroy(dnsrec); + return status; +} diff --git a/deps/cares/src/lib/ares_query.c b/deps/cares/src/lib/ares_query.c index 04521d1c850f0c..098e6789471809 100644 --- a/deps/cares/src/lib/ares_query.c +++ b/deps/cares/src/lib/ares_query.c @@ -39,113 +39,101 @@ struct qquery { ares_callback callback; - void *arg; + void *arg; }; -static void qcallback(void *arg, int status, int timeouts, unsigned char *abuf, int alen); +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) -{ - 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; -} - -int ares_query_qid(ares_channel channel, const char *name, - int dnsclass, int type, ares_callback callback, - void *arg, unsigned short *qid) +ares_status_t ares_query_qid(ares_channel_t *channel, const char *name, + int dnsclass, int type, ares_callback callback, + void *arg, unsigned short *qid) { struct qquery *qquery; unsigned char *qbuf; - int qlen, rd, status; - unsigned short id = generate_unique_id(channel); + int qlen; + int rd; + ares_status_t status; /* 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; + rd = !(channel->flags & ARES_FLAG_NORECURSE); + status = (ares_status_t)ares_create_query( + name, dnsclass, type, 0, rd, &qbuf, &qlen, + (channel->flags & ARES_FLAG_EDNS) ? (int)channel->ednspsz : 0); + if (status != ARES_SUCCESS) { + if (qbuf != NULL) { + ares_free(qbuf); } + callback(arg, (int)status, 0, NULL, 0); + 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; - } + 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); + status = ares_send_ex(channel, qbuf, (size_t)qlen, qcallback, qquery, qid); ares_free_string(qbuf); - if (status == ARES_SUCCESS && qid) - *qid = id; - 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) { + if (channel == NULL) { + return; + } + ares__channel_lock(channel); ares_query_qid(channel, name, dnsclass, type, callback, arg, NULL); + ares__channel_unlock(channel); } - -static void qcallback(void *arg, int status, int timeouts, unsigned char *abuf, int alen) +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; + struct qquery *qquery = (struct qquery *)arg; + size_t ancount; + int rcode; - if (status != ARES_SUCCESS) + 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); + } 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; + default: + break; } + qquery->callback(qquery->arg, status, timeouts, abuf, alen); + } ares_free(qquery); } diff --git a/deps/cares/src/lib/ares_rand.c b/deps/cares/src/lib/ares_rand.c index 99a5a04cff4ba2..86313b2de95e01 100644 --- a/deps/cares/src/lib/ares_rand.c +++ b/deps/cares/src/lib/ares_rand.c @@ -27,65 +27,57 @@ #include "ares_setup.h" #include "ares.h" #include "ares_private.h" -#include "ares_nowarn.h" #include -#if !defined(HAVE_ARC4RANDOM_BUF) && !defined(HAVE_GETRANDOM) && !defined(_WIN32) +#if !defined(HAVE_ARC4RANDOM_BUF) && !defined(HAVE_GETRANDOM) && \ + !defined(_WIN32) # define ARES_NEEDS_RC4 1 #endif -typedef enum { - ARES_RAND_OS = 1, /* OS-provided such as RtlGenRandom or arc4random */ - ARES_RAND_FILE = 2, /* OS file-backed random number generator */ +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 */ + ARES_RAND_RC4 = 3 /* Internal RC4 based PRNG */ #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 struct ares_rand_rc4 -{ +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 +87,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; iS[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 +121,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; cnttype = ARES_RAND_OS; - return 1; + return ARES_TRUE; #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; + return ARES_TRUE; } /* Fall-Thru on failure to RC4 */ #endif @@ -208,18 +200,18 @@ static int ares__init_rand_engine(ares_rand_state *state) ares_rc4_init(&state->state.rc4); /* Currently cannot fail */ - return 1; + return ARES_TRUE; #endif } - ares_rand_state *ares__init_rand_state(void) { ares_rand_state *state = NULL; state = ares_malloc(sizeof(*state)); - if (!state) + if (!state) { return NULL; + } if (!ares__init_rand_engine(state)) { ares_free(state); @@ -229,11 +221,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: @@ -248,52 +240,51 @@ static void ares__clear_rand_state(ares_rand_state *state) } } - 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) { continue; /* Just retry. */ + } - bytes_read += rv; - if (bytes_read == len) + bytes_read += (size_t)rv; + if (bytes_read == len) { return; + } } break; #else @@ -303,13 +294,16 @@ 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; @@ -326,7 +320,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 +342,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/deps/cares/src/lib/ares_search.c b/deps/cares/src/lib/ares_search.c index d72b4c444e3a2b..429c7e1db0de26 100644 --- a/deps/cares/src/lib/ares_search.c +++ b/deps/cares/src/lib/ares_search.c @@ -36,205 +36,223 @@ 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; + ares_channel_t *channel; + char *name; /* copied into an allocated buffer */ + int dnsclass; + int type; + ares_callback callback; + void *arg; + char **domains; /* duplicate for ares_reinit() safety */ + size_t ndomains; - 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? */ + int status_as_is; /* error status from trying as-is */ + size_t next_domain; /* next search domain to try */ + ares_bool_t trying_as_is; /* current query is for name as-is */ + 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 end_squery(struct search_query *squery, ares_status_t status, + unsigned char *abuf, size_t alen); -void ares_search(ares_channel channel, const char *name, int dnsclass, - int type, ares_callback callback, void *arg) +static void ares_search_int(ares_channel_t *channel, const char *name, + int dnsclass, int type, ares_callback callback, + void *arg) { struct search_query *squery; - char *s; - const char *p; - int status, ndots; + char *s; + const char *p; + ares_status_t status; + size_t ndots; /* 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; - } + if (ares__is_onion_domain(name)) { + callback(arg, ARES_ENOTFOUND, 0, NULL, 0); + return; + } /* If name only yields one domain to search, then we don't have * to keep extra state, so just do an ares_query(). */ status = ares__single_domain(channel, name, &s); - if (status != ARES_SUCCESS) - { - callback(arg, status, 0, NULL, 0); - return; - } - if (s) - { - ares_query(channel, s, dnsclass, type, callback, arg); - ares_free(s); - return; - } + if (status != ARES_SUCCESS) { + callback(arg, (int)status, 0, NULL, 0); + return; + } + if (s) { + ares_query(channel, s, dnsclass, type, callback, arg); + ares_free(s); + return; + } /* 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; - } + squery = ares_malloc_zero(sizeof(*squery)); + if (!squery) { + callback(arg, ARES_ENOMEM, 0, NULL, 0); + return; + } squery->channel = channel; - squery->name = ares_strdup(name); - if (!squery->name) - { + squery->name = ares_strdup(name); + if (!squery->name) { + ares_free(squery); + callback(arg, ARES_ENOMEM, 0, NULL, 0); + return; + } + + /* Duplicate domains for safety during ares_reinit() */ + if (channel->ndomains) { + squery->domains = + ares__strsplit_duplicate(channel->domains, channel->ndomains); + if (squery->domains == NULL) { + ares_free(squery->name); ares_free(squery); callback(arg, ARES_ENOMEM, 0, NULL, 0); return; } - 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; + squery->ndomains = channel->ndomains; + } + + squery->dnsclass = dnsclass; + squery->type = type; + squery->status_as_is = -1; + squery->callback = callback; + squery->arg = arg; + squery->timeouts = 0; + squery->ever_got_nodata = ARES_FALSE; /* Count the number of dots in name. */ ndots = 0; - for (p = name; *p; p++) - { - if (*p == '.') - ndots++; + for (p = name; *p; p++) { + if (*p == '.') { + ndots++; } + } /* 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); - } - 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); - } + if (ndots >= channel->ndots || squery->ndomains == 0) { + /* Try the name as-is first. */ + squery->next_domain = 0; + squery->trying_as_is = ARES_TRUE; + ares_query(channel, name, dnsclass, type, search_callback, squery); + } else { + /* Try the name as-is last; start with the first search domain. */ + squery->next_domain = 1; + squery->trying_as_is = ARES_FALSE; + status = ares__cat_domain(name, squery->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, (int)status, 0, NULL, 0); } + } +} + +void ares_search(ares_channel_t *channel, const char *name, int dnsclass, + int type, ares_callback callback, void *arg) +{ + if (channel == NULL) { + return; + } + ares__channel_lock(channel); + ares_search_int(channel, name, dnsclass, type, callback, arg); + ares__channel_unlock(channel); } static void search_callback(void *arg, int status, int timeouts, unsigned char *abuf, int alen) { - struct search_query *squery = (struct search_query *) arg; - ares_channel channel = squery->channel; - char *s; + struct search_query *squery = (struct search_query *)arg; + ares_channel_t *channel = squery->channel; + char *s; - squery->timeouts += timeouts; + squery->timeouts += (size_t)timeouts; /* 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 (status != ARES_ENODATA && status != ARES_ESERVFAIL && + status != ARES_ENOTFOUND) { + end_squery(squery, (ares_status_t)status, abuf, (size_t)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 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 = ARES_TRUE; + } - 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); + if (squery->next_domain < squery->ndomains) { + ares_status_t mystatus; + /* Try the next domain. */ + mystatus = ares__cat_domain(squery->name, + squery->domains[squery->next_domain], &s); + if (mystatus != ARES_SUCCESS) { + end_squery(squery, mystatus, NULL, 0); + } else { + squery->trying_as_is = ARES_FALSE; + 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 = ARES_TRUE; + 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, (ares_status_t)squery->status_as_is, NULL, 0); } } + } } -static void end_squery(struct search_query *squery, int status, - unsigned char *abuf, int alen) +static void end_squery(struct search_query *squery, ares_status_t status, + unsigned char *abuf, size_t alen) { - squery->callback(squery->arg, status, squery->timeouts, abuf, alen); + squery->callback(squery->arg, (int)status, (int)squery->timeouts, abuf, + (int)alen); + ares__strsplit_free(squery->domains, squery->ndomains); ares_free(squery->name); ares_free(squery); } /* 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); @@ -246,91 +264,84 @@ int ares__cat_domain(const char *name, const char *domain, char **s) * 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__single_domain(const ares_channel_t *channel, + const char *name, char **s) { - size_t len = strlen(name); - const char *hostaliases; - FILE *fp; - char *line = NULL; - int status; - size_t linesize; - const char *p, *q; - int error; + size_t len = ares_strlen(name); + const char *hostaliases; + FILE *fp; + char *line = NULL; + ares_status_t status; + size_t linesize; + const char *p; + const char *q; + int error; /* If the name contains a trailing dot, then the single query is the name * sans the trailing dot. */ - if ((len > 0) && (name[len - 1] == '.')) - { - *s = ares_strdup(name); - return (*s) ? ARES_SUCCESS : ARES_ENOMEM; - } + if ((len > 0) && (name[len - 1] == '.')) { + *s = ares_strdup(name); + return (*s) ? ARES_SUCCESS : ARES_ENOMEM; + } - 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; + 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++; } - 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; - } + *s = ares_malloc((size_t)(q - p + 1)); + if (*s) { + memcpy(*s, p, (size_t)(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; + } + } } + } - 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; - } + 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; + } *s = NULL; return ARES_SUCCESS; diff --git a/deps/cares/src/lib/ares_send.c b/deps/cares/src/lib/ares_send.c index 95077967205fbd..2510b1edd36dbe 100644 --- a/deps/cares/src/lib/ares_send.c +++ b/deps/cares/src/lib/ares_send.c @@ -37,96 +37,95 @@ #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; +} + +ares_status_t ares_send_ex(ares_channel_t *channel, const unsigned char *qbuf, + size_t qlen, ares_callback 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); + unsigned char *abuf = NULL; + size_t alen = 0; /* 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; - } + if (qlen < HFIXEDSZ || qlen >= (1 << 16)) { + callback(arg, ARES_EBADQUERY, 0, NULL, 0); + return ARES_EBADQUERY; + } + if (ares__slist_len(channel->servers) == 0) { + callback(arg, ARES_ESERVFAIL, 0, NULL, 0); + return ARES_ESERVFAIL; + } + + /* Check query cache */ + status = ares_qcache_fetch(channel, &now, qbuf, qlen, &abuf, &alen); + if (status != ARES_ENOTFOUND) { + /* ARES_SUCCESS means we retrieved the cache, anything else is a critical + * failure, all result in termination */ + callback(arg, (int)status, 0, abuf, (int)alen); + ares_free(abuf); + return status; + } + /* 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, 0); + 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; + query->qbuf = ares_malloc(qlen); + if (!query->qbuf) { + ares_free(query); + callback(arg, ARES_ENOMEM, 0, NULL, 0); + return ARES_ENOMEM; + } + + 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); + memcpy(query->qbuf + 2, qbuf + 2, qlen - 2); + query->qlen = qlen; /* 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->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); ares__free_query(query); @@ -136,19 +135,31 @@ 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)) { + if (!ares__htable_szvp_insert(channel->queries_by_qid, query->qid, query)) { callback(arg, ARES_ENOMEM, 0, NULL, 0); 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, +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); + if (channel == NULL) { + return; + } + + ares__channel_lock(channel); + + ares_send_ex(channel, qbuf, (size_t)qlen, callback, arg, NULL); + + ares__channel_unlock(channel); } diff --git a/deps/cares/src/lib/ares_setup.h b/deps/cares/src/lib/ares_setup.h index b3cf80885078c0..0387f3e35f7577 100644 --- a/deps/cares/src/lib/ares_setup.h +++ b/deps/cares/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 @@ */ #ifdef HAVE_CONFIG_H -#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 # ifdef HAVE_WS2TCPIP_H -# include +# include # 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/deps/cares/src/lib/ares_strdup.c b/deps/cares/src/lib/ares_str.c similarity index 63% rename from deps/cares/src/lib/ares_strdup.c rename to deps/cares/src/lib/ares_str.c index db5dd1d84b7212..11794774e56c8d 100644 --- a/deps/cares/src/lib/ares_strdup.c +++ b/deps/cares/src/lib/ares_str.c @@ -26,27 +26,70 @@ */ #include "ares_setup.h" -#include "ares_strdup.h" +#include "ares_str.h" #include "ares.h" #include "ares_private.h" +#ifdef HAVE_STDINT_H +# include +#endif + +size_t ares_strlen(const char *str) +{ + if (str == NULL) { + return 0; + } + + return strlen(str); +} + 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; + 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; } diff --git a/deps/cares/src/lib/ares_strdup.h b/deps/cares/src/lib/ares_str.h similarity index 70% rename from deps/cares/src/lib/ares_strdup.h rename to deps/cares/src/lib/ares_str.h index 06e8cdccb5f5a4..fa5d5509bc0b15 100644 --- a/deps/cares/src/lib/ares_strdup.h +++ b/deps/cares/src/lib/ares_str.h @@ -29,6 +29,21 @@ #include "ares_setup.h" -extern char *ares_strdup(const char *s1); +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); + #endif /* HEADER_CARES_STRDUP_H */ diff --git a/deps/cares/src/lib/ares_strcasecmp.c b/deps/cares/src/lib/ares_strcasecmp.c index e7fd52740458ef..b91cbbe1544a84 100644 --- a/deps/cares/src/lib/ares_strcasecmp.c +++ b/deps/cares/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/deps/cares/src/lib/ares_strerror.c b/deps/cares/src/lib/ares_strerror.c index 7e301ff94f8620..fd583c5cfbb65d 100644 --- a/deps/cares/src/lib/ares_strerror.c +++ b/deps/cares/src/lib/ares_strerror.c @@ -31,37 +31,61 @@ 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"; + } - if(code >= 0 && code < (int)(sizeof(errtext) / sizeof(*errtext))) - return errtext[code]; - else - return "unknown"; + return "unknown"; } diff --git a/deps/cares/src/lib/ares_strsplit.c b/deps/cares/src/lib/ares_strsplit.c index 985a02dbbf9c7b..dbb79429d4c58f 100644 --- a/deps/cares/src/lib/ares_strsplit.c +++ b/deps/cares/src/lib/ares_strsplit.c @@ -25,7 +25,7 @@ */ #if defined(__MVS__) -#include +# include #endif #include "ares_setup.h" @@ -36,28 +36,60 @@ void ares__strsplit_free(char **elms, size_t num_elm) { size_t i; - if (elms == NULL) + if (elms == NULL) { return; + } - for (i=0; i +#endif + +#ifdef HAVE_NETINET_IN_H +# include +#endif + +#ifdef HAVE_NETDB_H +# include +#endif + +#ifdef HAVE_ARPA_INET_H +# include +#endif + +#include "ares_nameser.h" + +#if defined(ANDROID) || defined(__ANDROID__) +# include +# 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 +#endif + +#if defined(USE_WINSOCK) +# if defined(HAVE_IPHLPAPI_H) +# include +# endif +# if defined(HAVE_NETIOAPI_H) +# include +# 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]; /* [%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) +{ + /* 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; + 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 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 *)(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; + } + } + } + + /* 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_free(line); + if (status != ARES_SUCCESS) { + goto done; + } + } + + if (get_SuffixList_Windows(&line)) { + sysconfig->domains = ares__strsplit(line, ", ", &sysconfig->ndomains); + 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)); + + 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)); + + 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); + 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); + + 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]); + 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); + 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; + + 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 ipaddr_port[INET6_ADDRSTRLEN + 8]; /* [%s]:NNNNN */ + unsigned short port = 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); + } else { + continue; + } + + if (port) { + snprintf(ipaddr_port, sizeof(ipaddr_port), "[%s]:%u", ipaddr, port); + } else { + snprintf(ipaddr_port, sizeof(ipaddr_port), "%s", ipaddr); + } + + status = ares__sconfig_append_fromstr(&sysconfig->sconfig, ipaddr_port); + 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: + 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; + } + + 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/deps/cares/src/lib/ares_sysconfig_files.c b/deps/cares/src/lib/ares_sysconfig_files.c new file mode 100644 index 00000000000000..ee4f50a21ecef2 --- /dev/null +++ b/deps/cares/src/lib/ares_sysconfig_files.c @@ -0,0 +1,647 @@ +/* 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 +#endif + +#ifdef HAVE_NETINET_IN_H +# include +#endif + +#ifdef HAVE_NETDB_H +# include +#endif + +#ifdef HAVE_ARPA_INET_H +# include +#endif + +#include "ares_nameser.h" + +#if defined(ANDROID) || defined(__ANDROID__) +# include +# 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 +#endif + +#if defined(USE_WINSOCK) && defined(HAVE_IPHLPAPI_H) +# include +#endif + +#include "ares.h" +#include "ares_inet_net_pton.h" +#include "ares_platform.h" +#include "ares_private.h" + +static int ip_addr(const char *ipbuf, ares_ssize_t len, struct in_addr *addr) +{ + /* Four octets and three periods yields at most 15 characters. */ + if (len > 15) { + return -1; + } + + if (ares_inet_pton(AF_INET, ipbuf, addr) < 1) { + return -1; + } + + return 0; +} + +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. + */ + addr.s_addr = ntohl(pat->addr.addr4.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); + } +} + +static ares_bool_t sortlist_alloc(struct apattern **sortlist, size_t *nsort, + const struct apattern *pat) +{ + struct apattern *newsort; + newsort = ares_realloc(*sortlist, (*nsort + 1) * sizeof(struct apattern)); + if (!newsort) { + return ARES_FALSE; + } + newsort[*nsort] = *pat; + *sortlist = newsort; + (*nsort)++; + return ARES_TRUE; +} + +ares_status_t ares__parse_sortlist(struct apattern **sortlist, size_t *nsort, + const char *str) +{ + struct apattern pat; + const char *q; + + if (*sortlist != NULL) { + ares_free(*sortlist); + } + + *sortlist = NULL; + *nsort = 0; + + /* Add sortlist entries. */ + while (*str && *str != ';') { + int bits; + char ipbuf[17]; + char ipbufpfx[32]; + size_t len; + + /* Find just the IP */ + q = str; + while (*q && *q != '/' && *q != ';' && !ISSPACE(*q)) { + q++; + } + + len = (size_t)(q - str); + if (len >= sizeof(ipbuf) - 1) { + ares_free(*sortlist); + *sortlist = NULL; + return ARES_EBADSTR; + } + memcpy(ipbuf, str, len); + ipbuf[len] = '\0'; + + /* Find the prefix */ + if (*q == '/') { + const char *str2 = q + 1; + while (*q && *q != ';' && !ISSPACE(*q)) { + q++; + } + if (q - str >= 32) { + ares_free(*sortlist); + *sortlist = NULL; + return ARES_EBADSTR; + } + memcpy(ipbufpfx, str, (size_t)(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.addr.addr6, sizeof(pat.addr.addr6))) > + 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.addr.addr4, + sizeof(pat.addr.addr4))) > 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.addr.addr4) == 0) { + if (ipbufpfx[0]) { + len = (size_t)(q - str); + if (len >= sizeof(ipbuf) - 1) { + ares_free(*sortlist); + *sortlist = NULL; + return ARES_EBADSTR; + } + memcpy(ipbuf, str, len); + ipbuf[len] = '\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++; + } + } + + return ARES_SUCCESS; +} + +static ares_status_t config_search(ares_sysconfig_t *sysconfig, const char *str) +{ + 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; + } + + return ARES_SUCCESS; +} + +static ares_status_t config_domain(ares_sysconfig_t *sysconfig, char *str) +{ + char *q; + + /* Set a single search domain. */ + q = str; + while (*q && !ISSPACE(*q)) { + q++; + } + *q = '\0'; + + return config_search(sysconfig, str); +} + +static ares_status_t config_lookup(ares_sysconfig_t *sysconfig, const char *str, + const char *bindch, const char *altbindch, + const char *filech) +{ + char lookups[3]; + char *l; + const char *p; + ares_bool_t found; + + 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 = ARES_FALSE; + while (*p) { + if ((*p == *bindch || *p == *altbindch || *p == *filech) && + l < lookups + 2) { + if (*p == *bindch || *p == *altbindch) { + *l++ = 'b'; + } else { + *l++ = 'f'; + } + found = ARES_TRUE; + } + while (*p && !ISSPACE(*p) && (*p != ',')) { + p++; + } + while (*p && (ISSPACE(*p) || (*p == ','))) { + p++; + } + } + if (!found) { + return ARES_ENOTINITIALIZED; + } + *l = '\0'; + + ares_free(sysconfig->lookups); + sysconfig->lookups = ares_strdup(lookups); + if (sysconfig->lookups == NULL) { + return ARES_ENOMEM; + } + return ARES_SUCCESS; +} + +static const char *try_option(const char *p, const char *q, const char *opt) +{ + size_t len = ares_strlen(opt); + return ((size_t)(q - p) >= len && !strncmp(p, opt, len)) ? &p[len] : NULL; +} + +static ares_status_t set_options(ares_sysconfig_t *sysconfig, const char *str) +{ + const char *p; + const char *q; + const char *val; + + if (str == NULL) { + return ARES_SUCCESS; + } + + p = str; + while (*p) { + q = p; + while (*q && !ISSPACE(*q)) { + q++; + } + val = try_option(p, q, "ndots:"); + if (val) { + sysconfig->ndots = strtoul(val, NULL, 10); + } + + // Outdated option. + val = try_option(p, q, "retrans:"); + if (val) { + sysconfig->timeout_ms = strtoul(val, NULL, 10); + } + + val = try_option(p, q, "timeout:"); + if (val) { + sysconfig->timeout_ms = strtoul(val, NULL, 10) * 1000; + } + + // Outdated option. + val = try_option(p, q, "retry:"); + if (val) { + sysconfig->tries = strtoul(val, NULL, 10); + } + + val = try_option(p, q, "attempts:"); + if (val) { + sysconfig->tries = strtoul(val, NULL, 10); + } + + val = try_option(p, q, "rotate"); + if (val) { + sysconfig->rotate = ARES_TRUE; + } + + p = q; + while (ISSPACE(*p)) { + p++; + } + } + + return ARES_SUCCESS; +} + +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 = ares_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; +} + +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_domain(sysconfig, temp); + 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; +} + +ares_status_t ares__init_sysconfig_files(const ares_channel_t *channel, + ares_sysconfig_t *sysconfig) +{ + char *p; + FILE *fp = NULL; + char *line = NULL; + size_t linesize = 0; + int error; + const char *resolvconf_path; + ares_status_t status = ARES_SUCCESS; + + /* 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", ';'))) { + status = config_domain(sysconfig, p); + } else if ((p = try_config(line, "lookup", ';'))) { + status = config_lookup(sysconfig, p, "bind", NULL, "file"); + } else if ((p = try_config(line, "search", ';'))) { + status = config_search(sysconfig, p); + } else if ((p = try_config(line, "nameserver", ';'))) { + status = ares__sconfig_append_fromstr(&sysconfig->sconfig, p); + } else if ((p = try_config(line, "sortlist", ';'))) { + status = + ares__parse_sortlist(&sysconfig->sortlist, &sysconfig->nsortlist, p); + } else if ((p = try_config(line, "options", ';'))) { + status = set_options(sysconfig, p); + } else { + status = ARES_SUCCESS; + } + if (status != ARES_SUCCESS) { + fclose(fp); + goto done; + } + } + fclose(fp); + + if (status != ARES_EOF) { + goto done; + } + } 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", PATH_RESOLV_CONF)); + status = ARES_EFILE; + goto done; + } + } + + + /* 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'))) { + (void)config_lookup(sysconfig, p, "dns", "resolve", "files"); + } + } + fclose(fp); + if (status != ARES_EOF) { + goto done; + } + } 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")); + break; + } + /* ignore error, maybe we will get luck in next if clause */ + } + + + /* 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'))) { + /* ignore errors */ + (void)config_lookup(sysconfig, p, "bind", NULL, "hosts"); + } + } + fclose(fp); + if (status != ARES_EOF) { + goto done; + } + } 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")); + break; + } + + /* ignore error, maybe we will get luck in next if clause */ + } + + + /* 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'))) { + /* ignore errors */ + (void)config_lookup(sysconfig, p, "bind", NULL, "local"); + } + } + fclose(fp); + if (status != ARES_EOF) { + goto done; + } + } 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")); + break; + } + /* ignore error */ + } + + status = ARES_SUCCESS; + +done: + ares_free(line); + + return status; +} diff --git a/deps/cares/src/lib/ares_timeout.c b/deps/cares/src/lib/ares_timeout.c index 7390ef92635994..5250b4bb7feba4 100644 --- a/deps/cares/src/lib/ares_timeout.c +++ b/deps/cares/src/lib/ares_timeout.c @@ -28,26 +28,38 @@ #include "ares_setup.h" #ifdef HAVE_LIMITS_H -#include +# include #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) +static void remaining_time(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 +73,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; + remaining_time(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/deps/cares/src/lib/ares_update_servers.c b/deps/cares/src/lib/ares_update_servers.c new file mode 100644 index 00000000000000..93c063355b3063 --- /dev/null +++ b/deps/cares/src/lib/ares_update_servers.c @@ -0,0 +1,1059 @@ +/* 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 +#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; +} 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; +} + +/* 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 ares_bool_t ares_ipv6_subnet_matches(const unsigned char netbase[16], + unsigned char netmask, + const unsigned char *ipaddr) +{ + unsigned char mask[16] = { 0 }; + unsigned char i; + + /* Misuse */ + if (netmask > 128) { + return ARES_FALSE; + } + + /* Quickly set whole bytes */ + memset(mask, 0xFF, netmask / 8); + + /* Set remaining bits */ + if (netmask % 8 && netmask < 128 /* Silence coverity */) { + mask[netmask / 8] = (unsigned char)(0xff << (8 - (netmask % 8))); + } + + for (i = 0; i < 16; i++) { + if ((netbase[i] & mask[i]) != (ipaddr[i] & mask[i])) { + return ARES_FALSE; + } + } + + return ARES_TRUE; +} + +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++) { + if (ares_ipv6_subnet_matches(blacklist_v6[i].netbase, + blacklist_v6[i].netmask, + (const unsigned char *)&addr->addr.addr6)) { + return ARES_TRUE; + } + } + return ARES_FALSE; +} + +/* 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 ares_status_t 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; + } + + /* 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; + + /* Try to pull off port */ + if ((size_t)(ptr - str) < len) { + ptr++; + if (*ptr != ':') { + return ARES_EBADSTR; + } + + /* Missing port number */ + if ((size_t)(ptr - str) == len) { + return ARES_EBADSTR; + } + + port_start = ptr + 1; + port_end = str + (len - 1); + } + } else { + addr_start = str; + addr_end = str + (len - 1); + } + + mylen = (size_t)(addr_end - addr_start) + 1; + /* Larger than buffer with null term */ + if (mylen + 1 > sizeof(ipaddr)) { + return ARES_EBADSTR; + } + + memset(ipaddr, 0, sizeof(ipaddr)); + memcpy(ipaddr, addr_start, mylen); + + if (port_start) { + mylen = (size_t)(port_end - port_start) + 1; + /* Larger than buffer with null term */ + if (mylen + 1 > sizeof(ipport)) { + return ARES_EBADSTR; + } + 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->addr.addr4) == 1) { + host->family = AF_INET; + } else if (ares_inet_pton(AF_INET6, ipaddr, &host->addr.addr6) == 1) { + host->family = AF_INET6; + } else { + return ARES_EBADSTR; + } + + *port = (unsigned short)atoi(ipport); + 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) +{ + 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; + + 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) +{ + struct ares_addr host; + const char *p; + const char *txtaddr; + ares_status_t status; + + /* 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. + */ + for (p = str; p;) { + unsigned short port; + + /* Skip whitespace and commas. */ + while (*p && (ISSPACE(*p) || (*p == ','))) { + p++; + } + if (!*p) { + /* No more input, done. */ + break; + } + + /* Pointer to start of IPv4 or IPv6 address part. */ + txtaddr = p; + + /* Advance past this address. */ + while (*p && !ISSPACE(*p) && (*p != ',')) { + p++; + } + + if (parse_dnsaddrport(txtaddr, (size_t)(p - txtaddr), &host, &port) != + ARES_SUCCESS) { + continue; + } + + status = ares__sconfig_append(sconfig, &host, port, port); + if (status != ARES_SUCCESS) { + return status; + } + } + + return ARES_SUCCESS; +} + +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; + + 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)); + } + + 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); + + 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, + int use_port) +{ + size_t i; + char *csv = NULL; + char *ptr; + const char *start_host; + int cc = 0; + ares_status_t status = 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; + } + + /* NOTE: lock is in ares__servers_update() */ + + i = ares_strlen(_csv); + if (i == 0) { + /* blank all servers */ + return (ares_status_t)ares_set_servers_ports(channel, NULL); + } + + csv = ares_malloc(i + 2); + if (!csv) { + return ARES_ENOMEM; + } + + ares_strcpy(csv, _csv, i + 2); + if (csv[i - 1] != ',') { /* make parsing easier by ensuring ending ',' */ + csv[i] = ','; + csv[i + 1] = 0; + } + + 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++; + } else if (*ptr == '[') { + /* move start_host if an open square bracket is found wrapping an IPv6 + address */ + start_host = ptr + 1; + } 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 */ + } + } + /* resolve host, try ipv4 first, rslt is in network byte order */ + if (!ares_inet_pton(AF_INET, start_host, &in4)) { + /* Ok, try IPv6 then */ + if (!ares_inet_pton(AF_INET6, start_host, &in6)) { + status = ARES_EBADSTR; + goto out; + } + /* was ipv6, add new server */ + s = ares_malloc(sizeof(*s)); + if (!s) { + status = ARES_ENOMEM; + goto out; + } + s->family = AF_INET6; + memcpy(&s->addr, &in6, sizeof(struct ares_in6_addr)); + } else { + /* was ipv4, add new server */ + s = ares_malloc(sizeof(*s)); + if (!s) { + status = ARES_ENOMEM; + goto out; + } + s->family = AF_INET; + memcpy(&s->addr, &in4, sizeof(struct in_addr)); + } + 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 up for next one */ + start_host = ptr + 1; + cc = 0; + } + } + + status = (ares_status_t)ares_set_servers_ports(channel, servers); + +out: + if (csv) { + ares_free(csv); + } + while (servers) { + struct ares_addr_port_node *s = servers; + servers = servers->next; + ares_free(s); + } + + return status; +} + +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, ARES_FALSE); +} + +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, ARES_TRUE); +} diff --git a/deps/cares/src/lib/ares_version.c b/deps/cares/src/lib/ares_version.c index b6a62da86d575c..ca15fa77dcfbe6 100644 --- a/deps/cares/src/lib/ares_version.c +++ b/deps/cares/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/deps/cares/src/lib/bitncmp.c b/deps/cares/src/lib/bitncmp.c index 5a5a07f8ac020e..0296316d24424c 100644 --- a/deps/cares/src/lib/bitncmp.c +++ b/deps/cares/src/lib/bitncmp.c @@ -19,8 +19,8 @@ #ifndef HAVE_BITNCMP -#include "ares_setup.h" -#include "bitncmp.h" +# include "ares_setup.h" +# include "bitncmp.h" /* * int @@ -34,22 +34,26 @@ * author: * Paul Vixie (ISC), June 1996 */ -int ares__bitncmp(const void *l, const void *r, int n) +int ares__bitncmp(const void *l, const void *r, size_t n) { - unsigned int lb, rb; - int x, b; + size_t lb; + size_t rb; + ares_ssize_t x; + size_t b; b = n / 8; x = memcmp(l, r, b); - if (x || (n % 8) == 0) - return (x); + if (x || (n % 8) == 0) { + return (int)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) + if (lb & 0x80) { return (1); + } return (-1); } lb <<= 1; diff --git a/deps/cares/src/lib/bitncmp.h b/deps/cares/src/lib/bitncmp.h index 8e39eb510c3943..0c4b9c39a8fb9e 100644 --- a/deps/cares/src/lib/bitncmp.h +++ b/deps/cares/src/lib/bitncmp.h @@ -27,9 +27,9 @@ #define __ARES_BITNCMP_H #ifndef HAVE_BITNCMP -int ares__bitncmp(const void *l, const void *r, int n); +int ares__bitncmp(const void *l, const void *r, size_t n); #else -#define ares__bitncmp(x,y,z) bitncmp(x,y,z) +# define ares__bitncmp(x, y, z) bitncmp(x, y, z) #endif #endif /* __ARES_BITNCMP_H */ diff --git a/deps/cares/src/lib/config-dos.h b/deps/cares/src/lib/config-dos.h index 50b039f5312a73..301fee4cf33973 100644 --- a/deps/cares/src/lib/config-dos.h +++ b/deps/cares/src/lib/config-dos.h @@ -9,57 +9,57 @@ * SPDX-License-Identifier: MIT * ================================================================ */ -#define PACKAGE "c-ares" - -#define HAVE_ERRNO_H 1 -#define HAVE_GETENV 1 -#define HAVE_GETTIMEOFDAY 1 -#define HAVE_IOCTLSOCKET 1 -#define HAVE_IOCTLSOCKET_FIONBIO 1 -#define HAVE_LIMITS_H 1 -#define HAVE_NET_IF_H 1 -#define HAVE_RECV 1 -#define HAVE_RECVFROM 1 -#define HAVE_SEND 1 -#define HAVE_STRDUP 1 -#define HAVE_STRICMP 1 -#define HAVE_STRUCT_IN6_ADDR 1 -#define HAVE_STRUCT_TIMEVAL 1 -#define HAVE_SYS_IOCTL_H 1 -#define HAVE_SYS_SOCKET_H 1 -#define HAVE_SYS_STAT_H 1 -#define HAVE_SYS_TYPES_H 1 -#define HAVE_TIME_H 1 -#define HAVE_UNISTD_H 1 -#define HAVE_WRITEV 1 - -#define NEED_MALLOC_H 1 - -#define RETSIGTYPE void -#define TIME_WITH_SYS_TIME 1 +#define PACKAGE "c-ares" + +#define HAVE_ERRNO_H 1 +#define HAVE_GETENV 1 +#define HAVE_GETTIMEOFDAY 1 +#define HAVE_IOCTLSOCKET 1 +#define HAVE_IOCTLSOCKET_FIONBIO 1 +#define HAVE_LIMITS_H 1 +#define HAVE_NET_IF_H 1 +#define HAVE_RECV 1 +#define HAVE_RECVFROM 1 +#define HAVE_SEND 1 +#define HAVE_STRDUP 1 +#define HAVE_STRICMP 1 +#define HAVE_STRUCT_IN6_ADDR 1 +#define HAVE_STRUCT_TIMEVAL 1 +#define HAVE_SYS_IOCTL_H 1 +#define HAVE_SYS_SOCKET_H 1 +#define HAVE_SYS_STAT_H 1 +#define HAVE_SYS_TYPES_H 1 +#define HAVE_TIME_H 1 +#define HAVE_UNISTD_H 1 +#define HAVE_WRITEV 1 + +#define NEED_MALLOC_H 1 + +#define RETSIGTYPE void +#define TIME_WITH_SYS_TIME 1 /* Qualifiers for send(), recv(), recvfrom() and getnameinfo(). */ -#define SEND_TYPE_ARG1 int -#define SEND_QUAL_ARG2 const -#define SEND_TYPE_ARG2 void * -#define SEND_TYPE_ARG3 int -#define SEND_TYPE_ARG4 int -#define SEND_TYPE_RETV int - -#define RECV_TYPE_ARG1 int -#define RECV_TYPE_ARG2 void * -#define RECV_TYPE_ARG3 int -#define RECV_TYPE_ARG4 int -#define RECV_TYPE_RETV int - -#define RECVFROM_TYPE_ARG1 int -#define RECVFROM_TYPE_ARG2 void -#define RECVFROM_TYPE_ARG3 int -#define RECVFROM_TYPE_ARG4 int -#define RECVFROM_TYPE_ARG5 struct sockaddr -#define RECVFROM_TYPE_ARG6 int -#define RECVFROM_TYPE_RETV int +#define SEND_TYPE_ARG1 int +#define SEND_QUAL_ARG2 const +#define SEND_TYPE_ARG2 void * +#define SEND_TYPE_ARG3 int +#define SEND_TYPE_ARG4 int +#define SEND_TYPE_RETV int + +#define RECV_TYPE_ARG1 int +#define RECV_TYPE_ARG2 void * +#define RECV_TYPE_ARG3 int +#define RECV_TYPE_ARG4 int +#define RECV_TYPE_RETV int + +#define RECVFROM_TYPE_ARG1 int +#define RECVFROM_TYPE_ARG2 void +#define RECVFROM_TYPE_ARG3 int +#define RECVFROM_TYPE_ARG4 int +#define RECVFROM_TYPE_ARG5 struct sockaddr +#define RECVFROM_TYPE_ARG6 int +#define RECVFROM_TYPE_RETV int #define RECVFROM_TYPE_ARG2_IS_VOID 1 #define BSD @@ -67,52 +67,51 @@ /* Target HAVE_x section */ #if defined(DJGPP) - #undef _SSIZE_T - #include /* For 'ssize_t' */ +# undef _SSIZE_T +# include /* For 'ssize_t' */ - #define HAVE_STRCASECMP 1 - #define HAVE_STRNCASECMP 1 - #define HAVE_SYS_TIME_H 1 - #define HAVE_VARIADIC_MACROS_GCC 1 +# define HAVE_STRCASECMP 1 +# define HAVE_STRNCASECMP 1 +# define HAVE_SYS_TIME_H 1 +# define HAVE_VARIADIC_MACROS_GCC 1 - /* Because djgpp <= 2.03 doesn't have snprintf() etc. */ - #if (DJGPP_MINOR < 4) - #define _MPRINTF_REPLACE - #endif +/* Because djgpp <= 2.03 doesn't have snprintf() etc. */ +# if (DJGPP_MINOR < 4) +# define _MPRINTF_REPLACE +# endif #elif defined(__WATCOMC__) - #define HAVE_STRCASECMP 1 +# define HAVE_STRCASECMP 1 #elif defined(__HIGHC__) - #define HAVE_SYS_TIME_H 1 - #define strerror(e) strerror_s_((e)) +# define HAVE_SYS_TIME_H 1 +# define strerror(e) strerror_s_((e)) #endif #ifdef WATT32 - #define HAVE_AF_INET6 1 - #define HAVE_ARPA_INET_H 1 - #define HAVE_ARPA_NAMESER_H 1 - #define HAVE_CLOSE_S 1 - #define HAVE_GETHOSTNAME 1 - #define HAVE_NETDB_H 1 - #define HAVE_NETINET_IN_H 1 - #define HAVE_NETINET_TCP_H 1 - #define HAVE_PF_INET6 1 - #define HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID 1 - #define HAVE_STRUCT_ADDRINFO 1 - #define HAVE_STRUCT_IN6_ADDR 1 - #define HAVE_STRUCT_SOCKADDR_IN6 1 - #define HAVE_SYS_SOCKET_H 1 - #define HAVE_SYS_UIO_H 1 - #define NS_INADDRSZ 4 - #define HAVE_STRUCT_SOCKADDR_IN6 1 - - #define HAVE_GETSERVBYPORT_R 1 - #define GETSERVBYPORT_R_ARGS 5 +# define HAVE_AF_INET6 1 +# define HAVE_ARPA_INET_H 1 +# define HAVE_ARPA_NAMESER_H 1 +# define HAVE_CLOSE_S 1 +# define HAVE_GETHOSTNAME 1 +# define HAVE_NETDB_H 1 +# define HAVE_NETINET_IN_H 1 +# define HAVE_NETINET_TCP_H 1 +# define HAVE_PF_INET6 1 +# define HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID 1 +# define HAVE_STRUCT_ADDRINFO 1 +# define HAVE_STRUCT_IN6_ADDR 1 +# define HAVE_STRUCT_SOCKADDR_IN6 1 +# define HAVE_SYS_SOCKET_H 1 +# define HAVE_SYS_UIO_H 1 +# define NS_INADDRSZ 4 +# define HAVE_STRUCT_SOCKADDR_IN6 1 + +# define HAVE_GETSERVBYPORT_R 1 +# define GETSERVBYPORT_R_ARGS 5 #endif #undef word #undef byte #endif /* HEADER_CONFIG_DOS_H */ - diff --git a/deps/cares/src/lib/config-win32.h b/deps/cares/src/lib/config-win32.h index fb13fed4c78bc7..2701f173035d0a 100644 --- a/deps/cares/src/lib/config-win32.h +++ b/deps/cares/src/lib/config-win32.h @@ -42,7 +42,7 @@ /* Define if you have the header file. */ #if defined(__MINGW32__) || defined(__POCC__) -#define HAVE_GETOPT_H 1 +# define HAVE_GETOPT_H 1 #endif /* Define if you have the header file. */ @@ -50,7 +50,7 @@ /* Define if you have the header file. */ #ifndef __SALFORDC__ -#define HAVE_PROCESS_H 1 +# define HAVE_PROCESS_H 1 #endif /* Define if you have the header file. */ @@ -64,8 +64,8 @@ /* Define if you have the 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 header file. */ @@ -76,12 +76,29 @@ /* Define if you have the header file. */ #ifndef __SALFORDC__ -#define HAVE_WINSOCK2_H 1 +# define HAVE_WINSOCK2_H 1 #endif /* Define if you have the header file. */ #ifndef __SALFORDC__ -#define HAVE_WS2TCPIP_H 1 +# define HAVE_WS2TCPIP_H 1 +#endif + +/* Define if you have header file */ +#define HAVE_IPHLPAPI_H 1 + +/* Define if you have 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 + * . */ +#if defined(__WATCOMC__) +# define HAVE_STDINT_H #endif /* ---------------------------------------------------------------- */ @@ -196,23 +213,26 @@ /* 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 */ /* ---------------------------------------------------------------- */ @@ -225,7 +245,7 @@ #ifdef __cplusplus /* Compiling headers in C++ mode means bool is available */ -#define HAVE_BOOL_T +# define HAVE_BOOL_T #endif /* ---------------------------------------------------------------- */ @@ -241,7 +261,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. */ @@ -253,7 +273,7 @@ /* 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 @@ -320,27 +340,27 @@ /* 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_SOCKADDR_IN6_SIN6_SCOPE_ID 1 #endif /* ---------------------------------------------------------------- */ @@ -354,10 +374,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/deps/cares/src/lib/inet_net_pton.c b/deps/cares/src/lib/inet_net_pton.c index d3924c3767ec2a..19429f205d86ab 100644 --- a/deps/cares/src/lib/inet_net_pton.c +++ b/deps/cares/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/deps/cares/src/lib/inet_ntop.c b/deps/cares/src/lib/inet_ntop.c index 246d630647b9eb..8ed49da2a9b219 100644 --- a/deps/cares/src/lib/inet_ntop.c +++ b/deps/cares/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++) + for (i = 0; i < NS_IN6ADDRSZ; i++) { words[i / 2] |= (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/deps/cares/src/lib/setup_once.h b/deps/cares/src/lib/setup_once.h index f576797de353b7..4fbf5ba157eb92 100644 --- a/deps/cares/src/lib/setup_once.h +++ b/deps/cares/src/lib/setup_once.h @@ -48,47 +48,47 @@ #include #ifdef HAVE_ERRNO_H -#include +# include #endif #ifdef HAVE_SYS_TYPES_H -#include +# include #endif #ifdef NEED_MALLOC_H -#include +# include #endif #ifdef NEED_MEMORY_H -#include +# include #endif #ifdef HAVE_SYS_STAT_H -#include +# include #endif #ifdef HAVE_SYS_TIME_H -#include -#ifdef TIME_WITH_SYS_TIME -#include -#endif +# include +# ifdef TIME_WITH_SYS_TIME +# include +# endif #else -#ifdef HAVE_TIME_H -#include -#endif +# ifdef HAVE_TIME_H +# include +# endif #endif #ifdef WIN32 -#include -#include +# include +# include #endif #if defined(HAVE_STDBOOL_H) && defined(HAVE_BOOL_T) -#include +# include #endif #ifdef HAVE_UNISTD_H -#include +# include #endif #ifdef __hpux @@ -103,11 +103,11 @@ #endif #ifdef HAVE_SYS_RANDOM_H -#include +# include #endif #ifdef HAVE_SYS_SOCKET_H -#include +# include #endif #ifdef __hpux @@ -126,8 +126,8 @@ #ifndef HAVE_STRUCT_TIMEVAL struct timeval { - long tv_sec; - long tv_usec; + long tv_sec; + long tv_usec; }; #endif @@ -138,17 +138,17 @@ struct timeval { */ #ifdef HAVE_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 +173,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 +261,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,21 +276,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 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 ISBLANK(x) \ + (int)((((unsigned char)x) == ' ') || (((unsigned char)x) == '\t')) -#define TOLOWER(x) (tolower((int) ((unsigned char)x))) +#define TOLOWER(x) (tolower((int)((unsigned char)x))) /* @@ -309,9 +298,9 @@ struct timeval { */ #if defined(__hpux) && !defined(HAVE_BOOL_T) - typedef int bool; +typedef int bool; # define false 0 -# define true 1 +# define true 1 # define HAVE_BOOL_T #endif @@ -324,10 +313,10 @@ struct timeval { */ #ifndef HAVE_BOOL_T - typedef enum { - bool_false = 0, - bool_true = 1 - } bool; +typedef enum { + bool_false = 0, + bool_true = 1 +} bool; /* * Use a define to let 'true' and 'false' use those enums. There @@ -349,10 +338,10 @@ struct timeval { */ #ifndef TRUE -#define TRUE true +# define TRUE true #endif #ifndef FALSE -#define FALSE false +# define FALSE false #endif @@ -361,18 +350,16 @@ 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 @@ -383,7 +370,7 @@ __pragma(warning(pop)) #ifndef HAVE_SIG_ATOMIC_T typedef int sig_atomic_t; -#define HAVE_SIG_ATOMIC_T +# define HAVE_SIG_ATOMIC_T #endif @@ -392,9 +379,9 @@ typedef int sig_atomic_t; */ #ifdef HAVE_SIG_ATOMIC_T_VOLATILE -#define SIG_ATOMIC_T static sig_atomic_t +# define SIG_ATOMIC_T static sig_atomic_t #else -#define SIG_ATOMIC_T static volatile sig_atomic_t +# define SIG_ATOMIC_T static volatile sig_atomic_t #endif @@ -403,7 +390,7 @@ typedef int sig_atomic_t; */ #ifndef RETSIGTYPE -#define RETSIGTYPE void +# define RETSIGTYPE void #endif @@ -412,9 +399,12 @@ typedef int sig_atomic_t; */ #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 +413,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 +428,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 +442,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 +455,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 +534,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 +545,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/deps/cares/src/lib/windows_port.c b/deps/cares/src/lib/windows_port.c index 5977b8493ea843..d5f0ad3abf608b 100644 --- a/deps/cares/src/lib/windows_port.c +++ b/deps/cares/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 */ diff --git a/deps/cares/src/tools/CMakeLists.txt b/deps/cares/src/tools/CMakeLists.txt index 9ee01b4745680c..ed5a7d7233b308 100644 --- a/deps/cares/src/tools/CMakeLists.txt +++ b/deps/cares/src/tools/CMakeLists.txt @@ -15,6 +15,10 @@ IF (CARES_BUILD_TOOLS) "$" PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}" ) + SET_TARGET_PROPERTIES (ahost PROPERTIES + C_STANDARD 90 + ) + TARGET_COMPILE_DEFINITIONS (ahost PRIVATE HAVE_CONFIG_H=1) TARGET_LINK_LIBRARIES (ahost PRIVATE ${PROJECT_NAME}) IF (CARES_INSTALL) @@ -32,6 +36,10 @@ IF (CARES_BUILD_TOOLS) "$" PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}" ) + SET_TARGET_PROPERTIES (adig PROPERTIES + C_STANDARD 90 + ) + TARGET_COMPILE_DEFINITIONS (adig PRIVATE HAVE_CONFIG_H=1) TARGET_LINK_LIBRARIES (adig PRIVATE ${PROJECT_NAME}) IF (CARES_INSTALL) diff --git a/deps/cares/src/tools/Makefile.in b/deps/cares/src/tools/Makefile.in index 048b1e8b0c11cd..661aa366cae68d 100644 --- a/deps/cares/src/tools/Makefile.in +++ b/deps/cares/src/tools/Makefile.in @@ -96,11 +96,15 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ $(top_srcdir)/m4/ax_ac_print_to_file.m4 \ $(top_srcdir)/m4/ax_add_am_macro_static.m4 \ $(top_srcdir)/m4/ax_am_macros_static.m4 \ + $(top_srcdir)/m4/ax_append_compile_flags.m4 \ + $(top_srcdir)/m4/ax_append_flag.m4 \ + $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_check_gnu_make.m4 \ $(top_srcdir)/m4/ax_code_coverage.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ $(top_srcdir)/m4/ax_file_escapes.m4 \ + $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_require_defined.m4 \ $(top_srcdir)/m4/cares-compilers.m4 \ $(top_srcdir)/m4/cares-confopts.m4 \ @@ -128,7 +132,6 @@ am__EXEEXT_1 = ahost$(EXEEXT) adig$(EXEEXT) PROGRAMS = $(noinst_PROGRAMS) am__dirstamp = $(am__leading_dot)dirstamp am__objects_1 = adig-ares_getopt.$(OBJEXT) \ - ../lib/adig-ares_nowarn.$(OBJEXT) \ ../lib/adig-ares_strcasecmp.$(OBJEXT) am__objects_2 = am_adig_OBJECTS = adig-adig.$(OBJEXT) $(am__objects_1) \ @@ -146,7 +149,6 @@ adig_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(adig_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ am__objects_3 = ahost-ares_getopt.$(OBJEXT) \ - ../lib/ahost-ares_nowarn.$(OBJEXT) \ ../lib/ahost-ares_strcasecmp.$(OBJEXT) am_ahost_OBJECTS = ahost-ahost.$(OBJEXT) $(am__objects_3) \ $(am__objects_2) @@ -172,9 +174,7 @@ am__v_at_1 = DEFAULT_INCLUDES = depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles -am__depfiles_remade = ../lib/$(DEPDIR)/adig-ares_nowarn.Po \ - ../lib/$(DEPDIR)/adig-ares_strcasecmp.Po \ - ../lib/$(DEPDIR)/ahost-ares_nowarn.Po \ +am__depfiles_remade = ../lib/$(DEPDIR)/adig-ares_strcasecmp.Po \ ../lib/$(DEPDIR)/ahost-ares_strcasecmp.Po \ ./$(DEPDIR)/adig-adig.Po ./$(DEPDIR)/adig-ares_getopt.Po \ ./$(DEPDIR)/ahost-ahost.Po ./$(DEPDIR)/ahost-ares_getopt.Po @@ -307,6 +307,10 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_CXX = @PTHREAD_CXX@ +PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -326,6 +330,7 @@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ +ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ @@ -388,11 +393,9 @@ AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_builddir)/src/lib \ # Copyright (C) The c-ares project and its contributors # SPDX-License-Identifier: MIT SAMPLESOURCES = ares_getopt.c \ - ../lib/ares_nowarn.c \ ../lib/ares_strcasecmp.c SAMPLEHEADERS = ares_getopt.h \ - ../lib/ares_nowarn.h \ ../lib/ares_strcasecmp.h @@ -454,16 +457,12 @@ clean-noinstPROGRAMS: ../lib/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ../lib/$(DEPDIR) @: > ../lib/$(DEPDIR)/$(am__dirstamp) -../lib/adig-ares_nowarn.$(OBJEXT): ../lib/$(am__dirstamp) \ - ../lib/$(DEPDIR)/$(am__dirstamp) ../lib/adig-ares_strcasecmp.$(OBJEXT): ../lib/$(am__dirstamp) \ ../lib/$(DEPDIR)/$(am__dirstamp) adig$(EXEEXT): $(adig_OBJECTS) $(adig_DEPENDENCIES) $(EXTRA_adig_DEPENDENCIES) @rm -f adig$(EXEEXT) $(AM_V_CCLD)$(adig_LINK) $(adig_OBJECTS) $(adig_LDADD) $(LIBS) -../lib/ahost-ares_nowarn.$(OBJEXT): ../lib/$(am__dirstamp) \ - ../lib/$(DEPDIR)/$(am__dirstamp) ../lib/ahost-ares_strcasecmp.$(OBJEXT): ../lib/$(am__dirstamp) \ ../lib/$(DEPDIR)/$(am__dirstamp) @@ -478,9 +477,7 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@../lib/$(DEPDIR)/adig-ares_nowarn.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@../lib/$(DEPDIR)/adig-ares_strcasecmp.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@../lib/$(DEPDIR)/ahost-ares_nowarn.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@../lib/$(DEPDIR)/ahost-ares_strcasecmp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/adig-adig.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/adig-ares_getopt.Po@am__quote@ # am--include-marker @@ -545,20 +542,6 @@ adig-ares_getopt.obj: ares_getopt.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(adig_CPPFLAGS) $(CPPFLAGS) $(adig_CFLAGS) $(CFLAGS) -c -o adig-ares_getopt.obj `if test -f 'ares_getopt.c'; then $(CYGPATH_W) 'ares_getopt.c'; else $(CYGPATH_W) '$(srcdir)/ares_getopt.c'; fi` -../lib/adig-ares_nowarn.o: ../lib/ares_nowarn.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(adig_CPPFLAGS) $(CPPFLAGS) $(adig_CFLAGS) $(CFLAGS) -MT ../lib/adig-ares_nowarn.o -MD -MP -MF ../lib/$(DEPDIR)/adig-ares_nowarn.Tpo -c -o ../lib/adig-ares_nowarn.o `test -f '../lib/ares_nowarn.c' || echo '$(srcdir)/'`../lib/ares_nowarn.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../lib/$(DEPDIR)/adig-ares_nowarn.Tpo ../lib/$(DEPDIR)/adig-ares_nowarn.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../lib/ares_nowarn.c' object='../lib/adig-ares_nowarn.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(adig_CPPFLAGS) $(CPPFLAGS) $(adig_CFLAGS) $(CFLAGS) -c -o ../lib/adig-ares_nowarn.o `test -f '../lib/ares_nowarn.c' || echo '$(srcdir)/'`../lib/ares_nowarn.c - -../lib/adig-ares_nowarn.obj: ../lib/ares_nowarn.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(adig_CPPFLAGS) $(CPPFLAGS) $(adig_CFLAGS) $(CFLAGS) -MT ../lib/adig-ares_nowarn.obj -MD -MP -MF ../lib/$(DEPDIR)/adig-ares_nowarn.Tpo -c -o ../lib/adig-ares_nowarn.obj `if test -f '../lib/ares_nowarn.c'; then $(CYGPATH_W) '../lib/ares_nowarn.c'; else $(CYGPATH_W) '$(srcdir)/../lib/ares_nowarn.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../lib/$(DEPDIR)/adig-ares_nowarn.Tpo ../lib/$(DEPDIR)/adig-ares_nowarn.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../lib/ares_nowarn.c' object='../lib/adig-ares_nowarn.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(adig_CPPFLAGS) $(CPPFLAGS) $(adig_CFLAGS) $(CFLAGS) -c -o ../lib/adig-ares_nowarn.obj `if test -f '../lib/ares_nowarn.c'; then $(CYGPATH_W) '../lib/ares_nowarn.c'; else $(CYGPATH_W) '$(srcdir)/../lib/ares_nowarn.c'; fi` - ../lib/adig-ares_strcasecmp.o: ../lib/ares_strcasecmp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(adig_CPPFLAGS) $(CPPFLAGS) $(adig_CFLAGS) $(CFLAGS) -MT ../lib/adig-ares_strcasecmp.o -MD -MP -MF ../lib/$(DEPDIR)/adig-ares_strcasecmp.Tpo -c -o ../lib/adig-ares_strcasecmp.o `test -f '../lib/ares_strcasecmp.c' || echo '$(srcdir)/'`../lib/ares_strcasecmp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../lib/$(DEPDIR)/adig-ares_strcasecmp.Tpo ../lib/$(DEPDIR)/adig-ares_strcasecmp.Po @@ -601,20 +584,6 @@ ahost-ares_getopt.obj: ares_getopt.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ahost_CPPFLAGS) $(CPPFLAGS) $(ahost_CFLAGS) $(CFLAGS) -c -o ahost-ares_getopt.obj `if test -f 'ares_getopt.c'; then $(CYGPATH_W) 'ares_getopt.c'; else $(CYGPATH_W) '$(srcdir)/ares_getopt.c'; fi` -../lib/ahost-ares_nowarn.o: ../lib/ares_nowarn.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ahost_CPPFLAGS) $(CPPFLAGS) $(ahost_CFLAGS) $(CFLAGS) -MT ../lib/ahost-ares_nowarn.o -MD -MP -MF ../lib/$(DEPDIR)/ahost-ares_nowarn.Tpo -c -o ../lib/ahost-ares_nowarn.o `test -f '../lib/ares_nowarn.c' || echo '$(srcdir)/'`../lib/ares_nowarn.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../lib/$(DEPDIR)/ahost-ares_nowarn.Tpo ../lib/$(DEPDIR)/ahost-ares_nowarn.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../lib/ares_nowarn.c' object='../lib/ahost-ares_nowarn.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ahost_CPPFLAGS) $(CPPFLAGS) $(ahost_CFLAGS) $(CFLAGS) -c -o ../lib/ahost-ares_nowarn.o `test -f '../lib/ares_nowarn.c' || echo '$(srcdir)/'`../lib/ares_nowarn.c - -../lib/ahost-ares_nowarn.obj: ../lib/ares_nowarn.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ahost_CPPFLAGS) $(CPPFLAGS) $(ahost_CFLAGS) $(CFLAGS) -MT ../lib/ahost-ares_nowarn.obj -MD -MP -MF ../lib/$(DEPDIR)/ahost-ares_nowarn.Tpo -c -o ../lib/ahost-ares_nowarn.obj `if test -f '../lib/ares_nowarn.c'; then $(CYGPATH_W) '../lib/ares_nowarn.c'; else $(CYGPATH_W) '$(srcdir)/../lib/ares_nowarn.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../lib/$(DEPDIR)/ahost-ares_nowarn.Tpo ../lib/$(DEPDIR)/ahost-ares_nowarn.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../lib/ares_nowarn.c' object='../lib/ahost-ares_nowarn.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ahost_CPPFLAGS) $(CPPFLAGS) $(ahost_CFLAGS) $(CFLAGS) -c -o ../lib/ahost-ares_nowarn.obj `if test -f '../lib/ares_nowarn.c'; then $(CYGPATH_W) '../lib/ares_nowarn.c'; else $(CYGPATH_W) '$(srcdir)/../lib/ares_nowarn.c'; fi` - ../lib/ahost-ares_strcasecmp.o: ../lib/ares_strcasecmp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ahost_CPPFLAGS) $(CPPFLAGS) $(ahost_CFLAGS) $(CFLAGS) -MT ../lib/ahost-ares_strcasecmp.o -MD -MP -MF ../lib/$(DEPDIR)/ahost-ares_strcasecmp.Tpo -c -o ../lib/ahost-ares_strcasecmp.o `test -f '../lib/ares_strcasecmp.c' || echo '$(srcdir)/'`../lib/ares_strcasecmp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../lib/$(DEPDIR)/ahost-ares_strcasecmp.Tpo ../lib/$(DEPDIR)/ahost-ares_strcasecmp.Po @@ -761,9 +730,7 @@ clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am - -rm -f ../lib/$(DEPDIR)/adig-ares_nowarn.Po - -rm -f ../lib/$(DEPDIR)/adig-ares_strcasecmp.Po - -rm -f ../lib/$(DEPDIR)/ahost-ares_nowarn.Po + -rm -f ../lib/$(DEPDIR)/adig-ares_strcasecmp.Po -rm -f ../lib/$(DEPDIR)/ahost-ares_strcasecmp.Po -rm -f ./$(DEPDIR)/adig-adig.Po -rm -f ./$(DEPDIR)/adig-ares_getopt.Po @@ -814,9 +781,7 @@ install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am - -rm -f ../lib/$(DEPDIR)/adig-ares_nowarn.Po - -rm -f ../lib/$(DEPDIR)/adig-ares_strcasecmp.Po - -rm -f ../lib/$(DEPDIR)/ahost-ares_nowarn.Po + -rm -f ../lib/$(DEPDIR)/adig-ares_strcasecmp.Po -rm -f ../lib/$(DEPDIR)/ahost-ares_strcasecmp.Po -rm -f ./$(DEPDIR)/adig-adig.Po -rm -f ./$(DEPDIR)/adig-ares_getopt.Po diff --git a/deps/cares/src/tools/Makefile.inc b/deps/cares/src/tools/Makefile.inc index 4e3850e0e7dc5f..dd081b3005d436 100644 --- a/deps/cares/src/tools/Makefile.inc +++ b/deps/cares/src/tools/Makefile.inc @@ -1,9 +1,7 @@ # Copyright (C) The c-ares project and its contributors # SPDX-License-Identifier: MIT SAMPLESOURCES = ares_getopt.c \ - ../lib/ares_nowarn.c \ ../lib/ares_strcasecmp.c SAMPLEHEADERS = ares_getopt.h \ - ../lib/ares_nowarn.h \ ../lib/ares_strcasecmp.h diff --git a/deps/cares/src/tools/adig.c b/deps/cares/src/tools/adig.c index 28d55ac351e5d9..35f4b224f61381 100644 --- a/deps/cares/src/tools/adig.c +++ b/deps/cares/src/tools/adig.c @@ -24,7 +24,6 @@ * * SPDX-License-Identifier: MIT */ - #include "ares_setup.h" #ifdef HAVE_NETINET_IN_H @@ -45,8 +44,6 @@ #include "ares.h" #include "ares_dns.h" -#include "ares_getopt.h" -#include "ares_nowarn.h" #ifndef HAVE_STRDUP # include "ares_strdup.h" @@ -55,945 +52,908 @@ #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 +#include "ares_getopt.h" + #ifdef WATT32 -#undef WIN32 /* Redefined in MingW headers */ +# undef WIN32 /* Redefined in MingW headers */ #endif -struct nv { +typedef struct { + ares_bool_t is_help; + struct ares_options options; + int optmask; + ares_dns_class_t qclass; + ares_dns_rec_type_t qtype; + int args_processed; + char *servers; + char error[256]; +} adig_config_t; + +typedef struct { const char *name; - int value; + int value; +} nv_t; + +static const nv_t configflags[] = { + {"usevc", ARES_FLAG_USEVC }, + { "primary", ARES_FLAG_PRIMARY }, + { "igntc", ARES_FLAG_IGNTC }, + { "norecurse", ARES_FLAG_NORECURSE}, + { "stayopen", ARES_FLAG_STAYOPEN }, + { "noaliases", ARES_FLAG_NOALIASES} }; +static const size_t nconfigflags = sizeof(configflags) / sizeof(*configflags); -static const struct nv flags[] = { - { "usevc", ARES_FLAG_USEVC }, - { "primary", ARES_FLAG_PRIMARY }, - { "igntc", ARES_FLAG_IGNTC }, - { "norecurse", ARES_FLAG_NORECURSE }, - { "stayopen", ARES_FLAG_STAYOPEN }, - { "noaliases", ARES_FLAG_NOALIASES } -}; -static const int nflags = sizeof(flags) / sizeof(flags[0]); +static int lookup_flag(const nv_t *nv, size_t num_nv, const char *name) +{ + size_t i; -static const struct nv classes[] = { - { "IN", C_IN }, - { "CHAOS", C_CHAOS }, - { "HS", C_HS }, - { "ANY", C_ANY } -}; -static const int nclasses = sizeof(classes) / sizeof(classes[0]); - -static const struct nv types[] = { - { "A", T_A }, - { "NS", T_NS }, - { "MD", T_MD }, - { "MF", T_MF }, - { "CNAME", T_CNAME }, - { "SOA", T_SOA }, - { "MB", T_MB }, - { "MG", T_MG }, - { "MR", T_MR }, - { "NULL", T_NULL }, - { "WKS", T_WKS }, - { "PTR", T_PTR }, - { "HINFO", T_HINFO }, - { "MINFO", T_MINFO }, - { "MX", T_MX }, - { "TXT", T_TXT }, - { "RP", T_RP }, - { "AFSDB", T_AFSDB }, - { "X25", T_X25 }, - { "ISDN", T_ISDN }, - { "RT", T_RT }, - { "NSAP", T_NSAP }, - { "NSAP_PTR", T_NSAP_PTR }, - { "SIG", T_SIG }, - { "KEY", T_KEY }, - { "PX", T_PX }, - { "GPOS", T_GPOS }, - { "AAAA", T_AAAA }, - { "LOC", T_LOC }, - { "SRV", T_SRV }, - { "AXFR", T_AXFR }, - { "MAILB", T_MAILB }, - { "MAILA", T_MAILA }, - { "NAPTR", T_NAPTR }, - { "DS", T_DS }, - { "SSHFP", T_SSHFP }, - { "RRSIG", T_RRSIG }, - { "NSEC", T_NSEC }, - { "DNSKEY", T_DNSKEY }, - { "CAA", T_CAA }, - { "URI", T_URI }, - { "ANY", T_ANY } -}; -static const int ntypes = sizeof(types) / sizeof(types[0]); + if (name == NULL) { + return 0; + } -static const char *opcodes[] = { - "QUERY", "IQUERY", "STATUS", "(reserved)", "NOTIFY", - "(unknown)", "(unknown)", "(unknown)", "(unknown)", - "UPDATEA", "UPDATED", "UPDATEDA", "UPDATEM", "UPDATEMA", - "ZONEINIT", "ZONEREF" -}; + for (i = 0; i < num_nv; i++) { + if (strcasecmp(nv[i].name, name) == 0) { + return nv[i].value; + } + } -static const char *rcodes[] = { - "NOERROR", "FORMERR", "SERVFAIL", "NXDOMAIN", "NOTIMP", "REFUSED", - "(unknown)", "(unknown)", "(unknown)", "(unknown)", "(unknown)", - "(unknown)", "(unknown)", "(unknown)", "(unknown)", "NOCHANGE" -}; + return 0; +} -static void callback(void *arg, int status, int timeouts, - unsigned char *abuf, int alen); -static const unsigned char *display_question(const unsigned char *aptr, - const unsigned char *abuf, - int alen); -static const unsigned char *display_rr(const unsigned char *aptr, - const unsigned char *abuf, int alen); -static int convert_query (char **name, int use_bitstring); -static const char *type_name(int type); -static const char *class_name(int dnsclass); -static void usage(void); -static void destroy_addr_list(struct ares_addr_node *head); -static void append_addr_list(struct ares_addr_node **head, - struct ares_addr_node *node); -static void print_help_info_adig(void); +static void free_config(adig_config_t *config) +{ + free(config->servers); + memset(config, 0, sizeof(*config)); +} -int main(int argc, char **argv) +static void print_help(void) { - ares_channel channel; - int c, i, optmask = ARES_OPT_FLAGS, dnsclass = C_IN, type = T_A; - int status, nfds, count; - int use_ptr_helper = 0; - struct ares_options options; - struct hostent *hostent; - fd_set read_fds, write_fds; - struct timeval *tvp, tv; - struct ares_addr_node *srvr, *servers = NULL; + printf("adig version %s\n\n", ares_version(NULL)); + printf( + "usage: adig [-h] [-d] [-f flag] [[-s server] ...] [-T|U port] [-c class]\n" + " [-t type] name ...\n\n" + " -h : Display this help and exit.\n" + " -d : Print some extra debugging output.\n" + " -f flag : Add a behavior control flag. Possible values are\n" + " igntc - do not retry a truncated query as TCP, just\n" + " return the truncated answer\n" + " noaliases - don't honor the HOSTALIASES environment\n" + " variable\n" + " norecurse - don't query upstream servers recursively\n" + " primary - use the first server\n" + " stayopen - don't close the communication sockets\n" + " usevc - use TCP only\n" + " -s server : Connect to the specified DNS server, instead of the\n" + " system's default one(s). Servers are tried in round-robin,\n" + " if the previous one failed.\n" + " -T port : Connect to the specified TCP port of DNS server.\n" + " -U port : Connect to the specified UDP port of DNS server.\n" + " -c class : Set the query class. Possible values for class are:\n" + " ANY, CHAOS, HS and IN (default)\n" + " -t type : Query records of the specified type. Possible values for\n" + " type are:\n" + " A (default), AAAA, ANY, CNAME, HINFO, MX, NAPTR, NS, PTR,\n" + " SOA, SRV, TXT, TLSA, URI, CAA, SVCB, HTTPS\n\n"); +} -#ifdef USE_WINSOCK - WORD wVersionRequested = MAKEWORD(USE_WINSOCK,USE_WINSOCK); - WSADATA wsaData; - WSAStartup(wVersionRequested, &wsaData); -#endif +static ares_bool_t read_cmdline(int argc, const char **argv, + adig_config_t *config) +{ + ares_getopt_state_t state; + int c; - status = ares_library_init(ARES_LIB_INIT_ALL); - if (status != ARES_SUCCESS) - { - fprintf(stderr, "ares_library_init: %s\n", ares_strerror(status)); - return 1; - } + ares_getopt_init(&state, argc, argv); + state.opterr = 0; + + while ((c = ares_getopt(&state, "dh?f:s:c:t:T:U:")) != -1) { + int f; - options.flags = ARES_FLAG_NOCHECKRESP; - options.servers = NULL; - options.nservers = 0; - while ((c = ares_getopt(argc, argv, "dh?f:s:c:t:T:U:x")) != -1) - { - switch (c) - { - case 'd': + switch (c) { + case 'd': #ifdef WATT32 - dbug_init(); + dbug_init(); #endif - break; - case 'h': - print_help_info_adig(); - break; - case '?': - print_help_info_adig(); - break; - case 'f': - /* Add a flag. */ - for (i = 0; i < nflags; i++) - { - if (strcmp(flags[i].name, optarg) == 0) - break; - } - if (i < nflags) - options.flags |= flags[i].value; - else - usage(); - break; - - case 's': - /* User-specified name servers override default ones. */ - srvr = malloc(sizeof(struct ares_addr_node)); - if (!srvr) - { - fprintf(stderr, "Out of memory!\n"); - destroy_addr_list(servers); - return 1; - } - append_addr_list(&servers, srvr); - if (ares_inet_pton(AF_INET, optarg, &srvr->addr.addr4) > 0) - srvr->family = AF_INET; - else if (ares_inet_pton(AF_INET6, optarg, &srvr->addr.addr6) > 0) - srvr->family = AF_INET6; - else - { - hostent = gethostbyname(optarg); - if (!hostent) - { - fprintf(stderr, "adig: server %s not found.\n", optarg); - destroy_addr_list(servers); - return 1; - } - switch (hostent->h_addrtype) - { - case AF_INET: - srvr->family = AF_INET; - memcpy(&srvr->addr.addr4, hostent->h_addr, - sizeof(srvr->addr.addr4)); - break; - case AF_INET6: - srvr->family = AF_INET6; - memcpy(&srvr->addr.addr6, hostent->h_addr, - sizeof(srvr->addr.addr6)); - break; - default: - fprintf(stderr, - "adig: server %s unsupported address family.\n", optarg); - destroy_addr_list(servers); - return 1; - } - } - /* Notice that calling ares_init_options() without servers in the - * options struct and with ARES_OPT_SERVERS set simultaneously in - * the options mask, results in an initialization with no servers. - * When alternative name servers have been specified these are set - * later calling ares_set_servers() overriding any existing server - * configuration. To prevent initial configuration with default - * servers that will be discarded later, ARES_OPT_SERVERS is set. - * If this flag is not set here the result shall be the same but - * ares_init_options() will do needless work. */ - optmask |= ARES_OPT_SERVERS; - break; - - case 'c': - /* Set the query class. */ - for (i = 0; i < nclasses; i++) - { - if (strcasecmp(classes[i].name, optarg) == 0) - break; - } - if (i < nclasses) - dnsclass = classes[i].value; - else - usage(); - break; - - case 't': - /* Set the query type. */ - for (i = 0; i < ntypes; i++) - { - if (strcasecmp(types[i].name, optarg) == 0) - break; - } - if (i < ntypes) - type = types[i].value; - else - usage(); - break; - - case 'T': - /* Set the TCP port number. */ - if (!ISDIGIT(*optarg)) - usage(); - options.tcp_port = (unsigned short)strtol(optarg, NULL, 0); - options.flags |= ARES_FLAG_USEVC; - optmask |= ARES_OPT_TCP_PORT; - break; - - case 'U': - /* Set the UDP port number. */ - if (!ISDIGIT(*optarg)) - usage(); - options.udp_port = (unsigned short)strtol(optarg, NULL, 0); - optmask |= ARES_OPT_UDP_PORT; - break; - - case 'x': - use_ptr_helper++; - break; - } - } - argc -= optind; - argv += optind; - if (argc == 0) - usage(); - - status = ares_init_options(&channel, &options, optmask); - - if (status != ARES_SUCCESS) - { - fprintf(stderr, "ares_init_options: %s\n", - ares_strerror(status)); - return 1; - } + break; + + case 'h': + config->is_help = ARES_TRUE; + return ARES_TRUE; - if(servers) - { - status = ares_set_servers(channel, servers); - destroy_addr_list(servers); - if (status != ARES_SUCCESS) - { - fprintf(stderr, "ares_init_options: %s\n", - ares_strerror(status)); - return 1; + case 'f': + f = lookup_flag(configflags, nconfigflags, state.optarg); + if (f == 0) { + snprintf(config->error, sizeof(config->error), "flag %s unknown", + state.optarg); } - } - /* Initiate the queries, one per command-line argument. If there is - * only one query to do, supply NULL as the callback argument; - * otherwise, supply the query name as an argument so we can - * distinguish responses for the user when printing them out. - */ - for (i = 1; *argv; i++, argv++) - { - char *query = *argv; + config->options.flags |= f; + config->optmask |= ARES_OPT_FLAGS; + break; - if (type == T_PTR && dnsclass == C_IN && use_ptr_helper) - if (!convert_query (&query, use_ptr_helper >= 2)) - continue; + case 's': + if (state.optarg == NULL) { + snprintf(config->error, sizeof(config->error), "%s", + "missing servers"); + return ARES_FALSE; + } + if (config->servers) { + free(config->servers); + } + config->servers = strdup(state.optarg); + break; - ares_query(channel, query, dnsclass, type, callback, i < argc-1 ? (void*)query : NULL); - } + case 'c': + if (!ares_dns_class_fromstr(&config->qclass, state.optarg)) { + snprintf(config->error, sizeof(config->error), + "unrecognized class %s", state.optarg); + return ARES_FALSE; + } + break; - /* Wait for all queries to complete. */ - for (;;) - { - FD_ZERO(&read_fds); - FD_ZERO(&write_fds); - nfds = ares_fds(channel, &read_fds, &write_fds); - if (nfds == 0) + case 't': + if (!ares_dns_rec_type_fromstr(&config->qtype, state.optarg)) { + snprintf(config->error, sizeof(config->error), "unrecognized type %s", + state.optarg); + return ARES_FALSE; + } break; - tvp = ares_timeout(channel, NULL, &tv); - count = select(nfds, &read_fds, &write_fds, NULL, tvp); - if (count < 0 && (status = SOCKERRNO) != EINVAL) - { - printf("select fail: %d", status); - return 1; + + case 'T': + /* Set the TCP port number. */ + if (!isdigit(*state.optarg)) { + snprintf(config->error, sizeof(config->error), "invalid port number"); + return ARES_FALSE; } - ares_process(channel, &read_fds, &write_fds); - } + config->options.tcp_port = + (unsigned short)strtol(state.optarg, NULL, 0); + config->options.flags |= ARES_FLAG_USEVC; + config->optmask |= ARES_OPT_TCP_PORT; + break; - ares_destroy(channel); + case 'U': + /* Set the UDP port number. */ + if (!isdigit(*state.optarg)) { + snprintf(config->error, sizeof(config->error), "invalid port number"); + return ARES_FALSE; + } + config->options.udp_port = + (unsigned short)strtol(state.optarg, NULL, 0); + config->optmask |= ARES_OPT_UDP_PORT; + break; - ares_library_cleanup(); + case ':': + snprintf(config->error, sizeof(config->error), + "%c requires an argument", state.optopt); + return ARES_FALSE; -#ifdef USE_WINSOCK - WSACleanup(); -#endif + default: + snprintf(config->error, sizeof(config->error), + "unrecognized option: %c", state.optopt); + return ARES_FALSE; + } + } + + config->args_processed = state.optind; + if (config->args_processed >= argc) { + snprintf(config->error, sizeof(config->error), "missing query name"); + return ARES_FALSE; + } + return ARES_TRUE; +} - return 0; +static void print_flags(ares_dns_flags_t flags) +{ + if (flags & ARES_FLAG_QR) { + printf(" qr"); + } + if (flags & ARES_FLAG_AA) { + printf(" aa"); + } + if (flags & ARES_FLAG_TC) { + printf(" tc"); + } + if (flags & ARES_FLAG_RD) { + printf(" rd"); + } + if (flags & ARES_FLAG_RA) { + printf(" ra"); + } + if (flags & ARES_FLAG_AD) { + printf(" ad"); + } + if (flags & ARES_FLAG_CD) { + printf(" cd"); + } } -static void callback(void *arg, int status, int timeouts, - unsigned char *abuf, int alen) +static void print_header(const ares_dns_record_t *dnsrec) { - char *name = (char *) arg; - int id, qr, opcode, aa, tc, rd, ra, rcode; - unsigned int qdcount, ancount, nscount, arcount, i; - const unsigned char *aptr; + printf(";; ->>HEADER<<- opcode: %s, status: %s, id: %u\n", + ares_dns_opcode_tostr(ares_dns_record_get_opcode(dnsrec)), + ares_dns_rcode_tostr(ares_dns_record_get_rcode(dnsrec)), + ares_dns_record_get_id(dnsrec)); + printf(";; flags:"); + print_flags(ares_dns_record_get_flags(dnsrec)); + printf("; QUERY: %u, ANSWER: %u, AUTHORITY: %u, ADDITIONAL: %u\n\n", + (unsigned int)ares_dns_record_query_cnt(dnsrec), + (unsigned int)ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER), + (unsigned int)ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_AUTHORITY), + (unsigned int)ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ADDITIONAL)); +} - (void) timeouts; +static void print_question(const ares_dns_record_t *dnsrec) +{ + size_t i; + printf(";; QUESTION SECTION:\n"); + for (i = 0; i < ares_dns_record_query_cnt(dnsrec); i++) { + const char *name; + ares_dns_rec_type_t qtype; + ares_dns_class_t qclass; + size_t len; + if (ares_dns_record_query_get(dnsrec, i, &name, &qtype, &qclass) != + ARES_SUCCESS) { + return; + } + if (name == NULL) { + return; + } + len = strlen(name); + printf(";%s.\t", name); + if (len + 1 < 24) { + printf("\t"); + } + if (len + 1 < 16) { + printf("\t"); + } + printf("%s\t%s\n", ares_dns_class_tostr(qclass), + ares_dns_rec_type_tostr(qtype)); + } + printf("\n"); +} - /* Display the query name if given. */ - if (name) - printf("Answer for query %s:\n", name); +static void print_opt_none(const unsigned char *val, size_t val_len) +{ + (void)val; + if (val_len != 0) { + printf("INVALID!"); + } +} - /* Display an error message if there was an error, but only stop if - * we actually didn't get an answer buffer. - */ - if (status != ARES_SUCCESS) - { - printf("%s\n", ares_strerror(status)); - if (!abuf) - return; +static void print_opt_addr_list(const unsigned char *val, size_t val_len) +{ + size_t i; + if (val_len % 4 != 0) { + printf("INVALID!"); + return; + } + for (i = 0; i < val_len; i += 4) { + char buf[256] = ""; + ares_inet_ntop(AF_INET, val + i, buf, sizeof(buf)); + if (i != 0) { + printf(","); } + printf("%s", buf); + } +} - /* Won't happen, but check anyway, for safety. */ - if (alen < HFIXEDSZ) +static void print_opt_addr6_list(const unsigned char *val, size_t val_len) +{ + size_t i; + if (val_len % 16 != 0) { + printf("INVALID!"); return; + } + for (i = 0; i < val_len; i += 16) { + char buf[256] = ""; - /* Parse the answer header. */ - id = DNS_HEADER_QID(abuf); - qr = DNS_HEADER_QR(abuf); - opcode = DNS_HEADER_OPCODE(abuf); - aa = DNS_HEADER_AA(abuf); - tc = DNS_HEADER_TC(abuf); - rd = DNS_HEADER_RD(abuf); - ra = DNS_HEADER_RA(abuf); - rcode = DNS_HEADER_RCODE(abuf); - qdcount = DNS_HEADER_QDCOUNT(abuf); - ancount = DNS_HEADER_ANCOUNT(abuf); - nscount = DNS_HEADER_NSCOUNT(abuf); - arcount = DNS_HEADER_ARCOUNT(abuf); - - /* Display the answer header. */ - printf("id: %d\n", id); - printf("flags: %s%s%s%s%s\n", - qr ? "qr " : "", - aa ? "aa " : "", - tc ? "tc " : "", - rd ? "rd " : "", - ra ? "ra " : ""); - printf("opcode: %s\n", opcodes[opcode]); - printf("rcode: %s\n", rcodes[rcode]); - - /* Display the questions. */ - printf("Questions:\n"); - aptr = abuf + HFIXEDSZ; - for (i = 0; i < qdcount; i++) - { - aptr = display_question(aptr, abuf, alen); - if (aptr == NULL) - return; + ares_inet_ntop(AF_INET6, val + i, buf, sizeof(buf)); + if (i != 0) { + printf(","); } + printf("%s", buf); + } +} - /* Display the answers. */ - printf("Answers:\n"); - for (i = 0; i < ancount; i++) - { - aptr = display_rr(aptr, abuf, alen); - if (aptr == NULL) - return; +static void print_opt_u8_list(const unsigned char *val, size_t val_len) +{ + size_t i; + + for (i = 0; i < val_len; i++) { + if (i != 0) { + printf(","); } + printf("%u", (unsigned int)val[i]); + } +} - /* Display the NS records. */ - printf("NS records:\n"); - for (i = 0; i < nscount; i++) - { - aptr = display_rr(aptr, abuf, alen); - if (aptr == NULL) - return; +static void print_opt_u16_list(const unsigned char *val, size_t val_len) +{ + size_t i; + if (val_len < 2 || val_len % 2 != 0) { + printf("INVALID!"); + return; + } + for (i = 0; i < val_len; i += 2) { + unsigned short u16 = 0; + unsigned short c; + /* Jumping over backwards to try to avoid odd compiler warnings */ + c = (unsigned short)val[i]; + u16 |= (unsigned short)((c << 8) & 0xFFFF); + c = (unsigned short)val[i + 1]; + u16 |= c; + if (i != 0) { + printf(","); } + printf("%u", (unsigned int)u16); + } +} - /* Display the additional records. */ - printf("Additional records:\n"); - for (i = 0; i < arcount; i++) - { - aptr = display_rr(aptr, abuf, alen); - if (aptr == NULL) - return; +static void print_opt_u32_list(const unsigned char *val, size_t val_len) +{ + size_t i; + if (val_len < 4 || val_len % 4 != 0) { + printf("INVALID!"); + return; + } + for (i = 0; i < val_len; i += 4) { + unsigned int u32 = 0; + + u32 |= (unsigned int)(val[i] << 24); + u32 |= (unsigned int)(val[i + 1] << 16); + u32 |= (unsigned int)(val[i + 2] << 8); + u32 |= (unsigned int)(val[i + 3]); + if (i != 0) { + printf(","); } + printf("%u", u32); + } } -static const unsigned char *display_question(const unsigned char *aptr, - const unsigned char *abuf, - int alen) +static void print_opt_str_list(const unsigned char *val, size_t val_len) { - char *name; - int type, dnsclass, status; - long len; + size_t cnt = 0; - /* Parse the question name. */ - status = ares_expand_name(aptr, abuf, alen, &name, &len); - if (status != ARES_SUCCESS) - return NULL; - aptr += len; + printf("\""); + while (val_len) { + long read_len = 0; + unsigned char *str = NULL; + ares_status_t status; - /* Make sure there's enough data after the name for the fixed part - * of the question. - */ - if (aptr + QFIXEDSZ > abuf + alen) - { - ares_free_string(name); - return NULL; + if (cnt) { + printf(","); } - /* Parse the question type and class. */ - type = DNS_QUESTION_TYPE(aptr); - dnsclass = DNS_QUESTION_CLASS(aptr); - aptr += QFIXEDSZ; - - /* Display the question, in a format sort of similar to how we will - * display RRs. - */ - printf("\t%-15s.\t", name); - if (dnsclass != C_IN) - printf("\t%s", class_name(dnsclass)); - printf("\t%s\n", type_name(type)); - ares_free_string(name); - return aptr; -} - -static const unsigned char *display_rr(const unsigned char *aptr, - const unsigned char *abuf, int alen) -{ - const unsigned char *p; - int type, dnsclass, ttl, dlen, status, i; - long len; - int vlen; - char addr[46]; - union { - unsigned char * as_uchar; - char * as_char; - } name; - - /* Parse the RR name. */ - status = ares_expand_name(aptr, abuf, alen, &name.as_char, &len); - if (status != ARES_SUCCESS) - return NULL; - aptr += len; - - /* Make sure there is enough data after the RR name for the fixed - * part of the RR. - */ - if (aptr + RRFIXEDSZ > abuf + alen) - { - ares_free_string(name.as_char); - return NULL; + status = (ares_status_t)ares_expand_string(val, val, (int)val_len, &str, + &read_len); + if (status != ARES_SUCCESS) { + printf("INVALID"); + break; } + printf("%s", str); + ares_free_string(str); + val_len -= (size_t)read_len; + val += read_len; + cnt++; + } + printf("\""); +} - /* Parse the fixed part of the RR, and advance to the RR data - * field. */ - type = DNS_RR_TYPE(aptr); - dnsclass = DNS_RR_CLASS(aptr); - ttl = DNS_RR_TTL(aptr); - dlen = DNS_RR_LEN(aptr); - aptr += RRFIXEDSZ; - if (aptr + dlen > abuf + alen) - { - ares_free_string(name.as_char); - return NULL; +static void print_opt_name(const unsigned char *val, size_t val_len) +{ + char *str = NULL; + long read_len = 0; + + if (ares_expand_name(val, val, (int)val_len, &str, &read_len) != + ARES_SUCCESS) { + printf("INVALID!"); + return; + } + + printf("%s.", str); + ares_free_string(str); +} + +static void print_opt_bin(const unsigned char *val, size_t val_len) +{ + size_t i; + + for (i = 0; i < val_len; i++) { + printf("%02x", (unsigned int)val[i]); + } +} + +static ares_bool_t adig_isprint(int ch) +{ + if (ch >= 0x20 && ch <= 0x7E) { + return ARES_TRUE; + } + return ARES_FALSE; +} + +static void print_opt_binp(const unsigned char *val, size_t val_len) +{ + size_t i; + printf("\""); + for (i = 0; i < val_len; i++) { + if (adig_isprint(val[i])) { + printf("%c", val[i]); + } else { + printf("\\%03d", val[i]); } + } + printf("\""); +} - /* Display the RR name, class, and type. */ - printf("\t%-15s.\t%d", name.as_char, ttl); - if (dnsclass != C_IN) - printf("\t%s", class_name(dnsclass)); - printf("\t%s", type_name(type)); - ares_free_string(name.as_char); - - /* Display the RR data. Don't touch aptr. */ - switch (type) - { - case T_CNAME: - case T_MB: - case T_MD: - case T_MF: - case T_MG: - case T_MR: - case T_NS: - case T_PTR: - /* For these types, the RR data is just a domain name. */ - status = ares_expand_name(aptr, abuf, alen, &name.as_char, &len); - if (status != ARES_SUCCESS) - return NULL; - printf("\t%s.", name.as_char); - ares_free_string(name.as_char); - break; +static void print_opts(const ares_dns_rr_t *rr, ares_dns_rr_key_t key) +{ + size_t i; - case T_HINFO: - /* The RR data is two length-counted character strings. */ - p = aptr; - len = *p; - if (p + len + 1 > aptr + dlen) - return NULL; - status = ares_expand_string(p, abuf, alen, &name.as_uchar, &len); - if (status != ARES_SUCCESS) - return NULL; - printf("\t%s", name.as_char); - ares_free_string(name.as_char); - p += len; - len = *p; - if (p + len + 1 > aptr + dlen) - return NULL; - status = ares_expand_string(p, abuf, alen, &name.as_uchar, &len); - if (status != ARES_SUCCESS) - return NULL; - printf("\t%s", name.as_char); - ares_free_string(name.as_char); - break; + for (i = 0; i < ares_dns_rr_get_opt_cnt(rr, key); i++) { + size_t val_len = 0; + const unsigned char *val = NULL; + unsigned short opt; + const char *name; - case T_MINFO: - /* The RR data is two domain names. */ - p = aptr; - status = ares_expand_name(p, abuf, alen, &name.as_char, &len); - if (status != ARES_SUCCESS) - return NULL; - printf("\t%s.", name.as_char); - ares_free_string(name.as_char); - p += len; - status = ares_expand_name(p, abuf, alen, &name.as_char, &len); - if (status != ARES_SUCCESS) - return NULL; - printf("\t%s.", name.as_char); - ares_free_string(name.as_char); - break; + if (i != 0) { + printf(" "); + } - case T_MX: - /* The RR data is two bytes giving a preference ordering, and - * then a domain name. - */ - if (dlen < 2) - return NULL; - printf("\t%d", (int)DNS__16BIT(aptr)); - status = ares_expand_name(aptr + 2, abuf, alen, &name.as_char, &len); - if (status != ARES_SUCCESS) - return NULL; - printf("\t%s.", name.as_char); - ares_free_string(name.as_char); - break; + opt = ares_dns_rr_get_opt(rr, key, i, &val, &val_len); + name = ares_dns_opt_get_name(key, opt); + if (name == NULL) { + printf("key%u", (unsigned int)opt); + } else { + printf("%s", name); + } + if (val_len == 0) { + return; + } - case T_SOA: - /* The RR data is two domain names and then five four-byte - * numbers giving the serial number and some timeouts. - */ - p = aptr; - status = ares_expand_name(p, abuf, alen, &name.as_char, &len); - if (status != ARES_SUCCESS) - return NULL; - printf("\t%s.\n", name.as_char); - ares_free_string(name.as_char); - p += len; - status = ares_expand_name(p, abuf, alen, &name.as_char, &len); - if (status != ARES_SUCCESS) - return NULL; - printf("\t\t\t\t\t\t%s.\n", name.as_char); - ares_free_string(name.as_char); - p += len; - if (p + 20 > aptr + dlen) - return NULL; - printf("\t\t\t\t\t\t( %u %u %u %u %u )", - DNS__32BIT(p), DNS__32BIT(p+4), - DNS__32BIT(p+8), DNS__32BIT(p+12), - DNS__32BIT(p+16)); - break; + printf("="); - case T_TXT: - /* The RR data is one or more length-counted character - * strings. */ - p = aptr; - while (p < aptr + dlen) - { - len = *p; - if (p + len + 1 > aptr + dlen) - return NULL; - status = ares_expand_string(p, abuf, alen, &name.as_uchar, &len); - if (status != ARES_SUCCESS) - return NULL; - printf("\t%s", name.as_char); - ares_free_string(name.as_char); - p += len; - } - break; + switch (ares_dns_opt_get_datatype(key, opt)) { + case ARES_OPT_DATATYPE_NONE: + print_opt_none(val, val_len); + break; + case ARES_OPT_DATATYPE_U8_LIST: + print_opt_u8_list(val, val_len); + break; + case ARES_OPT_DATATYPE_INADDR4_LIST: + print_opt_addr_list(val, val_len); + break; + case ARES_OPT_DATATYPE_INADDR6_LIST: + print_opt_addr6_list(val, val_len); + break; + case ARES_OPT_DATATYPE_U16: + case ARES_OPT_DATATYPE_U16_LIST: + print_opt_u16_list(val, val_len); + break; + case ARES_OPT_DATATYPE_U32: + case ARES_OPT_DATATYPE_U32_LIST: + print_opt_u32_list(val, val_len); + break; + case ARES_OPT_DATATYPE_STR_LIST: + print_opt_str_list(val, val_len); + break; + case ARES_OPT_DATATYPE_BIN: + print_opt_bin(val, val_len); + break; + case ARES_OPT_DATATYPE_NAME: + print_opt_name(val, val_len); + break; + } + } +} - case T_CAA: +static void print_addr(const ares_dns_rr_t *rr, ares_dns_rr_key_t key) +{ + const struct in_addr *addr = ares_dns_rr_get_addr(rr, key); + char buf[256] = ""; - p = aptr; + ares_inet_ntop(AF_INET, addr, buf, sizeof(buf)); + printf("%s", buf); +} - /* Flags */ - printf(" %u", (int)*p); - p += 1; +static void print_addr6(const ares_dns_rr_t *rr, ares_dns_rr_key_t key) +{ + const struct ares_in6_addr *addr = ares_dns_rr_get_addr6(rr, key); + char buf[256] = ""; - /* Remainder of record */ - vlen = (int)dlen - ((char)*p) - 2; + ares_inet_ntop(AF_INET6, addr, buf, sizeof(buf)); + printf("%s", buf); +} - /* The Property identifier, one of: - - "issue", - - "iodef", or - - "issuewild" */ - status = ares_expand_string(p, abuf, alen, &name.as_uchar, &len); - if (status != ARES_SUCCESS) - return NULL; - printf(" %s", name.as_char); - ares_free_string(name.as_char); - p += len; +static void print_u8(const ares_dns_rr_t *rr, ares_dns_rr_key_t key) +{ + unsigned char u8 = ares_dns_rr_get_u8(rr, key); + printf("%u", (unsigned int)u8); +} - if (p + vlen > abuf + alen) - return NULL; +static void print_u16(const ares_dns_rr_t *rr, ares_dns_rr_key_t key) +{ + unsigned short u16 = ares_dns_rr_get_u16(rr, key); + printf("%u", (unsigned int)u16); +} - /* A sequence of octets representing the Property Value */ - printf(" %.*s", vlen, p); - break; +static void print_u32(const ares_dns_rr_t *rr, ares_dns_rr_key_t key) +{ + unsigned int u32 = ares_dns_rr_get_u32(rr, key); + printf("%u", u32); +} - case T_A: - /* The RR data is a four-byte Internet address. */ - if (dlen != 4) - return NULL; - printf("\t%s", ares_inet_ntop(AF_INET,aptr,addr,sizeof(addr))); - break; +static void print_name(const ares_dns_rr_t *rr, ares_dns_rr_key_t key) +{ + const char *str = ares_dns_rr_get_str(rr, key); + printf("%s.", str); +} - case T_AAAA: - /* The RR data is a 16-byte IPv6 address. */ - if (dlen != 16) - return NULL; - printf("\t%s", ares_inet_ntop(AF_INET6,aptr,addr,sizeof(addr))); - break; +static void print_str(const ares_dns_rr_t *rr, ares_dns_rr_key_t key) +{ + const char *str = ares_dns_rr_get_str(rr, key); + printf("\"%s\"", str); +} - case T_WKS: - /* Not implemented yet */ - break; +static void print_bin(const ares_dns_rr_t *rr, ares_dns_rr_key_t key) +{ + size_t len = 0; + const unsigned char *binp = ares_dns_rr_get_bin(rr, key, &len); + print_opt_bin(binp, len); +} - case T_SRV: - /* The RR data is three two-byte numbers representing the - * priority, weight, and port, followed by a domain name. - */ +static void print_binp(const ares_dns_rr_t *rr, ares_dns_rr_key_t key) +{ + size_t len; + const unsigned char *binp = ares_dns_rr_get_bin(rr, key, &len); - printf("\t%d", (int)DNS__16BIT(aptr)); - printf(" %d", (int)DNS__16BIT(aptr + 2)); - printf(" %d", (int)DNS__16BIT(aptr + 4)); + print_opt_binp(binp, len); +} - status = ares_expand_name(aptr + 6, abuf, alen, &name.as_char, &len); - if (status != ARES_SUCCESS) - return NULL; - printf("\t%s.", name.as_char); - ares_free_string(name.as_char); - break; +static void print_rr(const ares_dns_rr_t *rr) +{ + const char *name = ares_dns_rr_get_name(rr); + size_t len = 0; + size_t keys_cnt = 0; + ares_dns_rec_type_t rtype = ares_dns_rr_get_type(rr); + const ares_dns_rr_key_t *keys = ares_dns_rr_get_keys(rtype, &keys_cnt); + size_t i; + + if (name == NULL) { + return; + } - case T_URI: - /* The RR data is two two-byte numbers representing the - * priority and weight, followed by a target. - */ + len = strlen(name); - printf("\t%d ", (int)DNS__16BIT(aptr)); - printf("%d \t\t", (int)DNS__16BIT(aptr+2)); - p = aptr +4; - for (i=0; i "d.c.b.a".in-addr.arpa" for an IPv4 address. - * "a.b.c....x.y.z" -> "z.y.x....c.d.e.IP6.ARPA" for an IPv6 address. - * - * An example from 'dig -x PTR 2001:470:1:1b9::31': - * - * QUESTION SECTION: - * 1.3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.9.b.1.0.1.0.0.0.0.7.4.0.1.0.0.2.IP6.ARPA. IN PTR - * - * ANSWER SECTION: - * 1.3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.9.b.1.0.1.0.0.0.0.7.4.0.1.0.0.2.IP6.ARPA. 254148 IN PTR ipv6.cybernode.com. - * - * If 'use_bitstring == 1', try to use the more compact RFC-2673 bitstring format. - * Thus the above 'dig' query should become: - * [x13000000000000009b10100007401002].IP6.ARPA. IN PTR - */ -static int convert_query (char **name_p, int use_bitstring) +static const ares_dns_rr_t *has_opt(ares_dns_record_t *dnsrec, + ares_dns_section_t section) { -#ifndef MAX_IP6_RR -#define MAX_IP6_RR (16*sizeof(".x.x") + sizeof(".IP6.ARPA") + 1) -#endif + size_t i; + for (i = 0; i < ares_dns_record_rr_cnt(dnsrec, section); i++) { + const ares_dns_rr_t *rr = ares_dns_record_rr_get(dnsrec, section, i); + if (ares_dns_rr_get_type(rr) == ARES_REC_TYPE_OPT) { + return rr; + } + } + return NULL; +} -#ifdef HAVE_INET_PTON - #define ACCEPTED_RETVAL4 1 - #define ACCEPTED_RETVAL6 1 -#else - #define ACCEPTED_RETVAL4 32 - #define ACCEPTED_RETVAL6 128 -#endif +static void print_section(ares_dns_record_t *dnsrec, ares_dns_section_t section) +{ + size_t i; - static char new_name [MAX_IP6_RR]; - static const char hex_chars[] = "0123456789ABCDEF"; - - union { - struct in_addr addr4; - struct ares_in6_addr addr6; - } addr; - - if (ares_inet_pton (AF_INET, *name_p, &addr.addr4) == 1) - { - unsigned long laddr = ntohl(addr.addr4.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(new_name, sizeof(new_name), "%lu.%lu.%lu.%lu.in-addr.arpa", a4, a3, a2, a1); - *name_p = new_name; - return (1); - } + if (ares_dns_record_rr_cnt(dnsrec, section) == 0 || + (ares_dns_record_rr_cnt(dnsrec, section) == 1 && + has_opt(dnsrec, section) != NULL)) { + return; + } - if (ares_inet_pton(AF_INET6, *name_p, &addr.addr6) == 1) - { - char *c = new_name; - const unsigned char *ip = (const unsigned char*) &addr.addr6; - int max_i = (int)sizeof(addr.addr6) - 1; - int i, hi, lo; - - /* Use the more compact RFC-2673 notation? - * Currently doesn't work or unsupported by the DNS-servers I've tested against. - */ - if (use_bitstring) - { - *c++ = '\\'; - *c++ = '['; - *c++ = 'x'; - for (i = max_i; i >= 0; i--) - { - hi = ip[i] >> 4; - lo = ip[i] & 15; - *c++ = hex_chars [lo]; - *c++ = hex_chars [hi]; - } - strcpy (c, "].IP6.ARPA"); - } - else - { - for (i = max_i; i >= 0; i--) - { - hi = ip[i] >> 4; - lo = ip[i] & 15; - *c++ = hex_chars [lo]; - *c++ = '.'; - *c++ = hex_chars [hi]; - *c++ = '.'; - } - strcpy (c, "IP6.ARPA"); - } - *name_p = new_name; - return (1); + printf(";; %s SECTION:\n", ares_dns_section_tostr(section)); + for (i = 0; i < ares_dns_record_rr_cnt(dnsrec, section); i++) { + const ares_dns_rr_t *rr = ares_dns_record_rr_get(dnsrec, section, i); + if (ares_dns_rr_get_type(rr) == ARES_REC_TYPE_OPT) { + continue; } - printf("Address %s was not legal for this query.\n", *name_p); - return (0); + print_rr(rr); + } + printf("\n"); } -static const char *type_name(int type) +static void print_opt_psuedosection(ares_dns_record_t *dnsrec) { - int i; + const ares_dns_rr_t *rr = has_opt(dnsrec, ARES_SECTION_ADDITIONAL); + if (rr == NULL) { + return; + } - for (i = 0; i < ntypes; i++) - { - if (types[i].value == type) - return types[i].name; - } - return "(unknown)"; + printf(";; OPT PSEUDOSECTION:\n"); + printf("; EDNS: version: %u, flags: %u; udp: %u\t", + (unsigned int)ares_dns_rr_get_u8(rr, ARES_RR_OPT_VERSION), + (unsigned int)ares_dns_rr_get_u16(rr, ARES_RR_OPT_FLAGS), + (unsigned int)ares_dns_rr_get_u16(rr, ARES_RR_OPT_UDP_SIZE)); + + printf("\n"); } -static const char *class_name(int dnsclass) +static void callback(void *arg, int status, int timeouts, unsigned char *abuf, + int alen) { - int i; + ares_dns_record_t *dnsrec = NULL; + (void)arg; + (void)timeouts; + + printf(";; Got answer:"); + if (status != ARES_SUCCESS) { + printf(" %s", ares_strerror(status)); + } + printf("\n"); - for (i = 0; i < nclasses; i++) - { - if (classes[i].value == dnsclass) - return classes[i].name; - } - return "(unknown)"; + if (abuf == NULL || alen == 0) { + return; + } + + status = (int)ares_dns_parse(abuf, (size_t)alen, 0, &dnsrec); + if (status != ARES_SUCCESS) { + fprintf(stderr, ";; FAILED TO PARSE DNS PACKET: %s\n", + ares_strerror(status)); + return; + } + + print_header(dnsrec); + print_opt_psuedosection(dnsrec); + print_question(dnsrec); + print_section(dnsrec, ARES_SECTION_ANSWER); + print_section(dnsrec, ARES_SECTION_ADDITIONAL); + print_section(dnsrec, ARES_SECTION_AUTHORITY); + + printf(";; MSG SIZE rcvd: %d\n\n", alen); + ares_dns_record_destroy(dnsrec); } -static void usage(void) +static ares_status_t enqueue_query(ares_channel_t *channel, + const adig_config_t *config, + const char *name) { - fprintf(stderr, "usage: adig [-h] [-d] [-f flag] [-s server] [-c class] " - "[-t type] [-T|U port] [-x|-xx] name ...\n"); - exit(1); + ares_dns_record_t *dnsrec = NULL; + ares_dns_rr_t *rr = NULL; + ares_status_t status; + unsigned char *buf = NULL; + size_t buf_len = 0; + unsigned short flags = 0; + char *nametemp = NULL; + + if (!(config->options.flags & ARES_FLAG_NORECURSE)) { + flags |= ARES_FLAG_RD; + } + + status = ares_dns_record_create(&dnsrec, 0, flags, ARES_OPCODE_QUERY, + ARES_RCODE_NOERROR); + if (status != ARES_SUCCESS) { + goto done; + } + + /* If it is a PTR record, convert from ip address into in-arpa form + * automatically */ + if (config->qtype == ARES_REC_TYPE_PTR) { + struct ares_addr addr; + size_t len; + addr.family = AF_UNSPEC; + + if (ares_dns_pton(name, &addr, &len) != NULL) { + nametemp = ares_dns_addr_to_ptr(&addr); + name = nametemp; + } + } + + status = + ares_dns_record_query_add(dnsrec, name, config->qtype, config->qclass); + if (status != ARES_SUCCESS) { + 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; + } + ares_dns_rr_set_u16(rr, ARES_RR_OPT_UDP_SIZE, 1280); + ares_dns_rr_set_u8(rr, ARES_RR_OPT_VERSION, 0); + + status = ares_dns_write(dnsrec, &buf, &buf_len); + if (status != ARES_SUCCESS) { + goto done; + } + + ares_send(channel, buf, (int)buf_len, callback, NULL); + ares_free_string(buf); + +done: + ares_free_string(nametemp); + ares_dns_record_destroy(dnsrec); + return status; } -static void destroy_addr_list(struct ares_addr_node *head) +static int event_loop(ares_channel_t *channel) { - while(head) - { - struct ares_addr_node *detached = head; - head = head->next; - free(detached); + while (1) { + fd_set read_fds; + fd_set write_fds; + int nfds; + struct timeval tv; + struct timeval *tvp; + int count; + + FD_ZERO(&read_fds); + FD_ZERO(&write_fds); + memset(&tv, 0, sizeof(tv)); + + nfds = ares_fds(channel, &read_fds, &write_fds); + if (nfds == 0) { + break; + } + tvp = ares_timeout(channel, NULL, &tv); + if (tvp == NULL) { + break; + } + count = select(nfds, &read_fds, &write_fds, NULL, tvp); + if (count < 0) { +#ifdef USE_WINSOCK + int err = WSAGetLastError(); +#else + int err = errno; +#endif + if (err != EAGAIN && err != EINTR) { + fprintf(stderr, "select fail: %d", err); + return 1; + } } + ares_process(channel, &read_fds, &write_fds); + } + return 0; } -static void append_addr_list(struct ares_addr_node **head, - struct ares_addr_node *node) +int main(int argc, char **argv) { - struct ares_addr_node *last; - node->next = NULL; - if(*head) - { - last = *head; - while(last->next) - last = last->next; - last->next = node; + ares_channel_t *channel = NULL; + ares_status_t status; + adig_config_t config; + int i; + int rv = 0; + +#ifdef USE_WINSOCK + WORD wVersionRequested = MAKEWORD(USE_WINSOCK, USE_WINSOCK); + WSADATA wsaData; + WSAStartup(wVersionRequested, &wsaData); +#endif + + status = (ares_status_t)ares_library_init(ARES_LIB_INIT_ALL); + if (status != ARES_SUCCESS) { + fprintf(stderr, "ares_library_init: %s\n", ares_strerror((int)status)); + return 1; + } + + memset(&config, 0, sizeof(config)); + config.qclass = ARES_CLASS_IN; + config.qtype = ARES_REC_TYPE_A; + if (!read_cmdline(argc, (const char **)argv, &config)) { + printf("\n** ERROR: %s\n\n", config.error); + print_help(); + rv = 1; + goto done; + } + + if (config.is_help) { + print_help(); + goto done; + } + + status = + (ares_status_t)ares_init_options(&channel, &config.options, config.optmask); + if (status != ARES_SUCCESS) { + fprintf(stderr, "ares_init_options: %s\n", ares_strerror((int)status)); + rv = 1; + goto done; + } + + if (config.servers) { + status = (ares_status_t)ares_set_servers_ports_csv(channel, config.servers); + if (status != ARES_SUCCESS) { + fprintf(stderr, "ares_set_servers_ports_csv: %s\n", + ares_strerror((int)status)); + rv = 1; + goto done; } - else - *head = node; -} - - -/* Information from the man page. Formatting taken from man -h */ -static void print_help_info_adig(void) { - printf("adig, version %s\n\n", ARES_VERSION_STR); - printf("usage: adig [-h] [-d] [-f flag] [[-s server] ...] [-T|U port] [-c class] [-t type] [-x|-xx] name ...\n\n" - " h : Display this help and exit.\n" - " d : Print some extra debugging output.\n\n" - " f flag : Add a behavior control flag. Possible values are\n" - " igntc - ignore to query in TCP to get truncated UDP answer,\n" - " noaliases - don't honor the HOSTALIASES environment variable,\n" - " norecurse - don't query upstream servers recursively,\n" - " primary - use the first server,\n" - " stayopen - don't close the communication sockets, and\n" - " usevc - use TCP only.\n" - " s server : Connect to the specified DNS server, instead of the system's default one(s).\n" - " Servers are tried in round-robin, if the previous one failed.\n" - " T port : Connect to the specified TCP port of DNS server.\n" - " U port : Connect to the specified UDP port of DNS server.\n" - " c class : Set the query class. Possible values for class are ANY, CHAOS, HS and IN (default)\n" - " t type : Query records of the specified type.\n" - " Possible values for type are A (default), AAAA, AFSDB, ANY, AXFR,\n" - " CNAME, GPOS, HINFO, ISDN, KEY, LOC, MAILA, MAILB, MB, MD, MF, MG,\n" - " MINFO, MR, MX, NAPTR, NS, NSAP, NSAP_PTR, NULL, PTR, PX, RP, RT,\n" - " SIG, SOA, SRV, TXT, URI, WKS and X25.\n\n" - " -x : For a '-t PTR a.b.c.d' lookup, query for 'd.c.b.a.in-addr.arpa.'\n" - " -xx : As above, but for IPv6, compact the format into a bitstring like\n" - " '[xabcdef00000000000000000000000000].IP6.ARPA.'\n"); - exit(0); + } + + /* Enqueue a query for each separate name */ + for (i = config.args_processed; i < argc; i++) { + status = enqueue_query(channel, &config, argv[i]); + if (status != ARES_SUCCESS) { + fprintf(stderr, "Failed to create query for %s: %s\n", argv[i], + ares_strerror((int)status)); + rv = 1; + goto done; + } + } + + /* Debug */ + printf("\n; <<>> c-ares DiG %s <<>>", ares_version(NULL)); + for (i = config.args_processed; i < argc; i++) { + printf(" %s", argv[i]); + } + printf("\n"); + + /* Process events */ + rv = event_loop(channel); + +done: + free_config(&config); + ares_destroy(channel); + ares_library_cleanup(); + +#ifdef USE_WINSOCK + WSACleanup(); +#endif + return rv; } diff --git a/deps/cares/src/tools/ahost.c b/deps/cares/src/tools/ahost.c index f8a39eb4630e55..1f293fc6beb285 100644 --- a/deps/cares/src/tools/ahost.c +++ b/deps/cares/src/tools/ahost.c @@ -28,20 +28,19 @@ #include "ares_setup.h" #if !defined(WIN32) || defined(WATT32) -#include -#include -#include +# include +# include +# include #endif #ifdef HAVE_STRINGS_H -#include +# include #endif #include "ares.h" #include "ares_dns.h" #include "ares_getopt.h" #include "ares_ipv6.h" -#include "ares_nowarn.h" #ifndef HAVE_STRDUP # include "ares_strdup.h" @@ -50,31 +49,37 @@ #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 static void callback(void *arg, int status, int timeouts, struct hostent *host); static void usage(void); static void print_help_info_ahost(void); -int main(int argc, char **argv) +int main(int argc, char **argv) { - struct ares_options options; - int optmask = 0; - ares_channel channel; - int status, nfds, c, addr_family = AF_INET; - fd_set read_fds, write_fds; - struct timeval *tvp, tv; - struct in_addr addr4; + struct ares_options options; + int optmask = 0; + ares_channel_t *channel; + int status; + int nfds; + int c; + int addr_family = AF_INET; + fd_set read_fds; + fd_set write_fds; + struct timeval *tvp; + struct timeval tv; + struct in_addr addr4; struct ares_in6_addr addr6; + ares_getopt_state_t state; #ifdef USE_WINSOCK - WORD wVersionRequested = MAKEWORD(USE_WINSOCK,USE_WINSOCK); + WORD wVersionRequested = MAKEWORD(USE_WINSOCK, USE_WINSOCK); WSADATA wsaData; WSAStartup(wVersionRequested, &wsaData); #endif @@ -82,96 +87,93 @@ int main(int argc, char **argv) memset(&options, 0, sizeof(options)); status = ares_library_init(ARES_LIB_INIT_ALL); - if (status != ARES_SUCCESS) - { - fprintf(stderr, "ares_library_init: %s\n", ares_strerror(status)); - return 1; - } - - while ((c = ares_getopt(argc,argv,"dt:h?s:")) != -1) - { - switch (c) - { - case 'd': + if (status != ARES_SUCCESS) { + fprintf(stderr, "ares_library_init: %s\n", ares_strerror(status)); + return 1; + } + + ares_getopt_init(&state, argc, (const char **)argv); + while ((c = ares_getopt(&state, "dt:h?s:")) != -1) { + switch (c) { + case 'd': #ifdef WATT32 - dbug_init(); + dbug_init(); #endif - break; - case 's': - optmask |= ARES_OPT_DOMAINS; - options.ndomains++; - options.domains = (char **)realloc(options.domains, - options.ndomains * sizeof(char *)); - options.domains[options.ndomains - 1] = strdup(optarg); - break; - case 't': - if (!strcasecmp(optarg,"a")) - addr_family = AF_INET; - else if (!strcasecmp(optarg,"aaaa")) - addr_family = AF_INET6; - else if (!strcasecmp(optarg,"u")) - addr_family = AF_UNSPEC; - else - usage(); - break; - case 'h': - print_help_info_ahost(); - break; - case '?': - print_help_info_ahost(); - break; - default: + break; + case 's': + optmask |= ARES_OPT_DOMAINS; + options.ndomains++; + options.domains = (char **)realloc( + options.domains, (size_t)options.ndomains * sizeof(char *)); + options.domains[options.ndomains - 1] = strdup(state.optarg); + break; + case 't': + if (!strcasecmp(state.optarg, "a")) { + addr_family = AF_INET; + } else if (!strcasecmp(state.optarg, "aaaa")) { + addr_family = AF_INET6; + } else if (!strcasecmp(state.optarg, "u")) { + addr_family = AF_UNSPEC; + } else { usage(); - break; } + break; + case 'h': + print_help_info_ahost(); + break; + case '?': + print_help_info_ahost(); + break; + default: + usage(); + break; } + } - argc -= optind; - argv += optind; - if (argc < 1) + argc -= state.optind; + argv += state.optind; + if (argc < 1) { usage(); + } status = ares_init_options(&channel, &options, optmask); - if (status != ARES_SUCCESS) - { - fprintf(stderr, "ares_init: %s\n", ares_strerror(status)); - return 1; - } + if (status != ARES_SUCCESS) { + fprintf(stderr, "ares_init: %s\n", ares_strerror(status)); + return 1; + } /* Initiate the queries, one per command-line argument. */ - for ( ; *argv; argv++) - { - if (ares_inet_pton(AF_INET, *argv, &addr4) == 1) - { - ares_gethostbyaddr(channel, &addr4, sizeof(addr4), AF_INET, callback, - *argv); - } - else if (ares_inet_pton(AF_INET6, *argv, &addr6) == 1) - { - ares_gethostbyaddr(channel, &addr6, sizeof(addr6), AF_INET6, callback, - *argv); - } - else - { - ares_gethostbyname(channel, *argv, addr_family, callback, *argv); - } + for (; *argv; argv++) { + if (ares_inet_pton(AF_INET, *argv, &addr4) == 1) { + ares_gethostbyaddr(channel, &addr4, sizeof(addr4), AF_INET, callback, + *argv); + } else if (ares_inet_pton(AF_INET6, *argv, &addr6) == 1) { + ares_gethostbyaddr(channel, &addr6, sizeof(addr6), AF_INET6, callback, + *argv); + } else { + ares_gethostbyname(channel, *argv, addr_family, callback, *argv); } + } /* Wait for all queries to complete. */ - for (;;) - { - int res; - FD_ZERO(&read_fds); - FD_ZERO(&write_fds); - nfds = ares_fds(channel, &read_fds, &write_fds); - if (nfds == 0) - break; - tvp = ares_timeout(channel, NULL, &tv); - res = select(nfds, &read_fds, &write_fds, NULL, tvp); - if (-1 == res) - break; - ares_process(channel, &read_fds, &write_fds); + for (;;) { + int res; + FD_ZERO(&read_fds); + FD_ZERO(&write_fds); + nfds = ares_fds(channel, &read_fds, &write_fds); + if (nfds == 0) { + break; } + tvp = ares_timeout(channel, NULL, &tv); + if (tvp == NULL) { + break; + } + res = select(nfds, &read_fds, &write_fds, NULL, tvp); + if (-1 == res) { + break; + } + ares_process(channel, &read_fds, &write_fds); + } ares_destroy(channel); @@ -190,18 +192,16 @@ static void callback(void *arg, int status, int timeouts, struct hostent *host) (void)timeouts; - if (status != ARES_SUCCESS) - { - fprintf(stderr, "%s: %s\n", (char *) arg, ares_strerror(status)); - return; - } + if (status != ARES_SUCCESS) { + fprintf(stderr, "%s: %s\n", (char *)arg, ares_strerror(status)); + return; + } - for (p = host->h_addr_list; *p; p++) - { - char addr_buf[46] = "??"; + for (p = host->h_addr_list; *p; p++) { + char addr_buf[46] = "??"; - ares_inet_ntop(host->h_addrtype, *p, addr_buf, sizeof(addr_buf)); - printf("%-32s\t%s", host->h_name, addr_buf); + ares_inet_ntop(host->h_addrtype, *p, addr_buf, sizeof(addr_buf)); + printf("%-32s\t%s", host->h_name, addr_buf); #if 0 if (host->h_aliases[0]) { @@ -212,28 +212,36 @@ static void callback(void *arg, int status, int timeouts, struct hostent *host) printf("%s ", host->h_aliases[i]); } #endif - puts(""); - } + puts(""); + } } static void usage(void) { - fprintf(stderr, "usage: ahost [-h] [-d] [-s {domain}] [-t {a|aaaa|u}] {host|addr} ...\n"); + fprintf( + stderr, + "usage: ahost [-h] [-d] [-s {domain}] [-t {a|aaaa|u}] {host|addr} ...\n"); exit(1); } /* Information from the man page. Formatting taken from man -h */ -static void print_help_info_ahost(void) { - printf("ahost, version %s\n\n", ARES_VERSION_STR); - printf("usage: ahost [-h] [-d] [[-s domain] ...] [-t a|aaaa|u] host|addr ...\n\n" +static void print_help_info_ahost(void) +{ + printf("ahost, version %s\n\n", ARES_VERSION_STR); + printf( + "usage: ahost [-h] [-d] [[-s domain] ...] [-t a|aaaa|u] host|addr ...\n\n" " h : Display this help and exit.\n" " d : Print some extra debugging output.\n\n" - " s domain : Specify the domain to search instead of using the default values\n" + " s domain : Specify the domain to search instead of using the default " + "values\n" " from /etc/resolv.conf. This option only has an effect on\n" - " platforms that use /etc/resolv.conf for DNS configuration;\n" - " it has no effect on other platforms (such as Win32 or Android).\n\n" + " platforms that use /etc/resolv.conf for DNS " + "configuration;\n" + " it has no effect on other platforms (such as Win32 or " + "Android).\n\n" " t type : If type is \"a\", print the A record (default).\n" " If type is \"aaaa\", print the AAAA record.\n" - " If type is \"u\", look for either AAAA or A record (in that order).\n\n"); - exit(0); -} + " If type is \"u\", look for either AAAA or A record (in " + "that order).\n\n"); + exit(0); +} diff --git a/deps/cares/src/tools/ares_getopt.c b/deps/cares/src/tools/ares_getopt.c index f7154398aeae1a..ad0b8ae8826c85 100644 --- a/deps/cares/src/tools/ares_getopt.c +++ b/deps/cares/src/tools/ares_getopt.c @@ -40,85 +40,98 @@ * SPDX-License-Identifier: BSD-3-Clause */ -/* #if !defined(lint) - * static char sccsid[] = "@(#)getopt.c 8.2 (Berkeley) 4/2/94"; - * #endif - */ - #include #include #include #include "ares_getopt.h" -int opterr = 1, /* if error message should be printed */ - optind = 1; /* index into parent argv vector */ -int optopt = 0; /* character checked for validity */ -static int optreset; /* reset getopt */ -char *optarg; /* argument associated with option */ +#define BADCH (int)'?' +#define BADARG (int)':' +#define EMSG (char *)"" -#define BADCH (int)'?' -#define BADARG (int)':' -#define EMSG (char *)"" +void ares_getopt_init(ares_getopt_state_t *state, int nargc, const char **nargv) +{ + memset(state, 0, sizeof(*state)); + state->opterr = 1; + state->optind = 1; + state->place = EMSG; + state->argc = nargc; + state->argv = nargv; +} /* * ares_getopt -- * Parse argc/argv argument vector. */ -int -ares_getopt(int nargc, char * const nargv[], const char *ostr) +int ares_getopt(ares_getopt_state_t *state, const char *ostr) { - static char *place = EMSG; /* option letter processing */ - char *oli; /* option letter list index */ + const char *oli; /* option letter list index */ + + /* update scanning pointer */ + if (!*state->place) { + if (state->optind >= state->argc) { + return -1; + } + state->place = state->argv[state->optind]; + if (*(state->place) != '-') { + return -1; + } + state->place++; - if (optreset || !*place) { /* update scanning pointer */ - optreset = 0; - if (optind >= nargc || *(place = nargv[optind]) != '-') { - place = EMSG; - return (EOF); - } - if (place[1] && *++place == '-') { /* found "--" */ - ++optind; - place = EMSG; - return (EOF); - } - } /* option letter okay? */ - if ((optopt = (int)*place++) == (int)':' || - (oli = strchr(ostr, optopt)) == NULL) { - /* - * if the user didn't specify '-' as an option, - * assume it means EOF. - */ - if (optopt == (int)'-') - return (EOF); - if (!*place) - ++optind; - if (opterr && *ostr != ':') - (void)fprintf(stderr, - "%s: illegal option -- %c\n", __FILE__, optopt); - return (BADCH); + /* found "--" */ + if (*(state->place) == '-') { + state->optind++; + return -1; } - if (*++oli != ':') { /* don't need argument */ - optarg = NULL; - if (!*place) - ++optind; + + /* Found just - */ + if (!*(state->place)) { + state->optopt = 0; + return BADCH; + } + } + + /* option letter okay? */ + state->optopt = *(state->place); + state->place++; + oli = strchr(ostr, state->optopt); + + if (oli == NULL) { + if (!(*state->place)) { + ++state->optind; + } + if (state->opterr) { + (void)fprintf(stderr, "%s: illegal option -- %c\n", __FILE__, + state->optopt); + } + return BADCH; + } + + /* don't need argument */ + if (*++oli != ':') { + state->optarg = NULL; + if (!*state->place) { + ++state->optind; } - else { /* need an argument */ - if (*place) /* no white space */ - optarg = place; - else if (nargc <= ++optind) { /* no arg */ - place = EMSG; - if (*ostr == ':') - return (BADARG); - if (opterr) - (void)fprintf(stderr, - "%s: option requires an argument -- %c\n", - __FILE__, optopt); - return (BADCH); - } - else /* white space */ - optarg = nargv[optind]; - place = EMSG; - ++optind; + } else { + /* need an argument */ + if (*state->place) { /* no white space */ + state->optarg = state->place; + } else if (state->argc <= ++state->optind) { /* no arg */ + state->place = EMSG; + if (*ostr == ':') { + return BADARG; + } + if (state->opterr) { + (void)fprintf(stderr, "%s: option requires an argument -- %c\n", + __FILE__, state->optopt); + } + return BADARG; + } else { /* white space */ + state->optarg = state->argv[state->optind]; } - return (optopt); /* dump back option letter */ + state->place = EMSG; + ++state->optind; + } + return state->optopt; /* dump back option letter */ } diff --git a/deps/cares/src/tools/ares_getopt.h b/deps/cares/src/tools/ares_getopt.h index 7f06e7e09a88fe..a14f7ab42d41f7 100644 --- a/deps/cares/src/tools/ares_getopt.h +++ b/deps/cares/src/tools/ares_getopt.h @@ -33,23 +33,17 @@ */ -int ares_getopt(int nargc, char * const nargv[], const char *ostr); +typedef struct { + const char *optarg; /* argument associated with option */ + int optind; /* index into parent argv vector */ + int opterr; /* if error message should be printed */ + int optopt; /* character checked for validity */ + const char *place; + int argc; + const char **argv; +} ares_getopt_state_t; -#undef optarg -#undef optind -#undef opterr -#undef optopt -#undef optreset - -#define optarg ares_optarg -#define optind ares_optind -#define opterr ares_opterr -#define optopt ares_optopt -#define optreset ares_optreset - -extern char *optarg; -extern int optind; -extern int opterr; -extern int optopt; +void ares_getopt_init(ares_getopt_state_t *state, int argc, const char **argv); +int ares_getopt(ares_getopt_state_t *state, const char *ostr); #endif /* ARES_GETOPT_H */ diff --git a/doc/contributing/maintaining/maintaining-dependencies.md b/doc/contributing/maintaining/maintaining-dependencies.md index 79f331267232d1..21956ed584d73e 100644 --- a/doc/contributing/maintaining/maintaining-dependencies.md +++ b/doc/contributing/maintaining/maintaining-dependencies.md @@ -12,7 +12,7 @@ This a list of all the dependencies: * [ada 2.7.4][] * [base64 0.5.1][] * [brotli 1.0.9][] -* [c-ares 1.20.1][] +* [c-ares 1.23.0][] * [cjs-module-lexer 1.2.2][] * [corepack][] * [googletest 116b7e5][] @@ -168,7 +168,7 @@ length-delimited strings. The [brotli](https://github.com/google/brotli) dependency is used for the homonym generic-purpose lossless compression algorithm. -### c-ares 1.20.1 +### c-ares 1.23.0 The [c-ares](https://github.com/c-ares/c-ares) is a C library for asynchronous DNS requests. @@ -328,7 +328,7 @@ performance improvements not currently available in standard zlib. [ada 2.7.4]: #ada-274 [base64 0.5.1]: #base64-051 [brotli 1.0.9]: #brotli-109 -[c-ares 1.20.1]: #c-ares-1201 +[c-ares 1.23.0]: #c-ares-1230 [cjs-module-lexer 1.2.2]: #cjs-module-lexer-122 [corepack]: #corepack [dependency-update-action]: ../../../.github/workflows/tools.yml