]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
fixup! WIP: Support new server connect syntax
authorArtem Boldariev <artem@boldariev.com>
Fri, 26 Nov 2021 19:38:10 +0000 (21:38 +0200)
committerArtem Boldariev <artem@boldariev.com>
Fri, 26 Nov 2021 19:43:32 +0000 (21:43 +0200)
bin/named/server.c
lib/dns/include/dns/peer.h
lib/dns/include/dns/transport.h
lib/dns/peer.c
lib/dns/transport.c

index 026b6ebe3d2c511734e4c810f1f6a1cb49ca7df3..72833569af10d52c5ffaf3828387c556942e595a 100644 (file)
@@ -1531,8 +1531,40 @@ configure_peer(const cfg_obj_t *cpeer, isc_mem_t *mctx, dns_peer_t **peerp) {
        obj = NULL;
        (void)cfg_map_get(cpeer, "connect", &obj);
        if (obj != NULL) {
+               dns_transport_t *transport = NULL;
+               const cfg_obj_t *obj_port = NULL, *obj_transport = NULL;
+               const char *transport_name = NULL;
+
                (void)dns_peer_setforcetcp(peer, false);
-               //(void)dns_peer_settransport(peer, DNS_TRANSPORT_TCP);
+               INSIST(cfg_obj_istuple(obj));
+
+               obj_transport = cfg_tuple_get(obj, "transport");
+               if (cfg_obj_isstring(obj_transport)) {
+                       transport_name = cfg_obj_asstring(obj_transport);
+
+                       if (strcasecmp(transport_name, "tcp") == 0) {
+                               transport = dns_transport_create(
+                                       DNS_TRANSPORT_TCP, mctx);
+                       } else if (strcasecmp(transport_name, "tls") == 0) {
+                               transport = dns_transport_create(
+                                       DNS_TRANSPORT_TLS, mctx);
+                       } else {
+                               INSIST(0);
+                               ISC_UNREACHABLE();
+                       }
+               }
+
+               obj_port = cfg_tuple_get(obj, "port");
+               if (cfg_obj_isuint32(obj_port)) {
+                       dns_transport_set_port(
+                               transport,
+                               (in_port_t)cfg_obj_asuint32(obj_port));
+               }
+
+               if (transport != NULL) {
+                       (void)dns_peer_settransport(peer, transport);
+                       dns_transport_detach(&transport);
+               }
        }
 
        obj = NULL;
index b08c9dd2813cdffbd1de95a91fd30fdb711dbc7f..5f270202029b6617c0b56f8589a161f07139bb45 100644 (file)
@@ -224,7 +224,7 @@ isc_result_t
 dns_peer_getednsversion(dns_peer_t *peer, uint8_t *ednsversion);
 
 isc_result_t
-dns_peer_settransport(dns_peer_t *peer, dns_transport_type_t type);
+dns_peer_settransport(dns_peer_t *peer, dns_transport_t *transport);
 
 isc_result_t
 dns_peer_gettransport(dns_peer_t *peer, dns_transport_t **transportp);
index f1a84c10c68fa1762645e93b50a765ee41ad83fe..539557e1a10917fe498df78d9a0856c08a99c042 100644 (file)
@@ -83,6 +83,12 @@ dns_transport_set_mode(dns_transport_t *transport, dns_http_mode_t mode);
  *\li  'transport' is of type DNS_TRANSPORT_HTTP (for endpoint or mode).
  */
 
+uint16_t
+dns_transport_get_port(const dns_transport_t *transport);
+
+void
+dns_transport_set_port(dns_transport_t *transport, const uint16_t port);
+
 void
 dns_transport_attach(dns_transport_t *source, dns_transport_t **targetp);
 /*%<
index ed7fe40d5ffbebc9be74ba406054e55e16a9569e..89bfd24853131e6a89409bb9708bfb915fbd7d41 100644 (file)
@@ -974,10 +974,10 @@ dns_peer_getednsversion(dns_peer_t *peer, uint8_t *ednsversion) {
 }
 
 isc_result_t
-dns_peer_settransport(dns_peer_t *peer, dns_transport_type_t type) {
+dns_peer_settransport(dns_peer_t *peer, dns_transport_t *transport) {
        REQUIRE(DNS_PEER_VALID(peer));
 
-       peer->transport = dns_transport_create(type, peer->mem);
+       dns_transport_attach(transport, &peer->transport);
        DNS_BIT_SET(TRANSPORT_BIT, &peer->bitflags);
        return (ISC_R_SUCCESS);
 }
index 19f038ec19b71d23d9ca3b9d19e9fec1d40457af..c846c3eeb57631cad982947eccf47aaedb6cdff9 100644 (file)
@@ -51,6 +51,7 @@ struct dns_transport {
                char *endpoint;
                dns_http_mode_t mode;
        } doh;
+       uint16_t port;
 };
 
 static void
@@ -291,6 +292,18 @@ dns_transport_find(const dns_transport_type_t type, const dns_name_t *name,
        return (transport);
 }
 
+uint16_t
+dns_transport_get_port(const dns_transport_t *transport) {
+       REQUIRE(VALID_TRANSPORT(transport));
+       return (transport->port);
+}
+
+void
+dns_transport_set_port(dns_transport_t *transport, const uint16_t port) {
+       REQUIRE(VALID_TRANSPORT(transport));
+       transport->port = port;
+}
+
 dns_transport_list_t *
 dns_transport_list_new(isc_mem_t *mctx) {
        dns_transport_list_t *list = isc_mem_get(mctx, sizeof(*list));