add an inetd_ipv6 mode
authorPierre Habouzit <madcoder@debian.org>
Mon, 24 Mar 2008 11:49:43 +0000 (12:49 +0100)
committerPierre Habouzit <madcoder@debian.org>
Mon, 24 Mar 2008 11:49:43 +0000 (12:49 +0100)
Signed-off-by: Pierre Habouzit <madcoder@debian.org>
debian/changelog
debian/patches/0007-xinetd-should-be-able-to-listen-on-IPv6-even-in-ine.patch [new file with mode: 0644]

index 15f9f77..95f4fd0 100644 (file)
@@ -1,3 +1,11 @@
+xinetd (1:2.3.14-6) unstable; urgency=low
+
+  * Add patch from David Madore so that xinetd groks an -inetd_ipv6 mode, that
+    works like -inetd_compat but also listen on IPv6 addresses.
+    (Closes: 472436).
+
+ -- Pierre Habouzit <madcoder@debian.org>  Mon, 24 Mar 2008 12:48:39 +0100
+
 xinetd (1:2.3.14-5) unstable; urgency=medium
 
   * woops fix wrong ordering of the sed arguments, thanks to madduck.
diff --git a/debian/patches/0007-xinetd-should-be-able-to-listen-on-IPv6-even-in-ine.patch b/debian/patches/0007-xinetd-should-be-able-to-listen-on-IPv6-even-in-ine.patch
new file mode 100644 (file)
index 0000000..2b76fe3
--- /dev/null
@@ -0,0 +1,110 @@
+From f44b218ccc779ab3f4aed072390ccf129d94b58d Mon Sep 17 00:00:00 2001
+From: David Madore <david@pleiades.stars>
+Date: Mon, 24 Mar 2008 12:45:36 +0100
+Subject: [PATCH] xinetd should be able to listen on IPv6 even in -inetd_compat mode
+
+xinetd does not bind to IPv6 addresses (and does not seem to have an
+option to do so) when used in -inetd_compat mode.  As current inetd's
+are IPv6-aware, this is a problem: this means xinetd cannot be used as
+a drop-in inetd replacement.
+
+The attached patch is a suggestion: it adds a -inetd_ipv6 global
+option that, if used, causes inetd-compatibility lines to have an
+implicit "IPv6" option.  Perhaps this is not the best solution, but
+there should definitely be a way to get inetd.conf to be read in
+IPv6-aware mode.
+---
+ xinetd/confparse.c |    1 +
+ xinetd/inet.c      |   17 +++++++++++++++++
+ xinetd/options.c   |    3 +++
+ xinetd/xinetd.man  |    6 ++++++
+ 4 files changed, 27 insertions(+), 0 deletions(-)
+
+diff --git a/xinetd/confparse.c b/xinetd/confparse.c
+index db9f431..d7b0bcc 100644
+--- a/xinetd/confparse.c
++++ b/xinetd/confparse.c
+@@ -40,6 +40,7 @@
+ #include "inet.h"
+ #include "main.h"
++extern int inetd_ipv6;
+ extern int inetd_compat;
+ /*
+diff --git a/xinetd/inet.c b/xinetd/inet.c
+index 8caab45..2e617ae 100644
+--- a/xinetd/inet.c
++++ b/xinetd/inet.c
+@@ -25,6 +25,8 @@
+ static psi_h iter ;
++extern int inetd_ipv6;
++
+ static int get_next_inet_entry( int fd, pset_h sconfs, 
+                           struct service_config *defaults);
+@@ -360,6 +362,21 @@ static int get_next_inet_entry( int fd, pset_h sconfs,
+          }
+          SC_SERVER_ARGV(scp)[u] = p;
+       }
++
++      /* Set the IPv6 flag if we were passed the -inetd_ipv6 option */
++      if ( inetd_ipv6 )
++      {
++         nvp = nv_find_value( service_flags, "IPv6" );
++         if ( nvp == NULL )
++         {
++            parsemsg( LOG_WARNING, func, "inetd.conf - Bad foo %s", name ) ;
++            pset_destroy(args);
++            sc_free(scp);
++            return -1;
++         }
++         M_SET(SC_XFLAGS(scp), nvp->value);
++      }
++
+       /* Set the reuse flag, as this is the default for inetd */
+       nvp = nv_find_value( service_flags, "REUSE" );
+       if ( nvp == NULL )
+diff --git a/xinetd/options.c b/xinetd/options.c
+index b058b6a..dc2f3a0 100644
+--- a/xinetd/options.c
++++ b/xinetd/options.c
+@@ -30,6 +30,7 @@ int logprocs_option ;
+ unsigned logprocs_option_arg ;
+ int stayalive_option=0;
+ char *program_name ;
++int inetd_ipv6 = 0 ;
+ int inetd_compat = 0 ;
+ int dont_fork = 0;
+@@ -128,6 +129,8 @@ int opt_recognize( int argc, char *argv[] )
+             fprintf(stderr, "\n");
+             exit(0);
+          }
++         else if ( strcmp ( &argv[ arg ][ 1 ], "inetd_ipv6" ) == 0 )
++            inetd_ipv6 = 1;
+          else if ( strcmp ( &argv[ arg ][ 1 ], "inetd_compat" ) == 0 )
+             inetd_compat = 1;
+       }
+diff --git a/xinetd/xinetd.man b/xinetd/xinetd.man
+index c76c3c6..c9dd803 100644
+--- a/xinetd/xinetd.man
++++ b/xinetd/xinetd.man
+@@ -106,6 +106,12 @@ This option causes xinetd to read /etc/inetd.conf in addition to the
+ standard xinetd config files.  /etc/inetd.conf is read after the
+ standard xinetd config files.
+ .TP
++.BI \-inetd_ipv6
++This option causes xinetd to bind to IPv6 (AF_INET6) addresses for
++inetd compatibility lines (see previous option).  This only affects
++how /etc/inetd.conf is interpreted and thus only has any effect if
++the \-inetd_compat option is also used.
++.TP
+ .BI \-cc " interval"
+ This option instructs
+ .B xinetd
+-- 
+1.5.5.rc0.127.gb4337
+