Blame SOURCES/xinetd-2.3.14-file-limit.patch

4a9f2a
diff -Nurp xinetd-2.3.14-orig/xinetd/attr.h xinetd-2.3.14-files/xinetd/attr.h
4a9f2a
--- xinetd-2.3.14-orig/xinetd/attr.h	2005-10-05 19:15:33.000000000 +0200
4a9f2a
+++ xinetd-2.3.14-files/xinetd/attr.h	2009-10-20 13:08:45.000000000 +0200
4a9f2a
@@ -61,12 +61,13 @@
4a9f2a
 #define A_DISABLED         43
4a9f2a
 #define A_MDNS             44
4a9f2a
 #define A_LIBWRAP          45
4a9f2a
+#define A_RLIMIT_FILES     46
4a9f2a
 
4a9f2a
 /*
4a9f2a
  * SERVICE_ATTRIBUTES is the number of service attributes and also
4a9f2a
  * the number from which defaults-only attributes start.
4a9f2a
  */
4a9f2a
-#define SERVICE_ATTRIBUTES      ( A_MDNS + 1 )
4a9f2a
+#define SERVICE_ATTRIBUTES      ( A_MDNS + 2 )
4a9f2a
 
4a9f2a
 /*
4a9f2a
  * Mask of attributes that must be specified.
4a9f2a
diff -Nurp xinetd-2.3.14-orig/xinetd/child.c xinetd-2.3.14-files/xinetd/child.c
4a9f2a
--- xinetd-2.3.14-orig/xinetd/child.c	2009-10-20 13:07:34.000000000 +0200
4a9f2a
+++ xinetd-2.3.14-files/xinetd/child.c	2009-10-20 13:10:16.000000000 +0200
4a9f2a
@@ -109,6 +109,10 @@ void exec_server( const struct server *s
4a9f2a
 
4a9f2a
 
4a9f2a
 #ifdef RLIMIT_NOFILE
4a9f2a
+   if ( SC_RLIM_FILES( scp ))
4a9f2a
+   {
4a9f2a
+      ps.ros.max_descriptors = SC_RLIM_FILES( scp );
4a9f2a
+   }
4a9f2a
    rl.rlim_max = rl.rlim_cur = ps.ros.max_descriptors ;
4a9f2a
    (void) setrlimit( RLIMIT_NOFILE, &rl ) ;
4a9f2a
 #endif
4a9f2a
diff -Nurp xinetd-2.3.14-orig/xinetd/parse.c xinetd-2.3.14-files/xinetd/parse.c
4a9f2a
--- xinetd-2.3.14-orig/xinetd/parse.c	2005-10-05 19:15:33.000000000 +0200
4a9f2a
+++ xinetd-2.3.14-files/xinetd/parse.c	2009-10-20 13:08:45.000000000 +0200
4a9f2a
@@ -92,6 +92,9 @@ static const struct attribute service_at
4a9f2a
 #ifdef RLIMIT_DATA
4a9f2a
    { "rlimit_data",    A_RLIMIT_DATA,    1,  rlim_data_parser       },
4a9f2a
 #endif
4a9f2a
+#ifdef RLIMIT_NOFILE
4a9f2a
+   { "rlimit_files",   A_RLIMIT_FILES,   1,  rlim_files_parser      },
4a9f2a
+#endif
4a9f2a
 #ifdef RLIMIT_RSS
4a9f2a
    { "rlimit_rss",     A_RLIMIT_RSS,     1,  rlim_rss_parser        },
4a9f2a
 #endif
4a9f2a
diff -Nurp xinetd-2.3.14-orig/xinetd/parsers.c xinetd-2.3.14-files/xinetd/parsers.c
4a9f2a
--- xinetd-2.3.14-orig/xinetd/parsers.c	2005-10-05 23:45:41.000000000 +0200
4a9f2a
+++ xinetd-2.3.14-files/xinetd/parsers.c	2009-10-20 13:08:45.000000000 +0200
4a9f2a
@@ -1415,6 +1415,29 @@ status_e rlim_data_parser( pset_h values
4a9f2a
 }
4a9f2a
 #endif
4a9f2a
 
4a9f2a
+#ifdef RLIMIT_NOFILE
4a9f2a
+status_e rlim_files_parser( pset_h values, 
4a9f2a
+                         struct service_config *scp, 
4a9f2a
+                         enum assign_op op )
4a9f2a
+{
4a9f2a
+   char *mem = (char *) pset_pointer( values, 0 ) ;
4a9f2a
+   const char *func = "rlim_files_parser" ;
4a9f2a
+
4a9f2a
+   if ( EQ( mem, "UNLIMITED" ) )
4a9f2a
+      SC_RLIM_FILES(scp) = (rlim_t)RLIM_INFINITY ;
4a9f2a
+   else
4a9f2a
+   {
4a9f2a
+      if ( get_limit ( mem, &SC_RLIM_FILES(scp)) )
4a9f2a
+      {
4a9f2a
+         parsemsg( LOG_ERR, func,
4a9f2a
+            "Max files limit is invalid: %s", mem ) ;
4a9f2a
+         return( FAILED ) ;
4a9f2a
+      }
4a9f2a
+   }
4a9f2a
+   return( OK ) ;
4a9f2a
+}
4a9f2a
+#endif
4a9f2a
+
4a9f2a
 #ifdef RLIMIT_RSS
4a9f2a
 status_e rlim_rss_parser( pset_h values, 
4a9f2a
                           struct service_config *scp, 
4a9f2a
diff -Nurp xinetd-2.3.14-orig/xinetd/parsers.h xinetd-2.3.14-files/xinetd/parsers.h
4a9f2a
--- xinetd-2.3.14-orig/xinetd/parsers.h	2005-10-05 19:15:33.000000000 +0200
4a9f2a
+++ xinetd-2.3.14-files/xinetd/parsers.h	2009-10-20 13:08:45.000000000 +0200
4a9f2a
@@ -57,6 +57,9 @@ status_e rlim_cpu_parser(pset_h, struct 
4a9f2a
 #ifdef RLIMIT_DATA
4a9f2a
 status_e rlim_data_parser(pset_h, struct service_config *, enum assign_op) ;
4a9f2a
 #endif
4a9f2a
+#ifdef RLIMIT_NOFILE
4a9f2a
+status_e rlim_files_parser(pset_h, struct service_config *, enum assign_op) ;
4a9f2a
+#endif
4a9f2a
 #ifdef RLIMIT_RSS
4a9f2a
 status_e rlim_rss_parser(pset_h, struct service_config *, enum assign_op) ;
4a9f2a
 #endif
4a9f2a
diff -Nurp xinetd-2.3.14-orig/xinetd/sconf.h xinetd-2.3.14-files/xinetd/sconf.h
4a9f2a
--- xinetd-2.3.14-orig/xinetd/sconf.h	2009-10-20 13:07:34.000000000 +0200
4a9f2a
+++ xinetd-2.3.14-files/xinetd/sconf.h	2009-10-20 13:08:45.000000000 +0200
4a9f2a
@@ -143,6 +143,7 @@ struct service_config
4a9f2a
    rlim_t               sc_rlim_as;
4a9f2a
    rlim_t               sc_rlim_cpu;
4a9f2a
    rlim_t               sc_rlim_data;
4a9f2a
+   rlim_t               sc_rlim_files;
4a9f2a
    rlim_t               sc_rlim_rss;
4a9f2a
    rlim_t               sc_rlim_stack;
4a9f2a
    mode_t               sc_umask;
4a9f2a
@@ -191,6 +192,7 @@ struct service_config
4a9f2a
 #define SC_RLIM_AS( scp )        (scp)->sc_rlim_as
4a9f2a
 #define SC_RLIM_CPU( scp )       (scp)->sc_rlim_cpu
4a9f2a
 #define SC_RLIM_DATA( scp )      (scp)->sc_rlim_data
4a9f2a
+#define SC_RLIM_FILES( scp )     (scp)->sc_rlim_files
4a9f2a
 #define SC_RLIM_RSS( scp )       (scp)->sc_rlim_rss
4a9f2a
 #define SC_RLIM_STACK( scp )     (scp)->sc_rlim_stack
4a9f2a
 #define SC_TYPE( scp )           (scp)->sc_type
4a9f2a
diff -Nurp xinetd-2.3.14-orig/xinetd/xinetd.conf.man xinetd-2.3.14-files/xinetd/xinetd.conf.man
4a9f2a
--- xinetd-2.3.14-orig/xinetd/xinetd.conf.man	2009-10-20 13:07:34.000000000 +0200
4a9f2a
+++ xinetd-2.3.14-files/xinetd/xinetd.conf.man	2009-10-20 13:08:45.000000000 +0200
4a9f2a
@@ -569,6 +569,12 @@ is implemented, it is more useful to set
4a9f2a
 rlimit_rss and rlimit_stack. This resource limit is only implemented on
4a9f2a
 Linux systems.
4a9f2a
 .TP
4a9f2a
+.B rlimit_files
4a9f2a
+Sets the maximum number of open files that the service may use.
4a9f2a
+One parameter is required, which is a positive integer representing
4a9f2a
+the number of open file descriptors. Practical limit of this number
4a9f2a
+is around 1024000.
4a9f2a
+.TP
4a9f2a
 .B rlimit_cpu
4a9f2a
 Sets the maximum number of CPU seconds that the service may use.
4a9f2a
 One parameter is required, which is either a positive integer representing