]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
4109. [port] linux: support reading the local port range from
authorMark Andrews <marka@isc.org>
Fri, 24 Apr 2015 22:25:42 +0000 (08:25 +1000)
committerMark Andrews <marka@isc.org>
Fri, 24 Apr 2015 22:25:42 +0000 (08:25 +1000)
                        net.ipv4.ip_local_port_range. [RT # 39379]

CHANGES
doc/arm/notes.xml
lib/isc/unix/net.c

diff --git a/CHANGES b/CHANGES
index effcf1e8b16cd9b09d5b1459534a58a1ffa62c7c..7633bded324246a3adb8eb670e9ba957f1a2d124 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+4109.  [port]          linux: support reading the local port range from
+                       net.ipv4.ip_local_port_range. [RT # 39379]
+
 4108.  [func]          An additional NXDOMAIN redirect method (option
                        "nxdomain-redirect") has been added, allowing
                        redirection to a specified DNS namespace instead
index 012bcf6dd836b34199b854e6fe34ee17aed9a362..2dea1edc9243c84ffddd4641f4c74809545f9085 100644 (file)
          to be configured on the server is now available.
        </para>
       </listitem>
+      <listitem>
+       <para>
+         Retrieving the local port range from net.ipv4.ip_local_port_range
+         on Linux is now supported.
+       </para>
+      </listitem>
     </itemizedlist>
   </sect2>
   <sect2 id="relnotes_bugs">
index 0fa038885ad2e08056f500efa112049cf0ee2ab4..9bcd1892258b5e8b76f9d27802a7dd01a3c2a2c2 100644 (file)
@@ -778,12 +778,12 @@ getudpportrange_sysctl(int af, in_port_t *low, in_port_t *high) {
                sysctlname_lowport = SYSCTL_V6PORTRANGE_LOW;
                sysctlname_hiport = SYSCTL_V6PORTRANGE_HIGH;
        }
-       portlen = sizeof(portlen);
+       portlen = sizeof(port_low);
        if (sysctlbyname(sysctlname_lowport, &port_low, &portlen,
                         NULL, 0) < 0) {
                return (ISC_R_FAILURE);
        }
-       portlen = sizeof(portlen);
+       portlen = sizeof(port_high);
        if (sysctlbyname(sysctlname_hiport, &port_high, &portlen,
                         NULL, 0) < 0) {
                return (ISC_R_FAILURE);
@@ -817,12 +817,12 @@ getudpportrange_sysctl(int af, in_port_t *low, in_port_t *high) {
                miblen = sizeof(mib_lo6) / sizeof(mib_lo6[0]);
        }
 
-       portlen = sizeof(portlen);
+       portlen = sizeof(port_low);
        if (sysctl(mib_lo, miblen, &port_low, &portlen, NULL, 0) < 0) {
                return (ISC_R_FAILURE);
        }
 
-       portlen = sizeof(portlen);
+       portlen = sizeof(port_high);
        if (sysctl(mib_hi, miblen, &port_high, &portlen, NULL, 0) < 0) {
                return (ISC_R_FAILURE);
        }
@@ -841,11 +841,34 @@ getudpportrange_sysctl(int af, in_port_t *low, in_port_t *high) {
 isc_result_t
 isc_net_getudpportrange(int af, in_port_t *low, in_port_t *high) {
        int result = ISC_R_FAILURE;
+#if !defined(USE_SYSCTL_PORTRANGE) && defined(__linux)
+       FILE *fp;
+#endif
 
        REQUIRE(low != NULL && high != NULL);
 
 #if defined(USE_SYSCTL_PORTRANGE)
        result = getudpportrange_sysctl(af, low, high);
+#elif defined(__linux)
+
+       UNUSED(af);
+
+       /*
+        * Linux local ports are address family agnostic.
+        */
+       fp = fopen("/proc/sys/net/ipv4/ip_local_port_range", "r");
+       if (fp != NULL) {
+               int n;
+               unsigned int l, h;
+
+               n = fscanf(fp, "%u %u", &l, &h);
+               if (n == 2 && (l & ~0xffff) == 0 && (h & ~0xffff) == 0) {
+                       *low = l;
+                       *high = h;
+                       result = ISC_R_SUCCESS;
+               }
+               fclose(fp);
+       }
 #else
        UNUSED(af);
 #endif