]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
resloved: transaction - unify IPv4 and IPv6 sockets
authorTom Gundersen <teg@jklm.no>
Wed, 15 Jul 2015 16:48:17 +0000 (18:48 +0200)
committerTom Gundersen <teg@jklm.no>
Mon, 27 Jul 2015 17:52:48 +0000 (19:52 +0200)
A transaction can only have one socket at a time, so no need to distinguish these.

src/resolve/resolved-dns-scope.c
src/resolve/resolved-dns-transaction.c
src/resolve/resolved-dns-transaction.h

index 0aab1e35d34c1028c1e79c206c77aeebe8e58827..ce419f1a0414c7191b1d4d2673d3f7bccf3f130f 100644 (file)
@@ -162,12 +162,7 @@ int dns_scope_emit(DnsScope *s, DnsTransaction *t, DnsPacket *p, DnsServer **ser
                 if (p->size + UDP_PACKET_HEADER_SIZE > mtu)
                         return -EMSGSIZE;
 
-                if (family == AF_INET)
-                        fd = transaction_dns_ipv4_fd(t);
-                else if (family == AF_INET6)
-                        fd = transaction_dns_ipv6_fd(t);
-                else
-                        return -EAFNOSUPPORT;
+                fd = transaction_dns_fd(t);
                 if (fd < 0)
                         return fd;
 
index 3d46c99df85f26b74b7d93b7df29376e489006ca..4644f8a9e1bedb92255334b99c17af6da547282f 100644 (file)
@@ -39,10 +39,8 @@ DnsTransaction* dns_transaction_free(DnsTransaction *t) {
         dns_packet_unref(t->received);
         dns_answer_unref(t->cached);
 
-        sd_event_source_unref(t->dns_ipv4_event_source);
-        sd_event_source_unref(t->dns_ipv6_event_source);
-        safe_close(t->dns_ipv4_fd);
-        safe_close(t->dns_ipv6_fd);
+        sd_event_source_unref(t->dns_event_source);
+        safe_close(t->dns_fd);
 
         dns_server_unref(t->server);
         dns_stream_free(t->stream);
@@ -94,7 +92,7 @@ int dns_transaction_new(DnsTransaction **ret, DnsScope *s, DnsQuestion *q) {
         if (!t)
                 return -ENOMEM;
 
-        t->dns_ipv4_fd = t->dns_ipv6_fd = -1;
+        t->dns_fd = -1;
 
         t->question = dns_question_ref(q);
 
@@ -655,7 +653,7 @@ static int on_dns_packet(sd_event_source *s, int fd, uint32_t revents, void *use
         return 0;
 }
 
-int transaction_dns_ipv4_fd(DnsTransaction *t) {
+int transaction_dns_fd(DnsTransaction *t) {
         const int one = 1;
         int r;
 
@@ -663,59 +661,36 @@ int transaction_dns_ipv4_fd(DnsTransaction *t) {
         assert(t->scope);
         assert(t->scope->manager);
 
-        if (t->dns_ipv4_fd >= 0)
-                return t->dns_ipv4_fd;
+        if (t->dns_fd >= 0)
+                return t->dns_fd;
 
-        t->dns_ipv4_fd = socket(AF_INET, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
-        if (t->dns_ipv4_fd < 0)
+        t->dns_fd = socket(t->scope->family, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
+        if (t->dns_fd < 0)
                 return -errno;
 
-        r = setsockopt(t->dns_ipv4_fd, IPPROTO_IP, IP_PKTINFO, &one, sizeof(one));
-        if (r < 0) {
-                r = -errno;
-                goto fail;
+        switch (t->scope->family) {
+        case AF_INET:
+                r = setsockopt(t->dns_fd, IPPROTO_IP, IP_PKTINFO, &one, sizeof(one));
+                break;
+        case AF_INET6:
+                r = setsockopt(t->dns_fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &one, sizeof(one));
+                break;
+        default:
+                return -EAFNOSUPPORT;
         }
-
-        r = sd_event_add_io(t->scope->manager->event, &t->dns_ipv4_event_source, t->dns_ipv4_fd, EPOLLIN, on_dns_packet, t);
-        if (r < 0)
-                goto fail;
-
-        return t->dns_ipv4_fd;
-
-fail:
-        t->dns_ipv4_fd = safe_close(t->dns_ipv4_fd);
-        return r;
-}
-
-int transaction_dns_ipv6_fd(DnsTransaction *t) {
-        const int one = 1;
-        int r;
-
-        assert(t);
-        assert(t->scope);
-        assert(t->scope->manager);
-
-        if (t->dns_ipv6_fd >= 0)
-                return t->dns_ipv6_fd;
-
-        t->dns_ipv6_fd = socket(AF_INET6, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
-        if (t->dns_ipv6_fd < 0)
-                return -errno;
-
-        r = setsockopt(t->dns_ipv6_fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &one, sizeof(one));
         if (r < 0) {
                 r = -errno;
                 goto fail;
         }
 
-        r = sd_event_add_io(t->scope->manager->event, &t->dns_ipv6_event_source, t->dns_ipv6_fd, EPOLLIN, on_dns_packet, t);
+        r = sd_event_add_io(t->scope->manager->event, &t->dns_event_source, t->dns_fd, EPOLLIN, on_dns_packet, t);
         if (r < 0)
                 goto fail;
 
-        return t->dns_ipv6_fd;
+        return t->dns_fd;
 
 fail:
-        t->dns_ipv6_fd = safe_close(t->dns_ipv6_fd);
+        t->dns_fd = safe_close(t->dns_fd);
         return r;
 }
 
index 87f342ca1105ef402811437b807bc26a527d6958..1c8f82352afaeb79200348bb41e6a1edda9cd756 100644 (file)
@@ -61,11 +61,8 @@ struct DnsTransaction {
         sd_event_source *timeout_event_source;
         unsigned n_attempts;
 
-        int dns_ipv4_fd;
-        int dns_ipv6_fd;
-
-        sd_event_source *dns_ipv4_event_source;
-        sd_event_source *dns_ipv6_event_source;
+        int dns_fd;
+        sd_event_source *dns_event_source;
 
         /* the active server */
         DnsServer *server;
@@ -95,8 +92,7 @@ int dns_transaction_go(DnsTransaction *t);
 void dns_transaction_process_reply(DnsTransaction *t, DnsPacket *p);
 void dns_transaction_complete(DnsTransaction *t, DnsTransactionState state);
 
-int transaction_dns_ipv4_fd(DnsTransaction *t);
-int transaction_dns_ipv6_fd(DnsTransaction *t);
+int transaction_dns_fd(DnsTransaction *t);
 
 const char* dns_transaction_state_to_string(DnsTransactionState p) _const_;
 DnsTransactionState dns_transaction_state_from_string(const char *s) _pure_;