#include #include #include #include #include #include "iolib.h" #include "freedt.h" #include "config.h" const char *progname = "softlimit"; const char *proghelp = "Usage: softlimit [OPTIONS] command ...\n" "Run a command with soft limits set.\n\n" "-m N Limit DATA, STACK, MEMLOCK and AS\n" #if HAVE_DECL_RLIMIT_DATA "-d N Limit DATA\n" #endif #if HAVE_DECL_RLIMIT_STACK "-s N Limit STACK\n" #endif #if HAVE_DECL_RLIMIT_MEMLOCK "-l N Limit MEMLOCK\n" #endif #if HAVE_DECL_RLIMIT_AS "-a N Limit AS\n" #endif #if HAVE_DECL_RLIMIT_NOFILE "-o N Limit NOFILE\n" #endif #if HAVE_DECL_RLIMIT_NPROC "-p N Limit NPROC\n" #endif #if HAVE_DECL_RLIMIT_FSIZE "-f N Limit FSIZE\n" #endif #if HAVE_DECL_RLIMIT_CORE "-c N Limit CORE\n" #endif #if HAVE_DECL_RLIMIT_RSS "-r N Limit RSS\n" #endif #if HAVE_DECL_RLIMIT_CPU "-t N Limit CPU\n" #endif #if HAVE_DECL_RLIMIT_SBSIZE "-b N Limit SBSIZE\n" #endif #if HAVE_DECL_RLIMIT_VMEM "-v N Limit VMEM\n" #endif "(N above is limit, or \"=\" to use the hard limit.)\n"; void set(int resource, char *value) { struct rlimit lim; if (getrlimit(resource, &lim) < 0) die("failed to get limit"); if (strcmp(value, "=") == 0) { lim.rlim_cur = lim.rlim_max; } else { lim.rlim_cur = atoi(value); } if (setrlimit(resource, &lim) < 0) die("failed to set limit"); } int main(int argc, char **argv) { while (1) { int c = getopt(argc, argv, "+V?m:d:s:l:a:o:p:f:c:r:t:b:v:"); if (c == -1) break; switch (c) { case 'm': #if HAVE_DECL_RLIMIT_DATA set(RLIMIT_DATA, optarg); #endif #if HAVE_DECL_RLIMIT_STACK set(RLIMIT_STACK, optarg); #endif #if HAVE_DECL_RLIMIT_MEMLOCK set(RLIMIT_MEMLOCK, optarg); #endif #if HAVE_DECL_RLIMIT_AS set(RLIMIT_AS, optarg); #endif break; #if HAVE_DECL_RLIMIT_DATA case 'd': set(RLIMIT_DATA, optarg); break; #endif #if HAVE_DECL_RLIMIT_STACK case 's': set(RLIMIT_STACK, optarg); break; #endif #if HAVE_DECL_RLIMIT_MEMLOCK case 'l': set(RLIMIT_MEMLOCK, optarg); break; #endif #if HAVE_DECL_RLIMIT_AS case 'a': set(RLIMIT_AS, optarg); break; #endif #if HAVE_DECL_RLIMIT_NOFILE case 'o': set(RLIMIT_NOFILE, optarg); break; #endif #if HAVE_DECL_RLIMIT_NPROC case 'p': set(RLIMIT_NPROC, optarg); break; #endif #if HAVE_DECL_RLIMIT_FSIZE case 'f': set(RLIMIT_FSIZE, optarg); break; #endif #if HAVE_DECL_RLIMIT_CORE case 'c': set(RLIMIT_CORE, optarg); break; #endif #if HAVE_DECL_RLIMIT_RSS case 'r': set(RLIMIT_RSS, optarg); break; #endif #if HAVE_DECL_RLIMIT_CPU case 't': set(RLIMIT_CPU, optarg); break; #endif #if HAVE_DECL_RLIMIT_SBSIZE case 'b': set(RLIMIT_SBSIZE, optarg); break; #endif #if HAVE_DECL_RLIMIT_VMEM case 'v': set(RLIMIT_VMEM, optarg); break; #endif case 'V': version(); default: help(); } } if ((argc - optind) < 1) help(); execvp(argv[optind], &argv[optind]); die2(argv[optind], "unable to exec"); return 0; /* NOTREACHED */ }