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) {