+struct rlimit_name {
+ const char *name;
+ int resource;
+};
+
+static const struct rlimit_name rlimit_names[] = {
+ { "as", RLIMIT_AS },
+ { "core", RLIMIT_CORE },
+ { "cpu", RLIMIT_CPU },
+ { "data", RLIMIT_DATA },
+ { "fsize", RLIMIT_FSIZE },
+ { "memlock", RLIMIT_MEMLOCK },
+ { "msgqueue", RLIMIT_MSGQUEUE },
+ { "nice", RLIMIT_NICE },
+ { "nofile", RLIMIT_NOFILE },
+ { "nproc", RLIMIT_NPROC },
+ { "rss", RLIMIT_RSS },
+ { "rtprio", RLIMIT_RTPRIO },
+ { "sigpending", RLIMIT_SIGPENDING },
+ { "stack", RLIMIT_STACK },
+ { NULL, 0 }
+};
+
+static void
+instance_limits(const char *limit, const char *value)
+{
+ int i;
+ struct rlimit rlim;
+
+ for (i = 0; rlimit_names[i].name != NULL; i++) {
+ if (strcmp(rlimit_names[i].name, limit))
+ continue;
+ if (!strcmp(value, "unlimited")) {
+ rlim.rlim_cur = RLIM_INFINITY;
+ rlim.rlim_max = RLIM_INFINITY;
+ }
+ else if (getrlimit(rlimit_names[i].resource, &rlim) ||
+ sscanf(value, "%lu %lu", &rlim.rlim_cur, &rlim.rlim_max) == 0)
+ return;
+ setrlimit(rlimit_names[i].resource, &rlim);
+ return;
+ }
+}
+