| Upstream-Status: Pending [from other distro Debian] |
| |
| 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 |
| |