>
> I'm calling res_findzonecut2() in the following way:
>
> r = resfindzonecut2 (res, "120.40.64.in-addr.arpa", ns_c_in, RES_IPV4ONLY,
> zone_name, zone_size, NULL, 0);
>
> I just want to get the name of the zone that "120.40.64.in-addr.arpa" is
> part of.
>
> Unfortunately, the above call returns -1 and errno is set to EPROTOTYPE
> (Protocol wrong type for socket). I have no understanding of this error
> or how to work around it. Can anyone explain to me why the error is
> occuring and what I need to do in order to find the containing zone for
> "120.40.64.in-addr.arpa" ?


The nameservers for 120.40.64.in-addr.arpa are broken.
res_findzonecut2() detects that brokenness and aborts.

Mind you if you were to have provided a space to store
the addresses only the SOA query would have been made.

Bad response to NS query.

% dig ns 120.40.64.in-addr.arpa @ns1.netnation.com +dnssec +norec

; <<>> DiG 9.3.4-P1 <<>> ns 120.40.64.in-addr.arpa @ns1.netnation.com +dnssec +norec
; (1 server found)
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 13225
;; flags: qr aa; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;120.40.64.in-addr.arpa. IN NS

;; AUTHORITY SECTION:
120.40.64.in-addr.arpa. 86400 IN SOA ns1.netnation.com. hostmaster.netnation.com. 1123695064 28800 14400 604800 86400

;; Query time: 227 msec
;; SERVER: 204.174.223.1#53(204.174.223.1)
;; WHEN: Sat Aug 23 00:18:20 2008
;; MSG SIZE rcvd: 104

%

Initial run with debugging and no address records. This succeeds.

% env RES_OPTIONS=debug ./a.out
;; res_setoptions("debug", "env")..
;; debug
;; res_findzonecut: START dname='120.40.64.in-addr.arpa' class=IN, zsize=1024, naddrs=0
;; res_findzonecut: get the soa, and see if it has enough glue
;; res_nmkquery(QUERY, 120.40.64.in-addr.arpa., IN, SOA)
;; res_send()
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 37345
;; flags: rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0
;; QUERY SECTION:
;; 120.40.64.in-addr.arpa, type = SOA, class = IN

;; Querying server (# 1) address = 127.0.0.1
;; new DG socket
;; got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 37345
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2
;; QUERY SECTION:
;; 120.40.64.in-addr.arpa, type = SOA, class = IN

;; ANSWER SECTION:
120.40.64.in-addr.arpa. 1D IN SOA ns1.netnation.com. hostmaster.netnation.com. (
1123695064 ; serial
8H ; refresh
4H ; retry
1W ; expiry
1D ) ; minimum


;; AUTHORITY SECTION:
120.40.64.in-addr.arpa. 23h59m59s IN NS ns2.netnation.com.
120.40.64.in-addr.arpa. 23h59m59s IN NS ns1.netnation.com.

;; ADDITIONAL SECTION:
ns1.netnation.com. 1d23h38m13s IN A 204.174.223.1
ns2.netnation.com. 1d23h38m13s IN A 204.174.223.31

;; res_findzonecut: satisfy(ns1.netnation.com): 0
;; res_findzonecut: get the ns rrset and see if it has enough glue
;; res_nmkquery(QUERY, 120.40.64.in-addr.arpa, IN, NS)
;; res_send()
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 37346
;; flags: rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0
;; QUERY SECTION:
;; 120.40.64.in-addr.arpa, type = NS, class = IN

;; Querying server (# 1) address = 127.0.0.1
;; new DG socket
;; got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 37346
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0
;; QUERY SECTION:
;; 120.40.64.in-addr.arpa, type = NS, class = IN

;; AUTHORITY SECTION:
120.40.64.in-addr.arpa. 3H IN SOA ns1.netnation.com. hostmaster.netnation.com. (
1123695064 ; serial
8H ; refresh
4H ; retry
1W ; expiry
1D ) ; minimum


;; res_findzonecut: satisfy(ns1.netnation.com): 0
;; res_findzonecut: get the missing glue and see if it's finally enough
;; res_nmkquery(QUERY, ns2.netnation.com, IN, AAAA)
;; res_send()
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 37347
;; flags: rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0
;; QUERY SECTION:
;; ns2.netnation.com, type = AAAA, class = IN

;; Querying server (# 1) address = 127.0.0.1
;; new DG socket
;; got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 37347
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0
;; QUERY SECTION:
;; ns2.netnation.com, type = AAAA, class = IN

;; AUTHORITY SECTION:
netnation.com. 2h38m13s IN SOA ns1.netnation.com. hostmaster.netnation.com. (
2002090705 ; serial
3H ; refresh
30M ; retry
5w6d16h ; expiry
1D ) ; minimum


;; res_nmkquery(QUERY, ns1.netnation.com, IN, AAAA)
;; res_send()
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 37348
;; flags: rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0
;; QUERY SECTION:
;; ns1.netnation.com, type = AAAA, class = IN

;; Querying server (# 1) address = 127.0.0.1
;; new DG socket
;; got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 37348
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0
;; QUERY SECTION:
;; ns1.netnation.com, type = AAAA, class = IN

;; AUTHORITY SECTION:
netnation.com. 2h38m13s IN SOA ns1.netnation.com. hostmaster.netnation.com. (
2002090705 ; serial
3H ; refresh
30M ; retry
5w6d16h ; expiry
1D ) ; minimum


;; res_findzonecut: satisfy(ns1.netnation.com): 0
;; res_findzonecut: FINISH n=0 (OK)
0 120.40.64.in-addr.arpa
%

Second run fails due to cached self contradictory NXDOMAIN
record.

% env RES_OPTIONS=debug ./a.out
;; res_setoptions("debug", "env")..
;; debug
;; res_findzonecut: START dname='120.40.64.in-addr.arpa' class=IN, zsize=1024, naddrs=0
;; res_findzonecut: get the soa, and see if it has enough glue
;; res_nmkquery(QUERY, 120.40.64.in-addr.arpa., IN, SOA)
;; res_send()
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 17246
;; flags: rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0
;; QUERY SECTION:
;; 120.40.64.in-addr.arpa, type = SOA, class = IN

;; Querying server (# 1) address = 127.0.0.1
;; new DG socket
;; got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 17246
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0
;; QUERY SECTION:
;; 120.40.64.in-addr.arpa, type = SOA, class = IN

;; AUTHORITY SECTION:
120.40.64.in-addr.arpa. 2h59m51s IN SOA ns1.netnation.com. hostmaster.netnation.com. (
1123695064 ; serial
8H ; refresh
4H ; retry
1W ; expiry
1D ) ; minimum


;; res_findzonecut: get_soa: ns_samename() || !ns_samedomain('120.40.64.in-addr.arpa.', '120.40.64.in-addr.arpa')
;; res_findzonecut: FINISH n=-1 (Protocol wrong type for socket)
-1
%

Run with space to store the addresses of nameservers. This
succeeds with only one query.

% env RES_OPTIONS=debug ./a.out
;; res_setoptions("debug", "env")..
;; debug
;; res_findzonecut: START dname='120.40.64.in-addr.arpa' class=IN, zsize=1024, naddrs=10
;; res_findzonecut: get the soa, and see if it has enough glue
;; res_nmkquery(QUERY, 120.40.64.in-addr.arpa., IN, SOA)
;; res_send()
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27596
;; flags: rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0
;; QUERY SECTION:
;; 120.40.64.in-addr.arpa, type = SOA, class = IN

;; Querying server (# 1) address = 127.0.0.1
;; new DG socket
;; got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27596
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2
;; QUERY SECTION:
;; 120.40.64.in-addr.arpa, type = SOA, class = IN

;; ANSWER SECTION:
120.40.64.in-addr.arpa. 1D IN SOA ns1.netnation.com. hostmaster.netnation.com. (
1123695064 ; serial
8H ; refresh
4H ; retry
1W ; expiry
1D ) ; minimum


;; AUTHORITY SECTION:
120.40.64.in-addr.arpa. 23h59m59s IN NS ns1.netnation.com.
120.40.64.in-addr.arpa. 23h59m59s IN NS ns2.netnation.com.

;; ADDITIONAL SECTION:
ns1.netnation.com. 1d23h31m54s IN A 204.174.223.1
ns2.netnation.com. 1d23h31m54s IN A 204.174.223.31

;; res_findzonecut: add_addrs: 1
;; res_findzonecut: add_addrs: 1
;; res_findzonecut: satisfy(ns1.netnation.com): 2
;; res_findzonecut: FINISH n=2 (OK)
2 120.40.64.in-addr.arpa
%
--
Mark Andrews, ISC
1 Seymour St., Dundas Valley, NSW 2117, Australia
PHONE: +61 2 9871 4742 INTERNET: Mark_Andrews@isc.org