On Thu, Mar 31, 2005 at 09:11:36AM +0200, Carlo Contavalli wrote:
>
> [...]
>
as usual, I forgot the attachment. Here it is..

Cheers, 
Carlo

-- 
  GPG Fingerprint: 2383 7B14 4D08 53A4 2C1A CA29 9E98 5431 1A68 6975
                        -------------
Old mail has arrived.
diff -x configure -x config.h.in -x 'config.h.in~' -Naur 
./dpkg-1.10.27/configure.in ./dpkg-1.10.27.cc/configure.in
--- ./dpkg-1.10.27/configure.in 2005-02-10 16:25:43.000000000 +0100
+++ ./dpkg-1.10.27.cc/configure.in      2005-03-30 00:40:37.000000000 +0200
@@ -175,6 +175,8 @@
 AC_CHECK_FUNCS(vsnprintf lchown snprintf)
 AC_CHECK_HEADERS(sys/cdefs.h syslog.h stddef.h)
 AC_CHECK_HEADERS(error.h locale.h)
+AC_CHECK_FUNCS(setrlimit getrlimit)
+AC_CHECK_HEADERS(sys/time.h sys/resource.h unistd.h)
 AC_DECL_SYS_SIGLIST
 AC_CHECK_LIB(ihash, ihash_create, SSD_LIBS="-lihash $SSD_LIBS")
 AC_CHECK_LIB(ps, proc_stat_list_create, SSD_LIBS="-lps $SSD_LIBS")
diff -x configure -x config.h.in -x 'config.h.in~' -Naur 
./dpkg-1.10.27/utils/start-stop-daemon.c 
./dpkg-1.10.27.cc/utils/start-stop-daemon.c
--- ./dpkg-1.10.27/utils/start-stop-daemon.c    2005-02-10 16:24:18.000000000 
+0100
+++ ./dpkg-1.10.27.cc/utils/start-stop-daemon.c 2005-03-30 03:03:42.000000000 
+0200
@@ -90,6 +90,21 @@
 #  include <error.h>
 #endif
 
+  /* setrlimit */
+#ifndef SSD_SETRLIMIT_PATH 
+#  define SSD_SETRLIMIT_PATH "/etc/limits"
+#endif
+
+#if defined(HAVE_SYS_TIME_H) && defined(HAVE_SYS_RESOURCE_H) && \
+    defined(HAVE_UNISTD_H) && defined(HAVE_SETRLIMIT) && 
defined(HAVE_GETRLIMIT)
+
+#  define SSD_SETRLIMIT 1
+
+#  include <sys/time.h>
+#  include <sys/resource.h>
+#endif
+
+
 static int testmode = 0;
 static int quietmode = 0;
 static int exitnodo = 1;
@@ -943,6 +958,272 @@
 }
 #endif /* OShpux */
 
+#ifdef SSD_SETRLIMIT
+static int
+do_getlimit(FILE * f, char ch, int * resource, const char ** rname) {
+  switch(ch) {
+    default:
+      break;
+
+      /* as */ 
+    case 'a':
+      if(fgetc(f) == 's') {
+       *resource=RLIMIT_AS;
+       *rname="as";
+       return 1; 
+      }
+      break;
+
+    case 'c':
+      /* core */ 
+      if((ch=fgetc(f)) == 'o' && fgetc(f) == 'r' && fgetc(f) == 'e') {
+       *resource=RLIMIT_CORE;
+       *rname="core";
+       return 1;
+      } 
+
+      /* cpu */
+      if(ch == 'p' && fgetc(f) == 'u') {
+       *resource=RLIMIT_CPU;
+       *rname="cpu";
+       return 1;
+      }
+      break;
+
+      /* data */ 
+    case 'd':
+      if(fgetc(f) == 'a' && fgetc(f) == 't' && fgetc(f) == 'a') {
+       *resource=RLIMIT_DATA;
+       *rname="data";
+       return 1;
+      }
+      break;
+
+    case 'f':
+      if(fgetc(f) == 's' && fgetc(f) == 'i' && fgetc(f) == 'z' && fgetc(f) == 
'e') {
+       *resource=RLIMIT_FSIZE;
+       *rname="fsize";
+       return 1;
+      }
+      break;
+
+      /* locks */ 
+    case 'l':
+      if(fgetc(f) == 'o' && fgetc(f) == 'c' && fgetc(f) == 'k' && fgetc(f) == 
's') {
+       *resource=RLIMIT_LOCKS;
+       *rname="locks";
+       return 1;
+      }
+      break;
+
+      /* memlock */ 
+    case 'm':
+      if(fgetc(f) == 'e' && fgetc(f) == 'm' && fgetc(f) == 'l' && 
+        fgetc(f) == 'o' && fgetc(f) == 'c' && fgetc(f) == 'k') {
+       *resource=RLIMIT_MEMLOCK;
+       *rname="memlock";
+       return 1;
+      }
+      break;
+
+      /* nofile */ 
+    case 'n':
+      if((ch=fgetc(f)) == 'o' && fgetc(f) == 'f' && fgetc(f) == 'i' && 
+        fgetc(f) == 'l' && fgetc(f) == 'e') {
+#if defined(OSOpenBSD) || defined(OSFreeBSD) || defined(OSNetBSD)
+       *resource=RLIMIT_OFILE;
+#else
+       *resource=RLIMIT_NOFILE;
+#endif
+
+       *rname="nofile";
+       return 1;
+      }
+
+      /* nproc */ 
+      if(ch == 'p' && fgetc(f) == 'r' && fgetc(f) == 'o' && fgetc(f) == 'c') {
+       *resource=RLIMIT_NPROC;
+       *rname="nproc";
+       return 1;
+      }
+      break;
+
+      /* rss */
+    case 'r':
+      if(fgetc(f) == 's' && fgetc(f) == 's') {
+       *resource=RLIMIT_RSS;
+       *rname="rss";
+       return 1;
+      }
+      break;
+
+      /* stack */ 
+    case 's':
+      if(fgetc(f) == 't' && fgetc(f) == 'a' &&
+        fgetc(f) == 'c' && fgetc(f) == 'k') {
+       *resource=RLIMIT_STACK;
+       *rname="stack";
+       return 1;
+      }
+      break;
+  }
+
+  return 0;
+}
+
+
+static void
+do_loadlimits(void) 
+{
+  char * look=execname;
+
+  FILE * f;
+  char * name;
+  char * path;
+
+  char * lname;
+  struct rlimit limit;
+  rlim_t *lvalue;
+  unsigned long value;
+  int resource;
+
+
+  int line=1;
+  int ch;
+
+    /* Return immediately if we have nothing
+     * to run */
+  if(!look) {
+    if(!startas)
+      return;
+
+    look=startas;
+  }
+
+    /* Calculate name of configuration file */
+  name=strrchr(look, '/');
+  if(name)
+    name=name+1;
+  else
+    name=look;
+
+    /* Calculate name of the file to be read */
+  path=xmalloc(sizeof(SSD_SETRLIMIT_PATH)+strlen(name)+1);
+  sprintf(path, SSD_SETRLIMIT_PATH "/%s", name);
+
+    /* name of file/path to open */ 
+  f=fopen(path, "r");
+  if(!f) {
+    if(errno == ENOENT) {
+      if(quietmode < 0)
+        printf("%s: not loading limits -- missing file '%s'\n", name, path);
+      free(path);
+      return;
+    }
+
+    if(quietmode <= 0)
+      printf("%s: couldn't open limits file -- %s\n", name, strerror(errno)); 
+    free(path);
+    return;
+  }
+
+    /* Ok, file has been opened, read limits */
+  while(1) {
+
+      /* Skip blanks */
+    while((ch=fgetc(f)) != EOF && (ch == '\t' || ch == ' ' || ch == '\n'))  {
+      if(ch == '\n')
+       line++;
+    }
+      
+      /* Check if we found a comment */
+    if(ch == '#') {
+      while((ch=fgetc(f)) != EOF && ch != '\n')
+       ;
+
+      if(ch == '\n')
+       line++;
+
+      continue;
+    }
+
+      /* Verify we didn't reach EOF */
+    if(ch == EOF) {
+      free(path);
+      return;
+    }
+
+      /* Get limit type */
+    if(do_getlimit(f, ch, &resource, (const char **)&lname)) {
+        /* Skip any blank */
+      while((ch=fgetc(f)) != EOF && (ch == '\t' || ch == ' ')) 
+       ;
+
+        /* Set limit kind */
+      lvalue=NULL;
+      if(ch == 's' && fgetc(f) == 'o' && fgetc(f) == 'f' && fgetc(f) == 't')
+       lvalue=&(limit.rlim_cur);
+      else
+       if(ch == 'h' && fgetc(f) == 'a' && fgetc(f) == 'r' && fgetc(f) == 'd')
+         lvalue=&(limit.rlim_max);
+
+        /* If we found some useful line value */
+      if(lvalue) {
+       while((ch=fgetc(f)) != EOF && (ch == ' ' || ch == '\t'))
+         ;
+
+         /* Try to get limit */
+       ungetc(ch, f);
+       if(fscanf(f, "%lu", &value) == 1) {
+         if(!getrlimit(resource, &limit) == -1) {
+           if(quietmode <= 0)
+             printf("%s: getrlimit failed for %s (%s:%d): %s\n", name, lname, 
path, line, strerror(errno));
+           continue;
+         }
+
+           /* Verify SOFT limit is <= of the HARD limit */
+         *lvalue=(rlim_t)value;
+         if(lvalue == &limit.rlim_max && limit.rlim_cur > limit.rlim_max) {
+           if(quietmode < 0)
+             printf("%s: SOFT LIMIT was > than HARD LIMIT -- decreased to HARD 
LIMIT value on %s:%d (%s)\n",
+                  name, path, line, lname);
+
+           limit.rlim_cur=limit.rlim_max;
+         }
+
+             /* Skip Anything else until end of line */
+         while((ch=fgetc(f)) != EOF && ch != '\n')
+           ;
+         line++;
+
+         if(!setrlimit(resource, &limit) == -1) {
+           if(quietmode <= 0)
+             printf("%s: setrlimit failed for %s (%s:%d): %s\n", name, lname, 
path, line-1, strerror(errno));
+           continue;
+         } 
+
+         if(quietmode < 0)
+           printf("%s: setrlimit %s:%d: %s %s=%lu\n", name, path, line-1, 
lname, (lvalue == &(limit.rlim_cur) ? 
+                  "soft" : "hard"), value); 
+         continue;
+       }
+      }
+    }
+
+    /* Something wrong into configuration file */
+    if(quietmode <= 0)
+      printf("%s: parse error in limits file on %s:%d\n", name, path, line);
+
+      /* Skip line */
+    while((ch=fgetc(f)) != EOF && ch != '\n')
+      ;
+    ungetc(ch, f);
+  }
+
+    /* should never be reached */
+  return;
+}
+#endif
 
 static void
 do_findprocs(void)
@@ -1191,6 +1472,9 @@
                exit(i);
        }
 
+#ifdef SSD_SETRLIMIT 
+       do_loadlimits();
+#endif
        do_findprocs();
 
        if (found) {

Reply via email to