]> code.ossystems Code Review - openembedded-core.git/commitdiff
xinetd: add xinetd
authorYu Ke <ke.yu@intel.com>
Wed, 28 Jul 2010 03:34:32 +0000 (11:34 +0800)
committerRichard Purdie <rpurdie@linux.intel.com>
Thu, 19 Aug 2010 12:06:56 +0000 (13:06 +0100)
xinetd is highly configurable, modular and secure inetd. this commmit add xinetd 2.3.14.
The receipts is borrowed from OE, with following changes:
- upgrade the version from 2.3.13 to 2.3.14
- pick three patches from debian xinetd 2.3.14-7.

Signed-off-by: Yu Ke <ke.yu@intel.com>
meta-lsb/packages/xinetd/xinetd/Disable-services-from-inetd.conf-if-a-service-with-t.patch [new file with mode: 0644]
meta-lsb/packages/xinetd/xinetd/Various-fixes-from-the-previous-maintainer.patch [new file with mode: 0644]
meta-lsb/packages/xinetd/xinetd/xinetd-should-be-able-to-listen-on-IPv6-even-in-ine.patch [new file with mode: 0644]
meta-lsb/packages/xinetd/xinetd/xinetd.conf [new file with mode: 0644]
meta-lsb/packages/xinetd/xinetd/xinetd.init [new file with mode: 0644]
meta-lsb/packages/xinetd/xinetd_2.3.14.bb [new file with mode: 0644]

diff --git a/meta-lsb/packages/xinetd/xinetd/Disable-services-from-inetd.conf-if-a-service-with-t.patch b/meta-lsb/packages/xinetd/xinetd/Disable-services-from-inetd.conf-if-a-service-with-t.patch
new file mode 100644 (file)
index 0000000..8602a88
--- /dev/null
@@ -0,0 +1,84 @@
+From d588b6530e1382a624898b3f4307f636c72c80a9 Mon Sep 17 00:00:00 2001
+From: Pierre Habouzit <madcoder@debian.org>
+Date: Wed, 28 Nov 2007 10:13:08 +0100
+Subject: [PATCH] Disable services from inetd.conf if a service with the same id exists.
+
+  This way, if a service is enabled in /etc/xinetd* _and_ in
+/etc/inetd.conf, the one (even if disabled) from /etc/xinetd* takes
+precedence.
+
+Signed-off-by: Pierre Habouzit <madcoder@debian.org>
+---
+ xinetd/inet.c |   22 +++++++++++++++++++---
+ 1 files changed, 19 insertions(+), 3 deletions(-)
+
+diff --git a/xinetd/inet.c b/xinetd/inet.c
+index 1cb2ba2..8caab45 100644
+--- a/xinetd/inet.c
++++ b/xinetd/inet.c
+@@ -23,6 +23,8 @@
+ #include "parsesup.h"
+ #include "nvlists.h"
++static psi_h iter ;
++
+ static int get_next_inet_entry( int fd, pset_h sconfs, 
+                           struct service_config *defaults);
+@@ -32,12 +34,15 @@ void parse_inet_conf_file( int fd, struct configuration *confp )
+    struct service_config *default_config = CNF_DEFAULTS( confp );
+    
+    line_count = 0;
++   iter = psi_create (sconfs);
+    for( ;; )
+    {   
+       if (get_next_inet_entry(fd, sconfs, default_config) == -2)
+          break;
+    }
++
++   psi_destroy(iter);
+ }
+ static int get_next_inet_entry( int fd, pset_h sconfs, 
+@@ -46,7 +51,7 @@ static int get_next_inet_entry( int fd, pset_h sconfs,
+    char *p;
+    str_h strp;
+    char *line = next_line(fd);
+-   struct service_config *scp;
++   struct service_config *scp, *tmp;
+    unsigned u, i;
+    const char *func = "get_next_inet_entry";
+    char *name = NULL, *rpcvers = NULL, *rpcproto = NULL;
+@@ -405,7 +410,16 @@ static int get_next_inet_entry( int fd, pset_h sconfs,
+    SC_SPECIFY( scp, A_SOCKET_TYPE );
+    SC_SPECIFY( scp, A_WAIT );
+-   if( ! pset_add(sconfs, scp) )
++   for ( tmp = SCP( psi_start( iter ) ) ; tmp ; tmp = SCP( psi_next(iter)) ){
++      if (EQ(SC_ID(scp), SC_ID(tmp))) {
++         parsemsg(LOG_DEBUG, func, "removing duplicate service %s", SC_NAME(scp));
++         sc_free(scp);
++         scp = NULL;
++         break;
++      }
++   }
++
++   if( scp && ! pset_add(sconfs, scp) )
+    {
+       out_of_memory( func );
+       pset_destroy(args);
+@@ -414,7 +428,9 @@ static int get_next_inet_entry( int fd, pset_h sconfs,
+    }
+    pset_destroy(args);
+-   parsemsg( LOG_DEBUG, func, "added service %s", SC_NAME(scp));
++   if (scp) {
++      parsemsg( LOG_DEBUG, func, "added service %s", SC_NAME(scp));
++   }
+    return 0;
+ }
+-- 
+1.5.3.6.2040.g15e6
+
diff --git a/meta-lsb/packages/xinetd/xinetd/Various-fixes-from-the-previous-maintainer.patch b/meta-lsb/packages/xinetd/xinetd/Various-fixes-from-the-previous-maintainer.patch
new file mode 100644 (file)
index 0000000..d243692
--- /dev/null
@@ -0,0 +1,77 @@
+From a3410b0bc81ab03a889d9ffc14e351badf8372f1 Mon Sep 17 00:00:00 2001
+From: Pierre Habouzit <madcoder@debian.org>
+Date: Mon, 26 Nov 2007 16:02:04 +0100
+Subject: [PATCH] Various fixes from the previous maintainer.
+
+---
+ xinetd/child.c   |   20 +++++++++++++++++---
+ xinetd/service.c |    8 ++++----
+ 2 files changed, 21 insertions(+), 7 deletions(-)
+
+diff --git a/xinetd/child.c b/xinetd/child.c
+index 89ee54c..48e9615 100644
+--- a/xinetd/child.c
++++ b/xinetd/child.c
+@@ -284,6 +284,7 @@ void child_process( struct server *serp )
+    connection_s            *cp  = SERVER_CONNECTION( serp ) ;
+    struct service_config   *scp = SVC_CONF( sp ) ;
+    const char              *func = "child_process" ;
++   int                     fd, null_fd;
+    signal_default_state();
+@@ -296,9 +297,22 @@ void child_process( struct server *serp )
+    signals_pending[0] = -1;
+    signals_pending[1] = -1;
+-   Sclose(0);
+-   Sclose(1);
+-   Sclose(2);
++   if ( ( null_fd = open( "/dev/null", O_RDONLY ) ) == -1 )
++   {
++      msg( LOG_ERR, func, "open('/dev/null') failed: %m") ;
++      _exit( 1 ) ;
++   }
++
++   for ( fd = 0 ; fd <= MAX_PASS_FD ; fd++ )
++   {
++      if ( fd != null_fd && dup2( null_fd, fd ) == -1 )
++      {
++         msg( LOG_ERR, func, "dup2(%d, %d) failed: %m") ;
++         _exit( 1 ) ;
++      }
++   }
++   if ( null_fd > MAX_PASS_FD )
++      (void) Sclose( null_fd ) ;
+ #ifdef DEBUG_SERVER
+diff --git a/xinetd/service.c b/xinetd/service.c
+index 3d68d78..0132d6c 100644
+--- a/xinetd/service.c
++++ b/xinetd/service.c
+@@ -745,8 +745,8 @@ static status_e failed_service(struct service *sp,
+                return FAILED;
+             if ( last == NULL ) {
+-               last = SAIN( calloc( 1, sizeof(union xsockaddr) ) );
+-             SVC_LAST_DGRAM_ADDR(sp) = (union xsockaddr *)last;
++          SVC_LAST_DGRAM_ADDR(sp) =  SAIN( calloc( 1, sizeof(union xsockaddr) ) );
++          last = SAIN( SVC_LAST_DGRAM_ADDR(sp) );
+             }
+             (void) time( &current_time ) ;
+@@ -772,8 +772,8 @@ static status_e failed_service(struct service *sp,
+                return FAILED;
+           if( last == NULL ) {
+-               last = SAIN6(calloc( 1, sizeof(union xsockaddr) ) );
+-             SVC_LAST_DGRAM_ADDR( sp ) = (union xsockaddr *)last;
++          SVC_LAST_DGRAM_ADDR(sp) = SAIN6(calloc( 1, sizeof(union xsockaddr) ) );
++            last = SAIN6(SVC_LAST_DGRAM_ADDR(sp));
+             }
+             (void) time( &current_time ) ;
+-- 
+1.5.3.6.2040.g15e6
+
diff --git a/meta-lsb/packages/xinetd/xinetd/xinetd-should-be-able-to-listen-on-IPv6-even-in-ine.patch b/meta-lsb/packages/xinetd/xinetd/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
+
diff --git a/meta-lsb/packages/xinetd/xinetd/xinetd.conf b/meta-lsb/packages/xinetd/xinetd/xinetd.conf
new file mode 100644 (file)
index 0000000..9e6ea25
--- /dev/null
@@ -0,0 +1,11 @@
+# Simple configuration file for xinetd
+#
+# Some defaults, and include /etc/xinetd.d/
+
+defaults
+{
+
+
+}
+
+includedir /etc/xinetd.d
diff --git a/meta-lsb/packages/xinetd/xinetd/xinetd.init b/meta-lsb/packages/xinetd/xinetd/xinetd.init
new file mode 100644 (file)
index 0000000..26dbea7
--- /dev/null
@@ -0,0 +1,57 @@
+#!/bin/sh
+#
+# /etc/init.d/xinetd  --  script to start and stop xinetd.
+
+if test -f /etc/default/xinetd; then
+       . /etc/default/xinetd
+fi
+
+
+test -x /usr/sbin/xinetd || exit 0
+
+checkportmap () {
+  if grep "^[^ *#]" /etc/xinetd.conf | grep -q 'rpc/'; then
+    if ! rpcinfo -u localhost portmapper >/dev/null 2>&1; then
+      echo
+      echo "WARNING: portmapper inactive - RPC services unavailable!"
+      echo "    Commenting out or removing the RPC services from"
+      echo "    the /etc/xinetd.conf file will remove this message."
+      echo
+    fi
+  fi
+} 
+
+case "$1" in
+    start)
+        checkportmap
+       echo -n "Starting internet superserver: xinetd"
+       start-stop-daemon --start --quiet --background --exec /usr/sbin/xinetd -- -pidfile /var/run/xinetd.pid $XINETD_OPTS
+       echo "."
+       ;;
+    stop)
+       echo -n "Stopping internet superserver: xinetd"
+       start-stop-daemon --stop --signal 3 --quiet --exec /usr/sbin/xinetd
+       echo "."
+       ;;
+    reload)
+       echo -n "Reloading internet superserver configuration: xinetd"
+       start-stop-daemon --stop --signal 1 --quiet --exec /usr/sbin/xinetd
+       echo "."
+       ;;
+    force-reload)
+       echo "$0 force-reload: Force Reload is deprecated"
+       echo -n "Forcefully reloading internet superserver configuration: xinetd"
+       start-stop-daemon --stop --signal 1 --quiet --exec /usr/sbin/xinetd
+       echo "."
+       ;;
+    restart)
+       $0 stop
+       $0 start
+       ;;
+    *)
+       echo "Usage: /etc/init.d/xinetd {start|stop|reload|force-reload|restart}"
+       exit 1
+       ;;
+esac
+
+exit 0
diff --git a/meta-lsb/packages/xinetd/xinetd_2.3.14.bb b/meta-lsb/packages/xinetd/xinetd_2.3.14.bb
new file mode 100644 (file)
index 0000000..02e68f2
--- /dev/null
@@ -0,0 +1,47 @@
+DESCRIPTION = "Highly configurable, modular and secure inetd"
+HOMEPAGE = "http://www.xinetd.org"
+
+# xinetd is a BSD-like license
+LICENSE = "xinetd"
+LIC_FILES_CHKSUM = "file://COPYRIGHT;md5=8ad8615198542444f84d28a6cf226dd8"
+
+DEPENDS = ""
+PR ="r0"
+
+SRC_URI = "http://www.xinetd.org/xinetd-${PV}.tar.gz \
+      file://xinetd.init \
+      file://xinetd.conf \
+      file://Various-fixes-from-the-previous-maintainer.patch \
+      file://Disable-services-from-inetd.conf-if-a-service-with-t.patch \
+      file://xinetd-should-be-able-to-listen-on-IPv6-even-in-ine.patch \
+      "
+
+inherit autotools update-rc.d
+
+INITSCRIPT_NAME = "xinetd"
+INITSCRIPT_PARAMS = "defaults"
+
+EXTRA_OECONF="--disable-nls"
+
+do_configure() {
+       # Looks like configure.in is broken, so we are skipping
+       # rebuilding configure and are just using the shipped one
+       oe_runconf
+}
+
+INHIBIT_AUTO_STAGE = "1"
+
+do_install() {
+       # Same here, the Makefile does some really stupid things,
+       # but since we only want two files why not override
+       # do_install from autotools and doing it ourselfs?
+       install -d "${D}/usr/sbin"
+       install -d "${D}/etc/init.d"
+       install -d "${D}/etc/xinetd.d"
+       install -m 644 "${WORKDIR}/xinetd.conf" "${D}/etc"
+       install -m 755 "${WORKDIR}/xinetd.init" "${D}/etc/init.d/xinetd"
+       install -m 755 "${S}/xinetd/xinetd" "${D}/usr/sbin"
+       install -m 755 "${S}/xinetd/itox" "${D}/usr/sbin"
+}
+
+CONFFILES_${PN} = "${sysconfdir}/xinetd.conf"